代码之家  ›  专栏  ›  技术社区  ›  BadmintonCat

具有初始无效字段的结构

  •  1
  • BadmintonCat  · 技术社区  · 6 年前

    我正在尝试创建一个结构,它有两个字段,我可以在创建后直接检查它们是否有效。因为这两个领域 0 默认情况下,我想检查它们是否无效 -1

    public struct InputCodeSet
    {
        public int primary;
        public int secondary;
    
    
        public InputCodeSet(int primary = -1, int secondary = -1)
        {
            this.primary = primary;
            this.secondary = secondary;
        }
    
        public bool IsValid
        {
            get { return primary > -1 && primary < InputCode.MAX && secondary > -1 && secondary < InputCode.MAX; }
        }
    }
    

    但是,任何 InputCodeSet 结果 IsValid 创建后始终为真,即使未设置主或辅助。显然,可选构造函数参数中的默认值被忽略了?还有其他方法可以让它工作吗?我想主要使用对象初始化语法。。。

    var inputCode1 = new InputCodeSet { primary = InputCode.55 }
    
    1 回复  |  直到 6 年前
        1
  •  7
  •   BoltClock    6 年前

    结构有单独的默认无参数构造函数,当调用这些构造函数时,即使所有参数都是可选的,也不会使用参数调用构造函数重载。因此,在不向构造函数传递任何参数的情况下创建结构会调用其默认构造函数,并导致其字段初始化为0,完全忽略具有可选参数的构造函数。

    documentation :

    如果使用默认的无参数构造函数实例化struct对象,则所有成员都将根据其默认值进行赋值。

    也许您可以将这些字段设置为null,并检查null而不是-1:

    public struct InputCodeSet
    {
        public int? primary;
        public int? secondary;
    
        public InputCodeSet(int? primary = null, int? secondary = null)
        {
            this.primary = primary;
            this.secondary = secondary;
        }
    
        public bool IsValid
        {
            get { return primary != null && primary < InputCode.MAX && secondary != null && secondary < InputCode.MAX; }
        }
    }