2014-01-24 129 views
0

爲什麼要在靜態類的靜態函數中將'this'用於參數中的對象?我的意思是使用這兩種方法的真正區別?在靜態類的靜態方法的參數中使用它?

public static class Extensions 
{ 
    public static string AsJson(this object obj) 
    public static string AsJson2(object obj) 
} 

回答

5
public static string AsJson(this object obj) 

它是上型object

擴展方法被定義爲靜態方法,但使用實例方法語法通過 被稱爲Extension Method。他們的第一個參數指定該方法使用哪種類型,參數是,前面是 此修飾符

你的其他方法只是一個簡單的靜態方法。

public static string AsJson2(object obj) 

無論他們的電話是這樣的:

Object obj = new object(); 
string str = obj.AsJson(); //extension method called 

string str2 = Extensions.AsJson2(obj); //Normal static method called 

string str3 = Extensions.AsJson(obj); //extension method called like a normal static method 

Extension methods被稱爲像實例方法,但是編譯器實際上轉化爲調用靜態方法

然而,中間語言(IL)由編譯器 生成將您的代碼轉換爲靜態方法的調用。

所以

string str = obj.AsJson(); 

轉化爲

string str = Extensions.AsJson(obj); 

這就是爲什麼你實際上可以做:

object obj = null; 
obj.AsJosn(); //Would not result in NRE 
0

在你的方法參數使用this使它成爲Extension Method 。這意味着你可以這樣做:

myObj.AsJson(); 

,而不是這樣的:

Extensions.AsJson(myObj); 

規則:

  • 擴展方法必須聲明爲靜態類的靜態方法
  • this修飾符必須在方法的第一個參數上
+0

所以它更容易使用,或也有一些性能問題? – boski

+0

這只是更容易使用。 –

3

第一個是擴展方法,而第二個只是一個靜態方法。

所不同的是,你可以怎麼稱呼他們:

object myObj = new object(); 
var result = myObj.AsJson(); 

var result2 = Extensions.AsJson2(myobj); 

請注意,您也可以使用第一個作爲一個簡單的靜態方法:

var result3 = Extensions.AsJson(myObj); 

從本質上講,它只是語法糖。彙編後,第一個聲明將被轉換爲最後一個聲明。

相關問題