在C#中错误使用保护支持字段的最佳方法

Sam*_*ron 4 c# design-guidelines

我有一个类(Foo)延迟加载一个名为(Bar)的属性.您的首选方法是防止未初始化后备区域的错误使用(由于智能或缺乏经验的员工)?

我可以想到3个选项:

  class Foo {
    // option 1 - Easy to use this.bar by mistake. 
    string bar;
    string Bar {
        get {
            // logic to lazy load bar  
            return bar; 
        }
    }

    // option 2 - Harder to use this._bar by mistake. It is more obscure.
    string _bar2;
    string Bar2 {
        get {
            // logic to lazy load bar2  
            return _bar2;
        }
    }

    //option 3 - Very hard to use the backing field by mistake. 
    class BackingFields {
        public string bar; 
    }

    BackingFields fields = new BackingFields();

    string Bar3 {
        get {
            // logic to lazy load bar  
            return fields.bar;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

请记住,我希望人们在背景栏中徘徊的唯一地方是房产的设置者和吸气剂.他们应该总是在课堂的其他任何地方使用这个.Bar

更新

我目前正在使用以下的Lazy实现(不是所有具有支持字段的属性,而是针对需要延迟加载,同步和通知的选择属性).它可以扩展到支持期货(稍后在单独的线程中强制评估)

注意我的实现锁定读取,因为它支持外部集.

另外,我想提一下,我认为这是一种语言限制,例如可以在Ruby中克服.

你可以用这种方式实现懒惰.

x = lazy do
    puts "<<< Evaluating lazy value >>>"
    "lazy value"
end

puts x
# <<< Evaluating lazy value >>>
# lazy value
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

如何使用ObsoleteAttribute#pragma- 很难错过它!

    void Test1()
    {
        _prop = ""; // warning given
    }
    public string Prop
    {
#pragma warning disable 0618
        get { return _prop; }
        set { _prop = value; }
#pragma warning restore 0618
    }
    [Obsolete("This is the backing field for lazy data; do not use!!")]
    private string _prop;
    void Test2()
    {
        _prop = ""; // warning given
    }
Run Code Online (Sandbox Code Playgroud)

  • +1我从没想过这个,但我永远不会把这个丑陋的东西放到我的代码库中:) (2认同)

Shu*_*oUk 4

选项5

Lazy<T>

在某些情况下效果很好,但只要开发人员不是白痴,选项 1 对于大多数项目来说应该就足够了。

如果字段是私有的,则将 [EditorBrowsable(EditorBrowsableState.Never)] 添加到该字段将无济于事,因为此逻辑仅针对从元数据而不是当前代码(当前项目以及通过项目引用而不是 dll 完成的任何操作)生成的智能感知起作用。

注意:Lazy<T>不是线程安全的(这很好,如果不需要,则没有锁定点)如果您需要线程安全,请使用Joe Duffy或Parallel Exetensions CTP的线程安全之一