C# 将成员标记为"do not use"


public class Demo
{
    private List<string> _items;
    private List<string> Items
    {
        get
        {
            if (_items == null)
                _items = ExpensiveOperation();
            return _items;
        }
    }
}

Demo类中的其他方法将有权访问_items字段。 由于我使用属性来延迟加载项目,因此我不希望其他开发人员错误地尝试使用 _items 字段。

我知道我可能会使用过时属性,但这个字段在技术上并没有过时。

有没有更好的方法将成员标记为"不使用"?

虽然这不是你想要做的通用技术(而且没有一个,正如其他答案所涵盖的那样,你需要信任其他开发人员(,但在这种情况下,你可以创建一个Lazy<List<T>>(假设 .NET 4 或更高版本 - 尽管它很容易向后移植(

class Demo {
    readonly Lazy<List<string>> _items;
    public Demo() {
        var _items = new Lazy<List<string>>( ExpensiveOperation);
    }
    List<string> Items { get { return _items.Value; }}
 }

无论哪种方式,readonly/不可变方法通常是支持字段的方法。

编辑:根据@Timwi的答案(如果你喜欢这个想法,去+1(,一个人可以去镇上,并且在JavaScript风格中使用基于功能的限制甚至不公开Lazy字段,只是一个操作关闭它(也包含@Mr失望的ReadOnlyCollection建议(:

class Demo {
    readonly Func<ReadOnlyCollection<string>> _getItems;
    public Demo() {
        var items = new Lazy<List<string>>( ExpensiveOperation);
        _getItems = () => items.Value.AsReadOnly();
    }
    ReadOnlyCollection<string> Items { get { return _getItems(); }}
 }

从而结束我们愚蠢的编码技巧帖子。

_items字段重命名为 _heyFutureDeveloperDoNotReferenceThisFieldMmmkay

如果您设置了这样的属性,那么Items getter 将如何访问它而不会生成与您正在寻找的任何内容相同的警告/错误?

"另一个开发人员"是什么意思?如果您的意思是另一个开发人员(与您一起(处理相同的代码,那么一个简单的注释如下:

///<summary>Do not access directly, using lazy initialization in getter.</summary>

应该足够了,因为每当将鼠标悬停在字段上时,Visual Studio 都会显示这一点。

如果你的意思是有人使用这个类,那么这就是信息隐藏的全部意义,你很高兴。

是的,有一个相对简单的方法。有些人可能认为这是一个黑客,但我认为这是合法的。它使用局部变量范围规则来实现所需的方法级隐私:

public class Demo
{
    private readonly Func<List<string>> _getItems;
    public Demo()
    {
        List<string> items = null;
        _getItems = () =>
        {
            if (items == null)
                items = ExpensiveOperation();
            return items;
        };
    }
    public List<string> Items { get { return _getItems(); } }
}

现在,变量items的作用域已正确限定为使用它的方法。仍然可以访问_getItems,但这样做无关紧要,因为它与Items完全相同。无法修改items因为它是本地的,_getItems因为它是只读的。

我碰巧认为这是一件非常有效的事情。 不幸的是,C# 在设计时并没有考虑到这一点。因此,在实践中,在语言的当前版本中,您实际上无能为力。

如果你不信任团队中的开发人员,你就有更大的问题需要担心。

强烈不同意;如果你信任任何人,甚至你自己,那就是你有问题的时候。最好的代码不信任任何人。最好的代码是防弹的。它让任何人都无法搞砸。

C# 并不能完全实现这一点,尽管它比许多其他语言更接近。

它是私人的。责任止步于此。如果不止一个开发人员在一个类的私有部分工作,那么他们应该很好地沟通。

基本上相同的论点。是的,它是私人的,但那又怎样?为什么想要很好地封装私人细节不是一件有效的事情?

附言我提出了一种相关(但不是直接相关(的实用方法,以便在 C# 中更好地防弹代码,但我认为没有多少人见过它。所以这里:)我很想看到一种封装私有成员的实用方法。

什么都不做。

对于一个写得很好的类的公共或受保护成员,我们希望以合理的方式访问它,并且应该很好地记录一个不正确的情况。

对于私人领域,我们没有理由做出这样的假设。

此外,如果我作为团队中的新开发人员来到这门课,我不知道_items做什么。我要用它做什么?在我查看现有代码如何处理它之前,我无法做任何有意义的工作。我将看到它是一个惰性加载属性的支持字段。如果只有一点点记录评论,那就更是如此。

这并不是说你可以随意地对其他私人领域做任何你想做的事情,并期望它起作用。

怎么样

private Dictionary<String,Object> PandorasCoochie = new Dictionary<String,Object>()

然后把你不可触碰的财产支持者放在那里。

相关内容

最新更新