随笔 - 44  文章 - 0 评论 - 8 阅读 - 63313

.net3.5,4.0中定义了Action关键字

 封装一个方法,该方法不具有参数并且不返回值。 

 

使用此委托以参数形式传递方法,不必显式定义一个封装无参数过程的委托。

若要引用无参数并返回值 的方法,请改用泛型 Func<TResult>委托。

复制代码
using System; using System.Windows.Forms;
public delegate void ShowValue();
public class Name {
   
private string instanceName;    public Name(string name)    {       this.instanceName = name;    }
   
public void DisplayToWindow()    {       MessageBox.Show(this.instanceName);
   }
}
public class testTestDelegate {
   
public static void Main()    {       Name testName = new Name("Koani");       ShowValue showMethod = testName.DisplayToWindow;
      showMethod();
   }
}
复制代码

 用Action委托:

 

复制代码
public class testTestDelegate
{
   
public static void Main()
   {
      Name testName 
= new Name("Koani");
      Action showMethod 
= testName.DisplayToWindow;
      showMethod();
   }
}
复制代码

用Action+匿名委托

复制代码
public class Anonymous
{
   
public static void Main()
   {
      Name testName 
= new Name("Koani");
      Action showMethod 
= delegate() { testName.DisplayToWindow();} ;
      showMethod();
   }
}
复制代码

用Action+Lambda 

复制代码
public class LambdaExpression
{
   
public static void Main()
   {
      Name testName 
= new Name("Koani");
      Action showMethod 
= () => testName.DisplayToWindow();
      showMethod();
   }
}
复制代码

 

那如果要传递的方法有参数怎么办,答案是用Action<T>

Action<T>有15个重载版本

同样Func<T>也有15个重载版本

 

复制代码
View Code 
    public delegate void ShowValue();
    
public delegate void ShowValueName(string msg);
    
public class CustomObj
    {
        
public void Display()
        {
            Console.Write(
"hello!");
            Console.Read();
        }

        
public void DisplayName(string name)
        {
            Console.Write(
"hello," + name);
            Console.Read();
        }
复制代码

 

复制代码
View Code 
using System;
using System.Collections.Generic;
using System.Text;

namespace ActionApp
{
    
class Program
    {
        
static void Main(string[] args)
        {
            CustomObj obj 
= new CustomObj();
            
//ShowValue sv = obj.Display;
            
//sv();

            Action a 
= obj.Display;
            a();

            
//Action a = delegate { obj.Display(); };
            
//a();

            
//Action a = () => obj.Display();
            
//a();

            
//ShowValueName svn = obj.DisplayName;
            
//svn("dd");

            
//Action<string> at = obj.DisplayName;
            
//at("dd");

            
//Action<string> at = delegate(string s) { obj.DisplayName(s);};
            
//at("dd");

            
//Action<string> at = s => obj.DisplayName(s);
            
//at("dd");
        }
    }
复制代码
posted on   visi  阅读(1892)  评论(0编辑  收藏  举报
编辑推荐:
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现
点击右上角即可分享
微信分享提示