2013-05-10 79 views
5

我读过开源的C#代码,并有很多奇怪的语法(对我来说)。用于C#语言的'this'是什么?

他们申报方法的参数与关键字如下:

这个对象@object

是什么意思?

如果我删除“这个”关键词哪里是数据类型之前,然后将它的工作方式不同?

+3

C#有非常漂亮的语法,其实,如果你把它比作C++ 。 – 2013-05-10 12:33:43

回答

23

听起来像是Extension Method

@符号允许变量名是相同的C#关键字 - 我倾向于避免他们像瘟疫个人。

如果删除this关键字,它将不再是一个扩展方法,只是一个静态方法。根据调用代码的语法,它可能不再编译,例如:

public static class IntegerMethods 
{ 
    public static int Add(this int i, int value) 
    { 
     return i + value; 
    } 
} 

int i = 0; 

// This is an "extension method" call, and will only compile against extension methods. 
i = i.Add(2); 
// This is a standard static method call. 
i = IntegerMethods.Add(i, 2); 

编译器会简单地把所有“扩展方法调用”为标准的静态方法调用,在任何速度,但扩展方法调用将仍然只按照this type name语法针对有效的扩展方法工作。

一些准则

这些都是我自己的,但我觉得他们是有用的。

  • 的扩展方法可发现可能是一个问题,因此请留意您选择包含它们的命名空间。我们有下.NET命名空间,如System.Collections或者其他非常有用的东西。不太有用但其他“普通”的东西往往会在Extensions.<namespace of extended type>之下,因此通过惯例至少可以达到一致。
  • 尽量不要延长经常使用类型的范围很广,你不想MyFabulousExtensionMethod出现在object整个应用程序。如果您需要,无论是限制范围(命名空间)是非常具体,或旁路扩展方法和直接使用一个静态类 - 这些不会污染在IntelliSense类型的元数据。
  • 在扩展方法“这个”可以null(因为他们是如何编译成静态方法调用),所以要小心,不要认为“这种”不为空(从呼叫一侧这看起来像一个成功的方法调用一个空目标)。

这些都是可选的,并非详尽无遗,但我发现它们通常属于“良好”建议的旗帜。因人而异。

+0

我使用它们的唯一时间是扩展方法,以调用'this'参数'this'。虽然我得出的结论是“太可爱了”。 – 2013-05-10 12:34:43

+0

@MthetheWWatson,我只是调用'this'参数'self'。作品。 – 2013-05-10 12:36:42

+0

'meh'也可以作为“这个”的名字;-) – 2013-05-10 12:37:08

4

“此类型名称”语法用于扩展方法。

例如,如果我想一个UnCamelCase方法添加到字符串(这样我就可以做"HelloWorld".UnCamelCase()产生“你好World` - 我这样写:

public static string UnCamelCase(this string text) 
{ 
    /*match any instances of a lower case character followed by an upper case 
    * one, and replace them with the same characters with a space between them*/ 
    return Regex.Replace(text, "([a-z])([A-Z])", "$1 $2"); 
} 

this string text指的特定实例字符串,你正在使用和文本是它的标识。

的@语法允许中通常会保留的变量名。