web-dev-qa-db-ja.com

C#で構造体のデフォルト値を作成する方法は?

構造体のデフォルト値を作成しようとしています。たとえば、Intのデフォルト値-0、DateTimeのデフォルト値-1/1/0001 12:00:00 AM。既知のように、パラメーターなしのコンストラクターを構造に定義することはできません。

struct Test
{
    int num;
    string str;
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(default(Test)); // shows namespace and name of struct test.Test
        Console.WriteLine(new Test()); // same

        Console.ReadKey(true);
    }
}

Structのデフォルト値を作成するにはどうすればよいですか?

12
unsafePtr

できません。構造体は常に事前にゼロに設定されており、コンストラクターが呼び出される保証はありません(例:new MyStruct[10])。ゼロ以外のデフォルト値が必要な場合は、クラスを使用する必要があります。そもそも(C#6まで)既定のコンストラクターを変更できないため、実行されません。

最も近いものは、Nullableフィールドを使用し、プロパティを介してnullである場合にデフォルト値を持つように解釈することです。

public struct MyStruct
{
  int? myInt;

  public int MyInt { get { return myInt ?? 42; } set { myInt = value; } }
}

myIntはまだゼロに事前設定されていますが、「ゼロ」を独自のデフォルト値(この場合は42)として解釈します。もちろん、これはまったく不要なオーバーヘッドかもしれません:)

Console.WriteLine、単に仮想ToStringを呼び出します。必要なものを返すように変更できます。

20
Luaan

あなたの問題はC#/。Netの動作にありません。構造体をインスタンス化する方法により、すべてのメンバーフィールドのデフォルト値を持つインスタンスが効果的に作成されます。

_Console.WriteLine_は、ToString()メソッドを使用して引数を文字列に変換します。デフォルトの実装(Object.ToString())は、完全修飾クラス名(名前空間と呼ばれる名前)を書き込むだけです。

別の視覚化が必要な場合は、ToStringメソッドをオーバーライドする必要があります。

_public struct Test
{
    int num;
    string str;
    public override string ToString()
    {
        return $"num: {num} - str: {str}";
    } 
}
_
3
jeroenh

オブジェクトの.ToString()をオーバーライドしない限り、C#のオブジェクトを名前空間で出力します。以下のように構造体を定義して試してみてください。

public struct Test
{
    int num;
    string str;
    public override string ToString()
    {
        return "Some string representation of this struct";
    }
}

PS:default(Test)は、default(int)とdefault(string)を含む構造体を提供します。つまり、Test.numは0およびTest.strはnullです

お役に立てれば

1
Cihan Uygun

おそらくあなたがしたいことは、ToString()をオーバーライドすることです。

_struct Test
{
    int num;
    string str;

    public override string ToString ()
    {
        return string.Format ($"{str} | {num}");
    }
}
_

前述のように、適切なタイプのデフォルト値以外のフィールドにデフォルト値を定義することはできません。ただし、ToString()をオーバーライドすると、コンソールおよびデバッグ中に構造に関するより適切な形式の情報が表示されます。

0