構造体メソッド内でのフィールドへの正しいアクセス方法
メニューを表示するにはスワイプしてください
これまでにメソッドを作成し、データを渡して問題なく使用してきましたが、メソッドのパラメータ名が構造体内のフィールド名と衝突する例を考えてみましょう。
index.cs
1234567891011121314151617181920212223242526272829using System; struct Coordinate { public int x; public int y; public void setValue(int x, int y) { x = x; y = y; } public void displayValue() { Console.WriteLine($"({x}, {y})"); } } class ConsoleApp { static void Main(string[] args) { Coordinate coord = new Coordinate(); coord.setValue(5, 7); coord.displayValue(); } }
この場合、コンパイラはエラーを表示しませんが、プログラムの出力が (0, 0) を使用しているにもかかわらず setValue(5, 7) となるため、論理的に正しくありません。
これは、x = x という文が非常に曖昧であり、メソッドパラメータ と 構造体フィールド の両方が x という名前を持っているためです。コンパイラによると、x = x の文では メソッドパラメータ x が値 x を自分自身に再度代入しているだけであり、論理的には何もしていないことになります。
これを修正するには、this キーワードを使用します。this キーワードは、構造体の フィールド を参照していることをコンパイラに伝えます。
構文は this.fieldName です。修正後のコードは次のようになります。
index.cs
1234567891011121314151617181920212223242526272829using System; struct Coordinate { public int x; public int y; public void setValue(int x, int y) { this.x = x; this.y = y; } public void displayValue() { Console.WriteLine($"({x}, {y})"); } } class ConsoleApp { static void Main(string[] args) { Coordinate coord = new Coordinate(); coord.setValue(5, 7); coord.displayValue(); } }
これでコンパイラは、x = x の文において、左側の x は構造体フィールド、右側の x はメソッドパラメータであることを認識し、今回はフィールドが正しく更新されます。
コード内で曖昧さが生じる場合は、this キーワードを使用して解決します。構造体メソッド内でフィールドへアクセスする際には、常に this キーワードを使うことが一般的な良い習慣です。
すべて明確でしたか?
フィードバックありがとうございます!
セクション 2. 章 6
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
セクション 2. 章 6