扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
可以看出对于每个我们想要提供的简单过滤准则,我们应该定义一个方法(静态或实例的)。这很快就搞乱了类的代码。而用匿名方法,代码变得相当自然。下面是这个Program类用匿名方法重写后的:
public class Program { public delegate void MyDelegate(); public static void Main(string[] args) { MyCollection objMyCol = new MyCollection(); objMyCol.ItemList.Add("Aditya"); objMyCol.ItemList.Add("Tanu"); objMyCol.ItemList.Add("Manoj"); objMyCol.ItemList.Add("Ahan"); objMyCol.ItemList.Add("Hasi"); //获得集合中以字母’A‘开头的字符项数组 string[] AStrings = objMyCol.GetFilteredItemArray(delegate(string sItem) { if (sItem[0] == ''A'') return true; else return false; }); Console.WriteLine("----- Strings starting with letter ''A'' -----"); foreach (string s in AStrings) { Console.WriteLine(s); } //获得集合中以字母’ T ‘开头的字符项数组 string[] TStrings = objMyCol.GetFilteredItemArray(delegate(string sItem) { if (sItem[0] == ''T'') return true; else return false; }); Console.WriteLine("----- Strings starting with letter ''T'' -----"); foreach (string s in TStrings) { Console.WriteLine(s); } } } |
正如上面示例中的所示,我们已能用内联代码块定义的过滤准则替代定义一个新的方法来代表每个过滤准则。老实说,用这种内联代码可能看起来自然并且避免了定义新方法,但是如果这个技术被用于更大的内联代码块,这时代码很快变得难于管理并可能导致代码重复。因此,使用方法与内联匿名方法都是委托/事件处理器的可选方案。
好了,这些就是匿名方法的基础。本文的余下部分将讨论在不同的场景下匿名方法内部如何工作的。理解匿名方法如何被实现和内部如何工作对于正确地使用它们是重要的。否则,你使用匿名方法的代码的结果看起来将不可预知。
匿名方法的静态数据成员的用法
匿名方法总是以一个delegate关键字开始,后面跟着用在方法和方法体(the method body)本身中的参数。正如从上面示例中所见,用户不需要确定匿名方法的返回类型。它(译注:指返回类型)由方法体中的return语句推断而来。.NET CLR不能执行像匿名方法一样的自由流(free flowing)代码块。CLR要求:它执行的每个方法是一个类型的一部分,并且应该是一个静态(static)方法或实例(instance)方法(译注:若一个方法声明中含有 static 修饰符,则称该方法为静态方法。若其中没有 static 修饰符时,则称该方法为实例方法。静态方法不对特定实例进行操作,在静态方法中引用 this 是编译时错误。实例方法对类的某个给定的实例进行操作,而且可以用 this来访问该实例)。因此当你在一个类的代码中写匿名方法并编译这个代码时,C#编译器默默地在你定义匿名方法的相同的类中创建了一个静态或实例方法。所以匿名方法只是一个在类中定义你自己方法以传递到委托(委托处理器/事件处理器)的方便的语法。
当你编译上面的示例时,C#编译器在类''Program''内部即我们定义匿名方法的地方创建了两个private static方法。它此时用这些static方法的地址取代了匿名方法。编译器决定如何创建静态方法或实例方法取决于匿名方法被定义的类中的静态或实例数据成员的用法。在我们的示例中,我们没有用到任何类''Program''的数据成员,因为调用一个静态方法而不是一个实例方法将是高效的,因此C#编译器创建一个static方法来封装我们的匿名方法的代码。下面是这个示例程序集''Program'' 类的ILDASM视图。高亮部分显示了由C#编译器默默添加到''Program''类的新的静态方法。
如果我们已经使用了用匿名方法的''Program'' 类的任何静态数据,C#编译器将仍然在''Program'' 类里创建一个静态方法来包装匿名方法。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者