目录

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;
     }
 }
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
tt5555555555554 分钟前
python文件打包无法导入ultralytics模块
开发语言·pytorch·笔记·python
刚入门的大一新生10 分钟前
C++初阶-类和对象(上)
开发语言·c++
遇见你的雩风16 分钟前
Java---抽象类与接口
java·开发语言
qq_2147826138 分钟前
Python Orange:托拉拽玩转机器学习、数据挖掘!
开发语言·python·数据分析
huofengfeihu1 小时前
【c】-include经典注入问题
c语言·开发语言
二川bro1 小时前
Vuex Actions 多参数传递的解决方案及介绍
开发语言·前端·javascript
dokii11 小时前
leetcode572 另一棵树的子树
java·开发语言·算法
知星小度S1 小时前
今天你学C++了吗?——map
开发语言·c++
江沉晚呤时1 小时前
深入探析C#设计模式:访问者模式(Visitor Pattern)的原理与应用
java·服务器·开发语言·数据库·.netcore
映秀小子1 小时前
C语言打印的坑
c语言·开发语言