Here we eliminate naming conflicts in our C# programs. The this
-keyword indicates the current instance. Two variables sometimes have the same identifier.
A special keyword (this) eliminates mistakes—it indicates the class
member with the identifier. It can also be part of an indexer on a class
(this is a separate thing).
This program uses the this
-keyword when referring to a class
instance. We use the this
-keyword inside the class
declaration only and to refer to that instance.
this
-keyword can not refer to a static
field or method. It cannot occur inside a static
class
.this
-keyword is inferred by the compiler and not required. It is useful for expressing your intent.this.B()
" only if you are inside the class
.this._a
++" are equivalent in this program.using System; class Perl { public Perl() { // Part 1: call instance method with "this." this.B(); } int _a; // Instance field public void B() { // Part 2: increment instance field without "this." _a++; // ... Use this. this._a++; // ... Read instance field. Console.WriteLine("B called: " + this._a); } } class Program { static void Main() { // Create a new instance of the type Perl. // ... The constructor calls method B. // ... Then we call method B again. Perl perl = new Perl(); perl.B(); } }B called: 2 B called: 4
We can pass the "this" instance to another method. That method will then receive the reference to the class
we called it from.
using System; class Net { public string Name { get; set; } public Net(Perl perl) { // Use name from Perl instance. this.Name = perl.Name; } } class Perl { public string Name { get; set; } public Perl(string name) { this.Name = name; // Pass this instance as a parameter! Net net = new Net(this); // The Net instance now has the same name. Console.WriteLine(net.Name); } } class Program { static void Main() { Perl perl = new Perl("Sam"); } }Sam
You can use "this" in a constructor initializer to implement constructor overloading and code sharing. It makes classes simpler.
We can also use "this" to declare an indexer. An indexer can be accessed with the same syntax as an array type. We can have expression-bodied indexers.
Extension method syntax uses the this
-keyword in a different context. We use "this" to specify the instance variable in the parameter list of the extension method.
To understand the this
-keyword, we provided details from the C# standard itself. The instance expression is optional in many cases. It indicates which identifier is being referenced.