2013-05-10 95 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指的特定實例字符串,你正在使用和文本是它的標識。

的@語法允許中通常會保留的變量名。