为什么我要在静态类的静态函数中使用'this'到参数中的对象?我的意思是使用这两种方法之间的真正区别吗?
public static class Extensions
{
public static string AsJson(this object obj)
public static string AsJson2(object obj)
}
答案 0 :(得分:5)
public static string AsJson(this object obj)
object
扩展方法被定义为静态方法,但是被调用 使用实例方法语法。他们的第一个参数指定哪个 类型方法操作,参数是前面的 这个修饰语。
您的其他方法只是一个简单的静态方法。
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
答案 1 :(得分:3)
第一个是扩展方法,而第二个只是一个静态方法。
区别在于如何调用它们:
object myObj = new object();
var result = myObj.AsJson();
var result2 = Extensions.AsJson2(myobj);
请注意,您也可以将第一个用作简单的静态方法:
var result3 = Extensions.AsJson(myObj);
基本上,它只是语法糖。编译后,第一个语句将转换为最后一个语句。
答案 2 :(得分:0)
在方法中的参数上使用this
会使其成为Extension Method。这意味着你可以这样做:
myObj.AsJson();
而不是:
Extensions.AsJson(myObj);
规则:
this
修饰符必须位于方法的第一个参数