代码之家  ›  专栏  ›  技术社区  ›  Matthew Scharley

这里发生了什么?如果没有默认的构造函数,如何调用它?

  •  15
  • Matthew Scharley  · 技术社区  · 15 年前

    给出以下代码:

    public struct Foo
    {
        public Foo(int bar, int baz) : this()
        {
            Bar = bar; // Err 1, 2
            Baz = baz; // Err 3
        }
    
        public int Bar { get; private set; }
        public int Baz { get; private set; }
    }
    

    什么? : this() 事实上呢?没有默认的构造函数,所以它调用什么?如果没有这个附录,整个事情就会因错误而崩溃。

    Error   1   The 'this' object cannot be used before all of its fields are assigned to
    Error   2   Backing field for automatically implemented property 'Foo.Bar' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.
    Error   3   Backing field for automatically implemented property 'Foo.Baz' must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.
    
    3 回复  |  直到 13 年前
        1
  •  14
  •   Greg Sansom    13 年前

    为什么结构构造函数没有 C中不允许使用参数?这是 因为结构已经包含 没有的默认构造函数 参数。记住这个 默认构造函数是 .NET框架,因此它不是 在我们的代码中可见。唯一的目的 默认构造函数的 为其成员指定默认值。

    基本上,所有结构都已经有了一个默认的构造函数。上课的情况会有所不同。

        2
  •  8
  •   Guffa    15 年前

    当使用属性的快捷方式时,只能通过其setter和getter访问属性。但是,在分配所有字段之前,不允许调用任何setter。解决方法是调用自动创建的无参数构造函数,该构造函数初始化了字段。当然,这意味着您要初始化字段两次。

    几天前,当我遇到这个问题时,我刚刚删除了属性的快捷方式,并自己声明了局部变量,以便在构造函数中设置它们:

    public struct Foo {
    
       public Foo(int bar, int baz) {
          _bar = bar;
          _baz = baz;
       }
    
       private int _bar, _baz;
    
       public int Bar { get { return _bar; } }
       public int Baz { get { return _baz; } }
    
    }
    
        3
  •  4
  •   Locksfree    15 年前

    this 讨论他们为什么添加了这个额外的检查。