2017-10-24 9 views
-1

私の会社の年上の見習いは「これ」を使用します。たくさん。 2週間前、私はオブジェクト指向のコーディングを開始しましたが、まだ使用されているものを手に入れません。"これは何が必要ですか?" in c#

+1

これは_this_インスタンスを意味します。静的メソッドの場合、インスタンスは存在しないため、使用できません。 –

+0

これは本当に重複していません、OPは単語が使用されていることを理解していない、彼はそれを使用する/省略する方が良いかどうか尋ねていません。 –

+0

答えはhttps://imgur.com/ywS3UDpです。申し訳ありませんが、間違って閉鎖された質問をすべて自分で開くことはできません。 –

答えて

2

あなたが最初に何であるかのインスタンスを理解する必要があります:あなたのプライベートフィールドが与えられたメソッドのパラメータと同じ名前を持つ場合に一般的に使用さ

。あなたがオブジェクトを持っているとしましょう:

public class House 
{ 
    public decimal Height { get; set; } 
} 

あなたはそれの複数のインスタンスを持つことができます。

var smallHouse = new House { Height = 100M }; 
var bigHouse = new House { Height = 300M }; 

各インスタンスはHeightの独自の価値を持っています。 HouseのメソッドでHeightを使用する場合は、の現在のインスタンスメソッドが(呼び出された1人の)インスタンスで動作していることを参照する必要があります。

public class House 
{ 
    public decimal Height { get; set; } 

    public bool IsItTooBig() 
    { 
     return this.Height > 200; 
    } 
} 

それともthisを省略し、C#は何を意味するインスタンス値であることを推測させることができます:これは、この現在のインスタンスを参照する変数の特別な種類としてthisを使用して明示的に

を行うことができます。

public class House 
{ 
    public decimal Height { get; set; } 

    public bool IsItTooBig() 
    { 
     return Height > 200; 
    } 
} 

プログラマは、明示的に良いか悪いかに意見が異なります。大文字と小文字の区別に従うと、インスタンス状態とメソッドスコープの状態(通常の変数)を区別することができます。

あなたがまたは、競合を命名しているときにメソッドから現在のインスタンスを返すようにしたいときは、絶対に例えば、それを必要とする場合があります:あなたは、これらのケースの多くで不変の適用を検討してください

public class House 
{ 
    public decimal Height { get; set; } 

    public House AddFloor() 
    { 
     Height += 100; 
     return this; 
    } 
} 

は、しかし、。

0

キーワード 'this'は、そのインスタンスのメソッド、フィールド、またはプロパティを明示的に呼び出すために使用されるオブジェクトのインスタンスを表します。

private string name; 

public void SetName(string name) { 
    this.name = name; 
} 
0

このクラス内のインスタンスフィールドを参照する場合は、thisを使用しますが、省略することはできますが省略することはできません。

public class InstanceClass 
{ 
    int field = 10; 
    public void Method() 
    { 
     int field = 0; 

     Console.WriteLine(field); //  outputs 0 
     Console.WriteLine(this.field); // outputs 10 because "this" refers to field. 
    } 
} 

フィールド名と競合する宣言されたローカル変数がない場合、 "this"は省略できます。

public class InstanceClass 
{ 
    int _field = 10; 
    public void Method() 
    { 
     int field = 0; 

     Console.WriteLine(field); 
     Console.WriteLine(_field); // prefixed with _. 
            // no conflicts 
            // so "this" can be omitted. 
    } 
} 

これを省略できない場合は、インデクサーを使用する場合です。

public class InstanceClass 
{ 
    private List<int> _source; 
    private int offset; 

    public int this[int index] // you use "this" 
    { 
     get => _source[index + offset] 
     set => _source[index + offset] = value; 
    } 

    public void Method() 
    { 
     var first = this[0]; // must use "this" to refer to indexer for this class. 
    } 
} 

"this"は、コンストラクタのオーバーロードも呼び出します。

public class Foo 
{ 
    public Foo() : this(0) 
    { 
     Console.WriteLine("world"); 
    } 

    public Foo(int param1) 
    { 
     Console.WriteLine("Hello"); 
    } 
} 

//... 

var foo = new Foo(); // outputs "Hello world" 

"this"はクラス自体のインスタンスも参照します。自分のインスタンスを返す場合は、これを使用します。

public class Foo 
{ 
    public Foo ReturnMe() // weird example. 
    { 
     return this; 
    } 
} 
関連する問題