为什么我们在扩展方法中使用“this”?
我要问,为什么我们在一个扩展方法的参数之前使用“this”关键字(C#语言)........... 这样的功能:为什么我们在扩展方法中使用“this”?
public static int ToInt(this string number)
{
return Int32.Parse(number);
}
我知道,我们必须使用它,但我不知道为什么。
因为这是您告诉编译器首先是扩展方法的方式。否则,它只是一个正常的静态方法。我想他们选择了this
,所以他们不必提出一个新的关键字,并可能破坏旧代码。
所以你不必像使用VB.Net那样用ExtensionAttribute来标记方法。 – 2010-04-04 12:10:34
C#有更美味的语法糖,这就是为什么我喜欢它。 – 2010-04-04 12:11:24
为了将方法识别为扩展方法。编译器如何知道?
它简单地将它标记为扩展方法,这是他们选择将格式定义为扩展方法的格式,而不是简单的静态方法(无论如何都是内部调用它)。这是仅适用于编译器(和intellisense),在您的代码编译下,就像直接调用静态方法一样。
此定义的方法:
public static int ToInt(string number) //non extension
需要加以区分从这个:
public static int ToInt(this string number) //extension
否则你必须包含在静态类中的每个静态方法中包含命名空间的智能感知,非常不可取的。
这只是选择用于表示扩展方法的语法。下面是C#和vb.net的扩展方法语法差异一个有趣的观点: Extension Method Implementation differences between C# and VB.NET
主要是因为它是怎么C# spec定义的扩展方法。 参见Section 10.6.9
10.6.9扩展方法
当一个方法 的第一参数包括此改性剂,该方法 被说成是一个扩展 方法。扩展方法只能在非通用非嵌套 静态类中声明的 。 扩展方法的第一个参数可以不包含 以外的其他修饰符,而 参数类型不能是指针 类型。
对于信息的this
这里上下文关键字的意义在很大程度上,它避免了引入新关键字。无论何时您引入新的关键字,都有可能会破坏将其用作变量/类型名称的代码。this
有一些有用的功能:
- 是足够来表明这涉及到一个实例方法
- 它现有的关键字...
- ...那会是非法接近当在该位置使用时
这意味着没有现有的代码将被破坏。
除了选择this
作为关键字之外,它只是编译器的一种方便的语法,比手动添加[Extension]
更方便。没有任何一个,它只是一个静态方法,没有任何特殊的行为。
我个人会偏好属性。类似于[Extends(typeof(foo)],然后有一个名为value的隐式变量,类似于properties。它会更具表现力,并且不需要重复使用现有的关键字。只是我个人的观点。 – John 2010-05-23 15:59:49
Scott Hanselman有一个很好的文章解释了这个“this”关键字的重要性。http://www.hanselman.com/blog/HowDoExtensionMethodsWorkAndWhyWasANewCLRNotRequired.aspx – Zaffiro 2010-04-04 12:17:20