在第一次调用时初始化 属性 支持字段一次的更好方法
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 值。
我有定义 属性 保存一些数据的接口 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 值。