【问题标题】:Lazy property requiring "this"需要“this”的惰性属性
【发布时间】:2013-08-05 16:20:55
【问题描述】:

这是我拥有的一个属性的示例,编码尽可能简单

private IEnumerable<int> _blocks;
private bool _blocksEvaluated;
public IEnumerable<int> Blocks
{
    get
    {
        if (!_blocksEvaluated)
        {
            _blocksEvaluated = true;
            _blocks = this.CalculateBlocks(0).FirstOrDefault();
        }
        return _blocks;
    }
}

这是冗长的;如果可能的话,我想让它更简洁。以下是可以接受的...

private Lazy<IEnumerable<int>> _blocks = 
    new Lazy<IEnumerable<int>>(() => this.CalculateBlocks(0).FirstOrDefault());

...但它无法编译。

关键字“this”在静态属性、静态方法或静态字段初始值设定项中无效

所以我想出了以下内容

struct MyLazy<TResult>
{
    private bool evaluated;
    private TResult result;

    public TResult Evaluate(Func<TResult> func)
    {
        if (!evaluated)
        {
            evaluated = true;
            result = func();
        }
        return result;
    }
}

private MyLazy<IEnumerable<int>> _blocks;
public IEnumerable<int> Blocks
{
    get { return _blocks.Evaluate(() => this.CalculateBlocks(0).FirstOrDefault()); }
}

我最喜欢哪个,但有更好的方法吗?

注意 - 我意识到可变结构通常是邪恶的,但它们似乎对这一特定问题非常有用。

【问题讨论】:

  • 我可以问为什么 ienumerable 当你似乎只分配一个单一的值?
  • CalculateBlocks 返回IEnumerable&lt;IEnumerable&lt;int&gt;&gt;

标签: c# .net lazy-evaluation


【解决方案1】:

只需在构造函数中初始化你的字段。

public class MyClass
{
    public MyClass()
    {
        _blocks = new Lazy<IEnumerable<int>>(() => this.CalculateBlocks(0).FirstOrDefault());
    }

    private readonly Lazy<IEnumerable<int>> _blocks;
}

【讨论】:

  • 这当然是正确的。不幸的是,现在我对this problem 感到非常恼火,所以无论如何我都可能只使用我的自定义结构。
【解决方案2】:

初始化实例字段时不能使用this,但可以简单地在构造函数中初始化它来解决这个问题。

private Lazy<IEnumerable<int>> _blocks;

public MyClass()
{
   _blocks = new Lazy<IEnumerable<int>>(
         () => this.CalculateBlocks(0).FirstOrDefault());
}

public IEnumerable<int> Blocks
{
    get
    {
        return _blocks.Value;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2014-09-02
    • 2021-02-08
    • 2017-01-26
    相关资源
    最近更新 更多