精华内容
参与话题
问答
  • 匿名方法

    2018-07-29 14:13:37
    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading....namespace 匿名方法 { //自定义委托类型 delegate void DelOutput(string s); class Pr...
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 匿名方法
    {
        //自定义委托类型
        delegate void DelOutput(string s);
        class Program
        {
            static void NamedMethod(string k)  //与委托匹配的命名方法
            {
                Console.WriteLine(k);
            }
    
            static void Main(string[] args)
            {
                //委托的引用指向匿名方法delegate(string j){}
                DelOutput del = delegate(string j)
                {
                    Console.WriteLine(j);
                };
                del.Invoke("匿名方法被调用");  //委托对象调用匿名方法
                Console.WriteLine();
                del = NamedMethod;  //委托绑定到命名方法NamedMethod
                del("命名方法被调用");
    
                Console.ReadLine();
            }
        }
    }
    

     

    展开全文
  • 匿名方法

    2008-11-18 20:51:00
    C#2.0中,匿名方法是通过delegate来实现的,可以看成是delegate功能的一种扩展。delegate就如同一个盒子的模型,可以照模型复制一个盒子(产生对象),打上标签(对象名),装进东西(符合签名的方法),然后用它做...

     

     

    C#2.0中,匿名方法是通过delegate来实现的,可以看成是delegate功能的一种扩展。
    delegate就如同一个盒子的模型,可以照模型复制一个盒子(产生对象),打上标签(对象名),装进东西(符合签名的方法),然后用它做点什么.

    C#早期版本中delegate的用法:


    在C# 1.X中,只有一种方法可以实例化delegate,如同实例化对象一样,将一个符合delegate签名的方法作为参数传给delegate:
    delegate int Sample(int x, int y);

    class List1
    {
        
    static int Plus(int x, int y)
        {
            
    return x + y;
        }

        
    static string myField = "Hello";

        
    public static void Main()
        {
            Sample 
    = new Sample(List1.Plus);
            
    int result = f(23);
            System.Console.WriteLine(result);

            
    string refToMyField = List1.myField;
            System.Console.WriteLine(refToMyField);

            
    string variable = "polarlights";
            System.Console.WriteLine(variable);
        }
    }

    在List1类中,Sample委托的实例f引用了静态方法Plus(int x, int y).在C#2.0中,可以用匿名方法来实例化一个delegate

    匿名方法


    在C# 2.0中的匿名方法示例如下:

    delegate int Sample(int x, int y);

    class List2
    {
        
    static int Plus(int x, int y)
        {
            
    return x + y;
        }

        
    static string myField = "Hello";

        
    public static void Main()
        {
            Sample f 
    = new Sample(List2.Plus);
            
    int result = f(23);
            System.Console.WriteLine(result);

            
    string refToMyField = List2.myField;
            System.Console.WriteLine(refToMyField);

            
    string variable = "polarlights";     
            System.Console.WriteLine(variable);

            Sample anonymousFunction 
    = delegate(int x, int y) { return x * y; }; //匿名方法
            int dynamicResult = anonymousFunction(34);
            System.Console.WriteLine(dynamicResult);
        }
    }


    需要注意的是:
    1.在C#2.0中,delegate关键字有了新的意义,当编译器发现它出现在一个方法体内时(上例出现在Main()方法内),编译器会期望它后面出现一个匿名方法体(上例中是{return x*y})。
    2.可以将一个匿名方法赋给一个delegate实例(上例中赋给了Sample的实例anonymousFunction )
    3.可以这样理解为何称其为匿名方法:这个方法定义在一个现有方法的内部而且自己没有名字。我们可以调用它,因为一个delegate的实例引用了它

    另外,在匿名方法 Sample anonymousFunction = delegate(int x, int y) { return x * y; };中,只指定了参数类型,没有指定返回值的类型,因为编译器知道在Sample委托中定义的类型是int型,如果尝试将其改为:Sample anonymousFunction = delegate(int x, int y) { return "123"; };则编译器会提示"无法将匿名方法块转换为委托类型“Sample”,原因是块中的某些返回类型不能隐式转换为委托返回类型" 。

    匿名方法中的参数
    1.匿名方法可以接受实参,但什么都不做:

    delegate int Sample(int x, int y);

    class List3
    {
        
    public static void Main()
        {
            Sample anonymousFunction 
    = delegate(int x, int y)
            {
                
    return System.DateTime.Now.Millisecond;   // 表示当前时间的毫秒部分
       };
            
    int dynamicResult = anonymousFunction(34);
            System.Console.WriteLine(dynamicResult);   // 将显示当前时间的毫秒部分

      }
    }

     2.在匿名方法声明中可以将形参忽略,虽然其对应的delegate定义是有参数的:

    delegate int Sample(int x, int y);

    class List4

        
    public static void Main()
        {
            Sample anonymousFunction 
    = delegate     //忽略了参数

            {
                
    return System.DateTime.Now.Millisecond;   // 表示当前时间的毫秒部分
        };
           
    int dynamicResult = anonymousFunction(34);
            System.Console.WriteLine(dynamicResult);   // 将显示当前时间的毫秒部分

      }
    }

    3.在匿名方法声明中 ,要么使其形参为空,如同上例所示,要么使其形参完整,符合与其对应的delegate的定义。否则会出编译错误:

    delegate int Sample(int x, int y);
     
    class List5

    public static void Main()
        {
            Sample anonymousFunction 
    = delegate(int x)
            {
                
    return x * 2;
            };
        }
    }

    编译器会提示"法将匿名方法块转换为委托类型“Sample”,原因是指定块的参数类型与委托参数类型不匹配"

    匿名方法与泛型:
    如下所示,匿名方法也可以声明泛型参数<T>.一个带泛型参数的匿名方法可以赋给一个同类型的delegate实例,只需确保其符合delegate签名即可

    using System;
    class List6<T>
    {
        
    delegate void DelegateType(T t);
        
    internal void UneMethode(T t)
        {
            DelegateType delegateInstance 
    = delegate(T arg) { Console.WriteLine"Hello args:{0}"arg.ToString()); };
            delegateInstance(t);
        }
    }

    class Program
    {
        
    static void Main()
        {
            List6
    <double> inst = new List6<double>();
            inst.UneMethode(
    5.5);
            Console.ReadKey();
        }
    }

    该例中定义了一个泛型类List6,一个泛型委托DelegateType和一个泛型匿名方法(没有名字的东东),然后在Main()方法中实例化泛型类List6,类型指定为double型,将double型实参5.5传入内部泛型实例方法UneMethode中,该方法将一个泛型匿名方法赋给一个泛型委托DelegateType的实例,并用该实例调用泛型匿名方法。

    适用匿名方法的情形:
     个人认为,在需要调用一些小方法的时候,比较适合用匿名方法.比如下面的例子,在线程开始时调用匿名方法,显示当前线程哈希值和相关信息:

    using System;
    using System.Threading;
    class Program
    {
        
    static void Main()
        {
            Thread thread 
    = new Thread(delegate()                     
        //这里调用的是Thread类构造函数第一形态--ParameterizedThreadStart 委托,匿名方法代之
        //.NET Framework 2.0新增,详见MSDN 2005类库参考
            {                                                                                              
             Console.WriteLine("ThreadHashCode:{0} Hello"Thread.CurrentThread.GetHashCode());
            });
            thread.Start();
            Console.WriteLine("
    ThreadHashCode:{0} polarlights"Thread.CurrentThread.GetHashCode());
            Console.ReadKey();
        }
    }

     亦可用于事件的调用:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsApplication1
    {
        
    public partial class Form1 : Form
        {
            
    public Form1()
            {
                InitializeComponent();
                button1.Click 
    += delegate(object sender, EventArgs args)
                {
                    MessageBox.Show(
    "button1 Clicked");
                };
            }
        }
    }
    展开全文
  • 匿名方法、迭代器匿名方法、迭代器匿名方法、迭代器匿名方法、迭代器匿名方法、迭代器
  • C# 匿名方法

    2014-01-08 09:39:10
    匿名方法是在C#2.0时引入的,C#3.0中仍然可以使用。通常给委托对象赋值一个方法时,要先定义这个方法,然后把方法名赋给委托对象,使用匿名方法可以直接将代码块赋给委托对象,不需要方法名,所以称为匿名方法。这个...
    匿名方法是在C#2.0时引入的,C#3.0中仍然可以使用。通常给委托对象赋值一个方法时,要先定义这个方法,然后把方法名赋给委托对象,使用匿名方法可以直接将代码块赋给委托对象,不需要方法名,所以称为匿名方法。这个功能省去创建委托时想要传递给一个委托的小型代码块的一个额外的步骤。它也消除了类代码中小型方法的混乱。下面的代码说明使用匿名方法可以直接将代码块赋给委托对象,不需要方法名。
    class Program  
    	{ 
    		delegate void Mydelegate(string str);	//声明委托
     		static void Main(string[] args) 
    		{  
    			string str = "Hello,C# 3.0";	//声明一个字符串变量  
    			Mydelegate my = delegate(string s)	//使用匿名方法来使用委托 
    			 {
    				 //委托执行一个只有一个Console.WriteLine语句的方法。  
    				Console.WriteLine(s.ToUpper());	//将s转为大写字母后输出 
    			 };  
    			my(str);	//使用委托,调用匿名方法,将str转为大写后输出 
    		        Console.ReadLine(); 
     		} 
    	 }
     
    展开全文
  • C#的匿名方法就是这个方法你不知道这个方法的名字,它的调用方式是通过委托(方法的封装)来调用,所以创建也是通过委托来创建,可以形象的理解为封装到了委托中。 public class test:MonoBehaviour{ delegate ...

    C#的匿名方法就是这个方法你不知道这个方法的名字,它的调用方式是通过委托(方法的封装)来调用,所以创建也是通过委托来创建,可以形象的理解为封装到了委托中。

    public class test:MonoBehaviour{
    
        delegate void PrintMyNameHandler(string name);
        PrintMyNameHandler printMyName = delegate (string name)
            {
                Debug.Log("我的名字是" + name);
            };
        
        void Start(){
            printMyName("八歧大蛇");
    
        }
    
    }
            //这是错误的
            TaskDelegate de =new delegate(){ Debug.Log("HI"); }
            //这是对的
            TaskDelegate de2 = delegate () { Debug.Log("HI"); }
            //这是Lambda表达式
            TaskInfo ti = new TaskInfo(1, 3, () => { Debug.Log("hi"); });

    这样,我们就直接通过这个匿名委托printMyName来输入字的姓名。

    展开全文
  • C#匿名方法的用法

    千次阅读 2011-12-23 22:43:12
    匿名方法,是C#2.0的一个特点。最近看了一篇说的还挺详细的文章,修改了一下转了过来,并用程序调试了。这里对匿名方法的使用做了详细说明值的看看。  先看看MSDN对匿名方法的描述。  在2.0 之前的 C# 版本中,...
  • 匿名类+匿名方法

    2016-12-28 11:12:11
    匿名类 var people =new { Id=1, Name="张三", Age=25 }; Console.WriteLine("{0}号选手{1}今年已经{2}岁了",people.Id,people.Name,peo
  • 匿名类和匿名方法

    千次阅读 2010-04-29 15:46:00
    匿名类:•概念 –可以使用new { object initializer }或new[]{ object, …}来初始化一个匿名类或不确定类型的数组 –例如:var p1 = new { Id = 1, Name = “YJingLee”, Age = 22}p1是不存在的,没定义过的类型,...
  • C# 委托 事件 匿名方法

    千次阅读 2014-01-08 09:39:06
    ortant; margin-left: auto !important;" >(*) 委托ortant; margin-left: auto !important;" >从最简单的例子开始:ortant; font-size: 12px !important;" >ortant;" >namespaceortant;" > ConsoleApplication1{
  • C#匿名方法

    2012-02-22 13:30:41
    C#2.0引入了匿名方法。 如果使用匿名方法,则不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。即以前是委托调用一个方法,现在是直接将方法的代码块作为参数传给委托而不必调用方法,即匿名方法。 ...

空空如也

1 2 3 4 5 ... 20
收藏数 20,802
精华内容 8,320
关键字:

匿名方法