C# 带约束的结构

C# 带约束的结构,c#,constructor,struct,C#,Constructor,Struct,我花了很长时间才弄明白如何用C语言编写一个对字段值有限制的结构。例如,System.DateTime DateTime d = new DateTime(); 将值01/01/0001 12:00:00 AM放入d。但是我不能编写显式无参数构造函数,因为structs不允许有显式无参数构造函数。那么,我如何创建一个在我想要的约束内默认构造的结构 我能想到的唯一一件事就是设计属性,使它们在我想要的约束范围内返回值。例如,如果我存储了一个int,希望它大于0,那么我只需在返回值中添加一个,并且不允

我花了很长时间才弄明白如何用C语言编写一个对字段值有限制的结构。例如,System.DateTime

DateTime d = new DateTime();
将值01/01/0001 12:00:00 AM放入d。但是我不能编写显式无参数构造函数,因为structs不允许有显式无参数构造函数。那么,我如何创建一个在我想要的约束内默认构造的结构


我能想到的唯一一件事就是设计属性,使它们在我想要的约束范围内返回值。例如,如果我存储了一个int,希望它大于0,那么我只需在返回值中添加一个,并且不允许设置小于1。这是明智的选择吗?

我建议使用检查DateTime结构是如何编写的。这应该会给您提供所需的洞察力。

您是否需要值类型语义?普通的不可变类有什么问题?

我想你最好建议在这种情况下使用类。将此结构放入其中,在无参数构造函数中,您可以显式设置希望结构包含的值。

CLR中的值类型语义的一部分是,值类型始终具有合理的有效默认值(此外,合理的默认值由默认初始化值类型表示,使用正常初始化规则)。如果您的类型不是这种情况,那么它不应该是
结构

请参阅问题的答案以获取更多信息。基本上,没有参数,值类型字段总是初始化为默认值作为性能优化,因为值类型通常在数组等中以较大的数字使用


如果你想要真正的约束,你应该考虑创建一个类,但是“智能属性”可能是在使用类时有问题的方法。对于DATETIME类型,是的,它是“智能”属性,将日期存储为请求时转换为特定格式的数字(通过属性访问)。。根据设计,01/01/0001 12:00:00 AM实际上是默认内部0的表示。

DateTime将其默认值设置为DateTime.Min。当您打印它时(这取决于其ToString()方法),将打印其当前值,即

下面是一个例子:

class Program
{
    static void Main(string[] args)
    {
        ChrisTime t = new ChrisTime();
        Console.WriteLine(t);

        DateTime time = new DateTime();
        Console.WriteLine(time);

        Console.Read();
    }
}

public struct ChrisTime
{
    private int _length;

    public int Length
    {
        get
        {
            return _length;
        }
        set
        {
            _length = value;
        }
    }

    public override string ToString()
    {
        return Length.ToString();
    }

}
打印出:

0
01/01/0001 00:00:00

但是,如果尝试将_length初始化为1,它将失败,因为您既不能这样做,也不能设置构造函数。但是DateTime的ToString方法执行以下操作:

public override string ToString()
{
    return DateTimeFormat.Format(this, null, DateTimeFormatInfo.CurrentInfo);
}

您看到的DateTime字段格式为字符串格式。因此,day、month、year、hour、minute、second都为零,正如您对新构造的对象所期望的那样。

DateTime结构对其值有限制,因为所有值设置都是通过方法调用完成的。请注意,DateTime上的所有属性都是只读的

所以

介于五和五之间的公共结构
{
公共静态只读int MinValue;
公共静态只读int MaxValue;
int_值;
公共整数值
{
获取{返回_值;}
}
公共整数加法(整数a)
{
int b=_值+a;

如果(b>=MinValue&&b如何?这将日、月、年等设置为0,我不确定您的评论与我建议使用Reflector查看代码的建议有何关联…?请看一下关于这个类似问题的评论:我假设他需要关于构造函数和默认值的建议()对于结构,不是关于值类型和引用类型的建议。是的,我不需要它是一个结构,我觉得实现智能属性是值得的,所以我要将结构转换为类。DateTime不做“智能属性”它管理方法调用中设置或增加其值的约束。Reflector FTW。如果只读属性调用自定义方法、包含开关语句等,则它们仍然“智能”。我没有提到约束检查,我提到属性是为了解释内部数字的格式,但感谢您的评论。Reflector FTW.)
public struct BetweenNegativeFiveAndFive
{
    public static readonly int MinValue;
    public static readonly int MaxValue;
    int _value;
    public int Value
    {
        get { return _value; }
    }
    public int Add(int a)
    {
        int b = _value + a;
        if (b >= MinValue && b <= MaxValue)
            _value = b;
        return _value;
    }
    static Foo()
    {
        MinValue = -5;
        MaxValue = 5;
    }
}