Why can't the keyword this
be used in a static method? I am wondering why C# defines this constraint. What benefits can be gained by this constraint?
[Update]: Actually, this is a question I got in an interview. I do know the usage of 'static' and 'this', based on all your response, I guess I know a little of why the two can not be used together. That is, for static method is used to changed state or do something in a type level, but when you need to use 'this' means you want to change the state or do something in a instance level. In order to differentiate the state change of a type and the state change of an instance, then c# donot allow use 'this' in a static method. Am I right?
The
this
keyword can be used in a method marked asstatic
. The syntax is used to define extension methods in C#. This feature has been available since C# 3.0, released in 2007 (Wikipedia)In the normal usage,
this
refers to the instance,static
says that there is no instance (and therefore nothis
). The fact that you can't use them together (aside from special exceptions like extension methods) follows naturally from understanding whatthis
andstatic
are, conceptually.Another, more literal, take on your question:
The 'this' keyword can't be used in a static method to avoid confusion with its usage in instance methods where it is the symbol to access the pointer (reference) to the instance passed automatically as a hidden parameter to the method.
If not by that you could possibly define a local variable called 'this' in your static method, but that would be unrelated to the 'this' keyword referenced instance in the instance methods.
Below is an example with two equivalent methods, one static the other an instance method. Both method calls will pass a single parameter to the methods executing code that will do the same thing (print the object's string representation on the console) and return.
this
refers to the current instance of the object. A static method is a method on the class. It is not an instance method and therefore using this inside a static method is meaningless.I'm pretty sure this isn't limited to C# and it isn't a constraint, it's a logical situation. As @Yuriy correctly states, this refers to the current instance of a class, i.e. you've used new (or DI) to instantiate the class (created an instance of) and you need some way internally to refer to that instance, i.e. this object. A static method is called without instantiating the class, there is, in effect, no object created and as such you can't access properties of which this is one.
Because
this
points to an instance of the class, in the static method you don't have an instance.You'll notice the definition of a static member is
Which is why
this
has nothing to point to.By static methods you can write:
which there is nothing to do with any object instance (so you don't need this keyword).
Because static_method() works and doesn't need object instances for its job. static_method() doesn't know which object instance do you have, but it can change the behavior of all object instances:
In this case, static_method() changes the behavior of display() method in all object instances of MyClass.