C# Action和 Func的用法

C#中的数据类型 函数数据类型

Action 是一个数据类型 但是是没有返回值得函数数据类型

Func 用于指定一个有返回值的委托

cs 复制代码
  internal class Program
  {

      static void Main(string[] args)
      {
          TT.F1(NoVoid);
          TT.F2(Void1);
          

          Void2(() => { Console.WriteLine("Void2执行了"); });
      }
      static void NoVoid()
      {
         
      }
      static void Void1(int i)
      {
          Console.WriteLine("值是"+i);
      }
      static void Void2(Action act)
      {
          Console.WriteLine("正在执行Void2");
          act(); //回调 这个委托方法
      }
  }
  class TT
  {
     
      public static void F1(Action act) { }
      public static void F2(Action<int> act) { }
  }

delegate和Action的写法

delegate写法

cs 复制代码
 public delegate void MyDelegate(string str);

 static void Main(string[] args)
 {

     MyDelegate myDelegate = new MyDelegate(Sum);
     myDelegate("123");
 }
 static void  Sum(string str)
 {
     Console.WriteLine(str);
 }

修改为 Action写法

cs 复制代码
   static void Main(string[] args)
   {
       Action<int> i = Void1;
       i(5);
   }
  static void Void1(int i)
  {
      Console.WriteLine("i的值是"+i);
  }

Action的写法更简洁


Func

Func是有返回值的

Func<T1>(有返回值) --------T1为返回值的类型,无参数类型

Func<T1,T2>(有返回值)-----T1是参数类型,T2是返回值类型

Func<T1,T2,T3>(有返回值)--T1和T2是参数类型,T3是返回值类型

代码示例

cs 复制代码
internal class Program
{
    static void Main(string[] args)
    {
        Test.Fn1(fn1);
        Test.Fn2(fn2);
    }
    static int fn1()
    {
        return 12;
    }
    static string fn2(int a)
    {
        return "123456";
    }
}
class Test
{
    public static void Fn1(Func<int> fn) { }
    public static void Fn2(Func<int,string> fn) { }
}

Lambda表达式

cs 复制代码
 Func<int,int>fn3=y=>y;

 Action<int, int> fn2 = (int x, int y) =>
 {
     Console.WriteLine(x + y);
 };

Func和泛型委托(4种方法)

cs 复制代码
 delegate bool CallBack(string a);
 delegate bool CallBack<T>(T obj);
 internal class Program
 {
   
     static void Main(string[] args)
     {
         //查询是张字开头的
         string[] names = { "花木兰", "蒙恬", "白起", "张飞", "马超" };
         Console.WriteLine(Test.Main1(names, Fn1));
         Console.WriteLine(Test.Main2<string>(names, Fn1));
         Console.WriteLine(Test.Main3(names, Fn1));
         Console.WriteLine(Test.Main4<string>(names,Fn1));
         Console.WriteLine(Test.MyIndex(names,Fn1));
     }
     public static bool Fn1(string s)
     {
         return s.StartsWith("张");
     }
 }
 class Test
 {
     public static string Main1(string[] args,Func<string,bool>f)
     {
         for (int i = 0; i < args.Length; i++)
         {
             if(f(args[i]))
             {
                 return args[i];
             }
         }
         return default;
     }
     public static T Main2<T>(T[]args,Func<T,bool>f)
     {
         for(int i = 0;i < args.Length;i++)
         {
             if (f(args[i]))
             {
                 return args[i];
             }
         }
         return default;
     }
     public static string Main3(string[]args,CallBack f)
     {
         for (int i = 0; i < args.Length; i++)
         {
             if (f(args[i]))
             {
                 return args[i];
             }
         }
         return default;
     }
     public static T Main4<T>(T[]args,CallBack<T> f)
     {
         for (int i = 0; i < args.Length; i++)
         {
             if (f(args[i]))
             {
                 return args[i];
             }
         }
         return default(T);
     }
     public static int MyIndex(string[] arrs, Func<string, bool> f)
     {
         for (int i = 0; i < arrs.Length; i++)
         {
             if (f(arrs[i]))
             {
                 return i;
             }
         }
         return -1;
     }
 }
相关推荐
易只轻松熊16 分钟前
C++(21):fstream的读取和写入
开发语言·c++
重生之后端学习19 分钟前
02-前端Web开发(JS+Vue+Ajax)
java·开发语言·前端·javascript·vue.js
zimoyin20 分钟前
kotlin Android AccessibilityService 无障碍入门
android·开发语言·kotlin
编程乐趣1 小时前
5个yyds的.Net商城开源项目
开源·c#·.net
繁依Fanyi1 小时前
用 CodeBuddy 实现「IdeaSpark 每日灵感卡」:一场 UI 与灵感的极简之旅
开发语言·前端·游戏·ui·编辑器·codebuddy首席试玩官
DanmF--1 小时前
Protobuf协议生成和使用
网络·unity·c#·游戏引擎·游戏程序
duapple5 小时前
Golang基于反射的ioctl实现
开发语言·后端·golang
Dxy12393102165 小时前
Python 条件语句详解
开发语言·python
prinrf('千寻)7 小时前
MyBatis-Plus 的 updateById 方法不更新 null 值属性的问题
java·开发语言·mybatis
m0_555762907 小时前
Qt缓动曲线详解
开发语言·qt