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;
     }
 }
相关推荐
m0_736919104 分钟前
C++中的委托构造函数
开发语言·c++·算法
lsx20240619 分钟前
Python3 SMTP发送邮件教程
开发语言
懈尘20 分钟前
从 Java 1.7 到 Java 21:逐版本深入解析新特性与平台演进
java·开发语言
凉辰23 分钟前
使用uni.createInnerAudioContext()播放指定音频(踩坑分享功能)
开发语言·javascript·音视频
hello 早上好24 分钟前
05_Java 类加载过程
java·开发语言
PPPPPaPeR.36 分钟前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法
橙露39 分钟前
Java并发编程进阶:线程池原理、参数配置与死锁避免实战
java·开发语言
froginwe1139 分钟前
C 标准库 - `<float.h>`
开发语言
2501_916008891 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
wxin_VXbishe1 小时前
C#(asp.net)学员竞赛信息管理系统-计算机毕业设计源码28790
java·vue.js·spring boot·spring·django·c#·php