クラスオブジェクト対構造体オブジェクト
メニューを表示するにはスワイプしてください
クラスオブジェクトも構造体と同様に配列、ディクショナリ、リストに格納可能ですが、クラスオブジェクトは参照渡し、構造体オブジェクトは値渡しである点に注意が必要です。
この概念は、int、float、doubleのような単純な値をメソッドに渡す場合と、複雑なオブジェクトや構造体をメソッドに渡す場合で挙動が異なるため重要です。例を見てこの概念をより理解しましょう。
ここでは、シンプルな構造体オブジェクトを作成し、それをメソッドに渡します。メソッド内でその値を変更し、元のオブジェクトの値がどうなるかを確認します。
index.cs
123456789101112131415161718192021222324252627using System; // Defining a simple structure struct Example { public int value; } public class ConsoleApp { static void exampleMethod(Example passedObject) { passedObject.value += 10; Console.WriteLine($"passedObject: {passedObject.value}"); } public static void Main(string[] args) { // Creating and initialising an object Example originalObject = new Example(); originalObject.value = 7; // Passing that object into a method exampleMethod(originalObject); // Checking the value of the originalObject Console.WriteLine($"originalObject: {originalObject.value}"); } }
出力結果から、passedObject の値は更新されましたが、originalObject の値は変更されていないことが分かります。これは、構造体オブジェクトをメソッドに渡すと、そのオブジェクトの複製が作成されてメソッドに渡される、つまり値渡しであることを示しています。
次に、まったく同じコードで struct を class に変更してみましょう。
index.cs
123456789101112131415161718192021222324252627using System; // Defining a simple class class Example { public int value; } public class ConsoleApp { static void exampleMethod(Example passedObject) { passedObject.value += 10; Console.WriteLine($"passedObject: {passedObject.value}"); } public static void Main(string[] args) { // Creating and initialising an object Example originalObject = new Example(); originalObject.value = 7; // Passing that object into a method exampleMethod(originalObject); // Checking the value of the originalObject Console.WriteLine($"originalObject: {originalObject.value}"); } }
出力が変化していることに気づくでしょう。今回は passedObject と originalObject の両方が同じ値になっています。これは、クラスオブジェクトをメソッドに渡すと、元のオブジェクトへの参照がメソッドに渡されるため、passedObject を変更すると originalObject も変更されることを示しています。
この特性は、オブジェクトを変数に代入する場合にも当てはまります。以下は、構造体オブジェクトの挙動を示す例です。
index.cs
12345678910111213141516171819202122232425using System; struct Num { public int value; } public class ConsoleApp { public static void Main(string[] args) { // Creating and initiating 'a' Num a = new Num(); a.value = 7; // Creating 'b' and setting it equal to a. Num b = a; Console.WriteLine($"a is {a.value} and b is {b.value}"); // Now we change the value of 'b' to something else b.value = 9; Console.WriteLine($"a is {a.value} and b is {b.value}"); } }
同じコードですが、今回はクラスオブジェクトの場合です:
index.cs
12345678910111213141516171819202122232425using System; class Num { public int value; } public class ConsoleApp { public static void Main(string[] args) { // Creating and initiating 'a' Num a = new Num(); a.value = 7; // Creating 'b' and setting it equal to a. Num b; b = a; Console.WriteLine($"a is {a.value} and b is {b.value}"); // Now we change the value of 'b' to something else b.value = 9; Console.WriteLine($"a is {a.value} and b is {b.value}"); } }
1. クラスオブジェクトは次の通りです:
2. 以下のコードは、クラスオブジェクトをリストやディクショナリと共に使用する方法を示しています。コード内のコメントで説明されています。コードを読み、正しい出力を示す選択肢を選んでください。コードは長いですが、良いコードリーディングの練習になります。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください