【问题标题】:Default and custom constructor默认和自定义构造函数
【发布时间】:2015-10-30 14:20:16
【问题描述】:

我有一个简单的问题。

假设我有如下课程。

    public class DamageToDeal
    {
        public bool enabled;
        public float value;
        public TDValue type;

        public DamageToDeal() { }

        public DamageToDeal(bool _enabled, float _value, TDValue _type)
        {
            enabled = _enabled;
            value = _value;
            type = _type;
        }

    }

我读到如果我有自定义构造函数,默认值不会自动生成

我必须用默认值(0,null)自己初始化字段还是使用空主体的默认构造函数来初始化字段?

或者如果默认构造函数正在初始化字段,即使他的主体是空的?

【问题讨论】:

  • 字段被初始化为默认值,所以你不需要
  • 但是我必须有这个空的构造函数是吗?
  • @Filus1025 除非你没有其他构造函数,是的,你必须声明它。
  • TDValue 是您唯一需要担心的事情。做一个字段初始化怎么样?
  • 当你有一个带参数的构造函数就足够了,不需要无参数的ctor。无论如何,您的所有值都被初始化为其默认值(TDValue 为 null)。

标签: c# default-constructor


【解决方案1】:

分配给新类实例的内存由内存分配器清除。您只需确保为您希望具有非默认值的任何字段分配。

这在此处记录:Fundamentals of Garbage Collection:

托管对象会自动获得干净的内容,因此它们的构造函数不必初始化每个数据字段。

您不需要一个空的无参数构造函数来实现这一点。如果你真的想调用它并且对类型有意义,你只会添加那个构造函数。

另请注意,任何同时声明初始化表达式的字段声明都会被提升到构造函数中。

如果你这样做:

public TDValue type = new TDValue();

那么无论调用哪个构造函数,该字段都会有一个对新 TDValue 对象的实例引用。


请注意,以上对类有效,对结构无效。对于结构,您需要确保分配所有字段,因为内存并不总是“分配”的,它可能只是保留在堆栈上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 2016-02-08
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多