Pregunta

Why should I use 'this' in static functions of static classes to objects in parameter? I mean is the real difference between using those 2 methods?

public static class Extensions
{
    public static string AsJson(this object obj)
    public static string AsJson2(object obj)
}
¿Fue útil?

Solución

public static string AsJson(this object obj)

Its is an Extension Method on type object

Extension methods are defined as static methods but are called by using instance method syntax. Their first parameter specifies which type the method operates on, and the parameter is preceded by the this modifier.

Your other method is just a simple static method.

public static string AsJson2(object obj)

Both of their calls would be like:

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 are called like instance method but the compiler actually translates into a call to Static method

However, the intermediate language (IL) generated by the compiler translates your code into a call on the static method.

So

string str = obj.AsJson(); 

Translates into

string str = Extensions.AsJson(obj);

That is why you can actually do:

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

Otros consejos

The first one is an extension method, whereas the second one is just a static method.

The difference is in how you can call them:

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

var result2 = Extensions.AsJson2(myobj);

Note that you can also use the first one as a simple static method:

var result3 = Extensions.AsJson(myObj);

Essentially, it's just syntactical sugar. Upon compilation, the first statement will be transformed into the last one.

Using this on a parameter in your method makes it an Extension Method. It means you can do this:

myObj.AsJson();

instead of this:

Extensions.AsJson(myObj);

Rules:

  • Extension methods must be declared as static methods in a static class
  • The this modifier must be on the first parameter of the method
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top