C#学习日记25---匿名方法 与 Func委托 与 lambda表达式

       在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法(委托),而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。

匿名委托(方法):

匿名委托的叫法并不准确,准确的应该叫做匿名方法,(总之两者是一个意思啦)。前面  委托类型 
中我已经提到过,委托是用于引用与其具有相同标签的方法。换句话说,您可以使用委托对象调用可由委托引用的方法(参数是方法名)。而匿名方法则是将代码块作为委托参数(参数是实现功能的代码)通过使用匿名方法,由于您不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。

编辑匿名方法:

  匿名方法是直接挂载在委托内的代码块,还是得通过使用
delegate
关键字创建委托实例来声明。

    delegate void MyDelegate(int i); //声明一个委托

MyDelegate  my = delegate(int i){ /* 代码块*/ }; //通过创建一个委托实例来实现一个匿名方法 

匿名方法实例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    class Program
    { //声明一个委托
        delegate void MyDelegate(string str);
        //定义一个实名方法
        public static void fun(string str)
        {
            Console.WriteLine("这是一个 {0} 方法", str);
        }
        static void Main(string[] args)
        {
            //创建一个委托实例,里面包含一个匿名方法
            MyDelegate examp1 = delegate(string name)
            {
              Console.WriteLine("这是一个 {0} 方法",name); //代码块
            };
            examp1("匿名");  //调用匿名方法

            MyDelegate examp2 = new MyDelegate(fun); //在委托中实名注册一个fun命名方法
            examp2("实名");  //调用命名方法
        }
    }
}

结果:

匿名方法的参数的范围是“匿名方法块”。

如果目标在块外部,那么,在匿名方法块内使用跳转语句(如 goto、break 或 continue)是错误的。如果目标在块内部,在匿名方法块外部使用跳转语句(如goto、break
或continue)也是错误的。

Func<T,Tresult>委托:

以前我们使用delegate委托时必须的提前声明一个delegate类,然后向委托中注册方法,比如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    class Program
    {
        delegate string MyDelegate(string s);//声明委托
        public static string Toup(string str) //定义方法
        {
            return str.ToUpper();
        }
        static void Main(string[] args)
        {
            string str = "abc";

            MyDelegate my = Toup; //注册方法
            Console.WriteLine(my(str));//调用方法 结果 ABC

        }
    }
}

如果当条件不允许我们在程序中声明delegate类,但又需要使用委托时,我们该怎么办呢? 此时我们可以考虑使用Func委托。Func<string,string>在<>中最后的参数为返回值类型,前面的都是传入方法参数类型,作用与委托类似,但不需要声明,上面的例子改为Func委托:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    class Program
    {
        public static string Toup(string str) //定义方法
        {
            return str.ToUpper();
        }
        static void Main(string[] args)
        {
            string str = "abc";

            Func<string, string> change = Toup; //泛型委托
            Console.WriteLine(change(str));//调用方法 结果 ABC

        }
    }
}

对比下,两者结果一样,但Func却比Delegate简洁了很多,但是Delegate能够加载匿名方法,比如上面的例子我们使用匿名方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    class Program
    {
        delegate string MyDelegate(string s);//声明委托

        static void Main(string[] args)
        {
            string str = "abc";
            //创建匿名方法
            MyDelegate my = delegate(string s) { return s.ToUpper(); };
            Console.WriteLine(my(str)); //结果 ABC

        }
    }
}

Func也行吗? Func也是可以创建匿名方法的,同样的也不需要声明,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "abc";
            //创建匿名方法
            Func<string, string> change = delegate(string s) { return s.ToUpper(); };
            Console.WriteLine(change(str)); //结果 ABC

        }
    }
}

与上面的匿名方法对比我们发现,在创建匿名方法的时候两者都是通过 delegate 来实现的(还是用到了delegate),可不可以不用delegate ,不用它是可以的,这时我们需要学习lambda 表达式

lambda表达式:

Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名方法。
通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。若要创建 Lambda 表达式,需要在 Lambda 运算符
=> 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。 例如,lambda 表达式
x => x * x 指定名为
x 的参数并返回 x 的平方值。

所以上面的例子我们使用lambda 表达式创建匿名方法改为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "abc";
            //lambda 表达式
            Func<string, string> change = s => s.ToUpper(); //传入string 类型s 返回s.ToUpper();
            Console.WriteLine(change(str)); //结果 ABC

        }
    }
}

在delegate委托类型中,我们也可以使用lambda表达式创建匿名方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test1
{
    class Program
    {
        delegate string MyDelegate(string s);//声明委托

        static void Main(string[] args)
        {
            string str = "abc";
            //lambda 表达式
            MyDelegate my = s => s.ToUpper(); //传入string 类型s 返回s.ToUpper();
            Console.WriteLine(my(str)); //结果 ABC

        }
    }
}

感谢您的阅读,欢迎您的建议与评论^_^

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 04:02:51

C#学习日记25---匿名方法 与 Func委托 与 lambda表达式的相关文章

匿名方法是怎样演变到Lambda表达试过程

一.  "Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.Lambda表达式可以表示闭包(注意和数学传统意义上的不同). 二.下面代码演示怎么从一个匿名函数(方法) 推导出一个Lambda表达式: 1.首先通过一个匿名方法来创建委托实例,传入一个方法作为变量: public void Test() { Fun

十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

委托与Lambda表达式 1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树 一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来提供相同的功能, 它将方法作为对象封装起来,允许在"运行时"间接地绑定一个方法调用. 声明的委托相当于一种自定义的数据类型. 1.背景 冒泡排序 1 static class SimpleSort1 2 { 3 public static void BubbleSort(int[] items)

[深入学习C#] 匿名函数、委托和Lambda表达式

匿名函数 匿名函数(Anonymous Function)是表示"内联"方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托:如果是表达式树类型,则转换将计算以对象结构形式表示方法结构的表达式树.  匿名函数有两种语法风格:Lambda表达式(lambda-expression)和匿名方法表达式(anonymous-method-ex

C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法

使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委托 public delegate decimal MathOperation(decimal left, decimal right); //创建方法参数和返回结果符合委托的定义 public static decimal Add(decimal left, decimal right) { re

转载 C#匿名函数 委托和Lambda表达式

转载原出处: http://blog.csdn.net/honantic/article/details/46331875 匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取决于转换的目标类型:如果是委托类型,则转换计算为引用匿名函数所定义的方法的委托:如果是表达式树类型,则转换将计算以对象结构形式表示方法结构的表达式树.  匿名函数有两种语法风格

委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function<T>(T a, T b); 实现泛型委托的主体代码,并调用: public static string Add(string a, string b) { return string.Format("{0} #### {1}",a,b); } //实名委托方式 Function&

lambda表达式学习笔记(1) -- 作为委托的lambda表达式

C#中的Lambda表达式就是C# 2中匿名方法的演变,因此从一个匿名函数开始一步步简化写法. 例子是获取一个string参数,然后返回一个int. 首先匿名方法的写法如下: Func<string, int> returnLength; returnLength = delegate (string text) { return text.Length; }; Console.Write(returnLength("Hello")); lambda表达式最冗长的形式是:

委托、匿名委托和lambda表达式

1.委托 在.NET中,委托有点类似于C/C++中的函数指针,但与指针不同的是,委托是一种安全的类型,那么我们就以实现两个数的差为例,先声明一个成员方法: public int CompareTwoValue(int a, int b) { int c=a-b; return c; } 再声明一个委托: public delegate int deleMethod(int a,int b); 然后,我们可以通过这个委托调用这个上面的成员方法, 注意的一点是方法的参数类型和返回类型必须与委托的参数

C# 委托、Lambda表达式和事件——学习总结

1.概括 1.1.委托是寻址方法的.NET版本,类似C++中的指针.委托可以理解成指向函数的指针,它是类型安全的,定义了具体的参数和返回值. ——定义一个委托,实际上是定义一个类.委托是对方法的引用,如方法Func,把其功能交给委托的类来实现. ——委托的作用:结合泛型,可以实现功能上的扩展(如针对整型的函数,可以通过委托指向多种函数,实现类中某个属性的比较).Lambda表达式需要使用委托定义.事件需要使用到委托. 1.2.Lambda表达式与委托直接相关.Lambda表达式可以理解成一个简单