1. ホーム
  2. c#

C#の構造体に対して、キーワード「new」は何をするのか?

2023-10-02 06:05:43

質問

C#では、Structsは値で管理し、objectsは参照で管理します。私の理解では、クラスのインスタンスを作成する際に、キーワード new とすると、C#は以下のようにクラスの情報を使ってインスタンスを作成します。

class MyClass
{
    ...
}
MyClass mc = new MyClass();

structの場合は、オブジェクトを作るのではなく、単に変数に値をセットしているだけです。

struct MyStruct
{
    public string name;
}
MyStruct ms;
//MyStruct ms = new MyStruct();     
ms.name = "donkey";

私が理解していないのは、もし変数を MyStruct ms = new MyStruct() というキーワードは何なのでしょうか? new は、この文に対して何をしているのでしょうか?. structがオブジェクトになりえない場合、この文にある new は何をインスタンス化しているのでしょうか?

どのように解決するのですか?

から struct (C# Reference) をMSDNに掲載しました。

new 演算子を使用して構造体オブジェクトを作成すると、そのオブジェクトが作成され、適切なコンストラクタが呼び出されます。クラスとは異なり、構造体はnew演算子を使用せずにインスタンス化することができます。newを使用しない場合、フィールドは未割り当てのままとなり、すべてのフィールドが初期化されるまでオブジェクトを使用することはできません。

私の理解では、実際に構造体を適切に使用するためには 新しい を使用しないと、すべてのフィールドを手動で初期化することを確認しない限り、構造体を適切に使用できません。new 演算子を使用する場合は、適切に記述されたコンストラクタがこれを行う機会があります。

これですっきりしたでしょうか。もしこれに関して明確な説明が必要であれば、私に知らせてください。


編集

かなり長いコメントスレッドがあるので、ここで少し補足しておこうと思います。私は、それを理解する最良の方法は、それを試してみることだと思います。Visual Studio で "StructTest" というコンソール プロジェクトを作成し、次のコードをコピーしてください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace struct_test
{
    class Program
    {
        public struct Point
        {
            public int x, y;

            public Point(int x)
            {
                this.x = x;
                this.y = 5;
            }

            public Point(int x, int y)
            {
                this.x = x;
                this.y = y;
            }

            // It will break with this constructor. If uncommenting this one
            // comment out the other one with only one integer, otherwise it
            // will fail because you are overloading with duplicate parameter
            // types, rather than what I'm trying to demonstrate.
            /*public Point(int y)
            {
                this.y = y;
            }*/
        }

        static void Main(string[] args)
        {
            // Declare an object:
            Point myPoint;
            //Point myPoint = new Point(10, 20);
            //Point myPoint = new Point(15);
            //Point myPoint = new Point();


            // Initialize:
            // Try not using any constructor but comment out one of these
            // and see what happens. (It should fail when you compile it)
            myPoint.x = 10;
            myPoint.y = 20;

            // Display results:
            Console.WriteLine("My Point:");
            Console.WriteLine("x = {0}, y = {1}", myPoint.x, myPoint.y);

            Console.ReadKey(true);
        }
    }
}

弄ってみてください。コンストラクタを削除して、何が起こるか見てみましょう。1つの変数だけを初期化するコンストラクタを使ってみてください(1つはコメントアウトしてあります。) を使ったり使わなかったりしてみてください。 新しい キーワードの有無で試してみてください(いくつかの例をコメントアウトしました。コメントを解除して試してみてください)。