C#の構造体に対して、キーワード「new」は何をするのか?
質問
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つはコメントアウトしてあります。) を使ったり使わなかったりしてみてください。 新しい キーワードの有無で試してみてください(いくつかの例をコメントアウトしました。コメントを解除して試してみてください)。
関連
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] C#の[Flags]Enum属性の意味とは?
-
[解決済み] C++の'struct'と'typedef struct'の違い?
-
[解決済み] Pythonで子クラスから親クラスのメソッドを呼び出すにはどうすればよいですか?
-
[解決済み】C#のyieldキーワードは何に使われるのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み] 構造体とクラス