在静态类中的静态方法参数中使用它?

时间:2014-01-24 17:30:18

标签: c# static-methods

为什么我要在静态类的静态函数中使用'this'到参数中的对象?我的意思是使用这两种方法之间的真正区别吗?

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

3 个答案:

答案 0 :(得分: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

答案 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修饰符必须位于方法的第一个参数