gpt4 book ai didi

c# - 创建自定义属性类以在类中多次重用

转载 作者:行者123 更新时间:2023-11-30 21:57:46 25 4
gpt4 key购买 nike

假设我有一个具有多个属性的 C# 类,这些属性都如下所示:

private bool _var1Dirty = true;
private Double? _var1;
public Double? Var1
{
get
{
if (_var1Dirty)
{
_var1 = Method_Var1();
_var1Dirty = false;
}
return _var1;
}
}

这些属性之间的唯一区别是:

  1. 返回 var 的类型(在本例中为 Double?,但也可以很容易地为 intstring 等)<
  2. 方法调用 - Method_Var1()(每个属性都有不同的属性)

有什么办法可以将其写成自定义类吗?

类似的东西:

public class Prop
{
public delegate T Func();

private bool _dirty = true;
private T _val;
public T Val
{
get
{
if (_dirty)
{
_val = Func;
_dirty = false;
}
return _val;
}
}
}

然后我可以将:

  1. 返回类型T
  2. 方法函数

(PS - 我知道这不会编译/完全错误,但我想说明我在寻找什么)

非常感谢任何帮助/指导。

谢谢!!!

最佳答案

你很接近。您可以按照以下方式做一些事情:

public class Dirty<T>
{
public Dirty(Func<T> valueFactory)
{
this.valueFactory = valueFactory;
dirty = true;
}

private Func<T> valueFactory;
private bool dirty;
private T value;

public T Value
{
get
{
if (dirty)
{
value = valueFactory();
dirty = false;
}

return value;
}
}
}

然后你这样消费它:

Dirty<double?> dirtyDouble = new Dirty<double?>(() => SomethingThatReturnsADouble());
double? value = dirtyDouble.Value;

我不确定脏检查到底做了什么,但如果你需要比 bool 更复杂的东西你总是可以把它变成一些Func<T>检查是否脏污。

编辑:

根据@mikez 的评论和您的回答,您可以自己保存 Dirty<T> 的创建使用内置的类 Lazy<T> ,这也保证线程安全:

public class F
{
private Lazy<double?> lazyDouble = new Lazy<double?>(() =>
MethodThatReturnsNullableDouble(), true);
public double? Value
{
get
{
return lazyDouble.Value;
}
}
}

关于c# - 创建自定义属性类以在类中多次重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30532441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com