構造体のデフォルト値を作成しようとしています。たとえば、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のデフォルト値を作成するにはどうすればよいですか?
できません。構造体は常に事前にゼロに設定されており、コンストラクターが呼び出される保証はありません(例: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
を呼び出します。必要なものを返すように変更できます。
あなたの問題はC#/。Netの動作にありません。構造体をインスタンス化する方法により、すべてのメンバーフィールドのデフォルト値を持つインスタンスが効果的に作成されます。
_Console.WriteLine
_は、ToString()メソッドを使用して引数を文字列に変換します。デフォルトの実装(Object.ToString()
)は、完全修飾クラス名(名前空間と呼ばれる名前)を書き込むだけです。
別の視覚化が必要な場合は、ToString
メソッドをオーバーライドする必要があります。
_public struct Test
{
int num;
string str;
public override string ToString()
{
return $"num: {num} - str: {str}";
}
}
_
オブジェクトの.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
です
お役に立てれば
おそらくあなたがしたいことは、ToString()
をオーバーライドすることです。
_struct Test
{
int num;
string str;
public override string ToString ()
{
return string.Format ($"{str} | {num}");
}
}
_
前述のように、適切なタイプのデフォルト値以外のフィールドにデフォルト値を定義することはできません。ただし、ToString()
をオーバーライドすると、コンソールおよびデバッグ中に構造に関するより適切な形式の情報が表示されます。