如何在C#中为结构创建默认值?

uns*_*Ptr 14 c# struct

我正在尝试为我的struct制作默认值.例如,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如何为struct创建默认值?

Lua*_*aan 22

你不能.结构总是预先归零,并且不能保证构造函数被调用(例如new MyStruct[10]).如果您需要零以外的默认值,则需要使用类.这就是为什么你不能在第一时间改变默认构造函数(直到C#6) - 它永远不会执行.

您可以获得的最接近的是使用Nullable字段,如果它们通过属性为null,则将它们解释为具有某些默认值:

public struct MyStruct
{
  int? myInt;

  public int MyInt { get { return myInt ?? 42; } set { myInt = value; } }
}
Run Code Online (Sandbox Code Playgroud)

myInt仍然预先归零,但您将"零"解释为您自己的默认值(在本例中为42).当然,这可能完全是不必要的开销:)

至于Console.WriteLine它,它只是调用虚拟ToString.您可以将其更改为随意返回.

  • 这真是太聪明了!只要您记住,MyStruct 的两个实例可能会也可能不会返回相同的值,即使 MyInt 都返回 42。 (3认同)
  • @PeterMoore 他们被清零了,没有什么比这更复杂的了。浮点数也初始化为 0,因为清零内存_是_ float 中的零值;) (2认同)

jer*_*enh 5

您的问题不在于 C#/.Net 的行为。实例化结构的方式有效地创建了一个具有所有成员字段默认值的实例。

使用 ToString() 方法将其Console.WriteLine参数转换为字符串。默认实现 ( Object.ToString()) 只是写入完全限定的类名称(命名空间和名称,正如您所说的那样)。

如果您想要另一种可视化效果,您应该重写该ToString方法:

public struct Test
{
    int num;
    string str;
    public override string ToString()
    {
        return $"num: {num} - str: {str}";
    } 
}
Run Code Online (Sandbox Code Playgroud)