在第一次调用时初始化 属性 支持字段一次的更好方法

Better ways to initialize property backing field once on first call

我有定义 属性 保存一些数据的接口 IDataHolder 和继承该接口的多个 类。每个对象都可以具有类型 DataType 的唯一数据,该数据具有子 类。但是需要先生成数据再访问。

使用该界面创建新的 类 时,我总是需要在代码中的某处生成数据,这变成了重复性任务。现在我有两个选择:

private DataType data;
public DataType Data {get => data; set => data = value;}

public void Init()
{
    Data = GenerateData();
}

或更优惠...

private DataType data;
public DataType Data
{
    get => data ? data : data = GenerateData();
    set => data = value;
}

所以问题是有没有更好的方法来创建 属性,在第一次调用时分配一次支持字段?

完整代码示例:

public interface IDataHolder
{
    DataType Data { get; set;}
}
public class Base
    {
        public T <T>GenerateData()
        { 
            // data generation
        }
    }
public class Derived : Base, IDataHolder
    {
        private DataType data;
        public DataType Data
        {
            get => data ? data : data = GenerateData();
            set => data = value;
        }
    }

您可以使用 Lazy<>.

private Lazy<DataType> data = new Lazy<DataType>(GenerateData);

public DataType Data
{
    get => data.Value;
} 

第一次调用 data.Value 时,将从 GenerateData 的结果中分配值,每隔一次,它只会 return 值。