爲什麼要在靜態類的靜態函數中將'this'用於參數中的對象?我的意思是使用這兩種方法的真正區別?在靜態類的靜態方法的參數中使用它?
public static class Extensions
{
public static string AsJson(this object obj)
public static string AsJson2(object obj)
}
爲什麼要在靜態類的靜態函數中將'this'用於參數中的對象?我的意思是使用這兩種方法的真正區別?在靜態類的靜態方法的參數中使用它?
public static class Extensions
{
public static string AsJson(this object obj)
public static string AsJson2(object obj)
}
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
在你的方法參數使用this
使它成爲Extension Method 。這意味着你可以這樣做:
myObj.AsJson();
,而不是這樣的:
Extensions.AsJson(myObj);
規則:
this
修飾符必須在方法的第一個參數上第一個是擴展方法,而第二個只是一個靜態方法。
所不同的是,你可以怎麼稱呼他們:
object myObj = new object();
var result = myObj.AsJson();
var result2 = Extensions.AsJson2(myobj);
請注意,您也可以使用第一個作爲一個簡單的靜態方法:
var result3 = Extensions.AsJson(myObj);
從本質上講,它只是語法糖。彙編後,第一個聲明將被轉換爲最後一個聲明。
所以它更容易使用,或也有一些性能問題? – boski
這只是更容易使用。 –