C#标记成员为“不使用”

时间:2012-01-22 21:49:25

标签: c# encapsulation

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

            return _items;
        }
    }
}

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

我知道我可以使用ObsoleteAttribute,但这个字段在技术上并不过时。

有没有更好的方法将会员标记为“不使用”?

7 个答案:

答案 0 :(得分:48)

虽然这不是你想要做的一般技术(并且没有一个,而且正如其他答案所涵盖,你需要信任其他开发者),在这个例子中,你可以创建一个{{1} }(假设.NET 4或更高版本 - 虽然它很容易向后移植)

Lazy<List<T>>

class Demo { readonly Lazy<List<string>> _items; public Demo() { var _items = new Lazy<List<string>>( ExpensiveOperation); } List<string> Items { get { return _items.Value; }} } / non-mutable方法通常是以任何方式支持字段的方法。

编辑:根据@Timwi的回答(如果您喜欢这个想法,请转+1)可以在城镇上找到它,并使用JavaScript样式使用capability-based restriction甚至不公开readonly字段,只是一个关闭它的操作(还包含@Mr Disappointment的Lazy建议):

ReadOnlyCollection

因此,我们的愚蠢编码技巧就会发挥作用。

答案 1 :(得分:44)

_items字段重命名为_heyFutureDeveloperDoNotReferenceThisFieldMmmkay

答案 2 :(得分:12)

如果您设置了这样的属性,那么Items getter如何访问它而不会产生相同的警告/错误,无论您要查找的是什么?

“另一位开发者”是什么意思?如果你的意思是另一个开发人员在处理这个相同的代码(和你一起),那么就像一个简单的评论:

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

应该足够了,因为只要将鼠标悬停在字段上,Visual Studio就会显示。

如果你的意思是有人使用这个课程,那么这就是隐藏信息的重点,你很高兴。

答案 3 :(得分:6)

是的,有一种相对简单的方法。有些人可能认为它是黑客,但我认为这是合法的。它使用局部变量作用域规则来实现您想要的方法级隐私:

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,因为它是只读的。

答案 4 :(得分:3)

我认为这是一件非常有效的事情。不幸的是,C#并没有考虑到这一点。因此,在实践中,在当前版本的语言中,你真的无法做到这一点。

  

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

强烈不同意;如果您信任任何人,甚至自己 就是您遇到问题的时候。最好的代码不信任任何人。最好的代码是防弹。它让没办法让任何人搞砸了。

C#不会完全使这成为可能,尽管它比许多其他语言更接近。

  

是私人的。降压停在那里。如果不止一个开发人员在一个类的私有部分工作,那么他们应该很好地沟通。

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

P.S。我已经提出了一个相关的(但不是直接相关的)practical approach to enable better bullet-proofing of code in C#,但我认为很多人都没有看过它。所以这里是:)我希望看到封装私有成员的实用方法。

答案 5 :(得分:1)

绝对没有。

对于一个写得很好的班级的公共或受保护的成员,我们希望以合理的方式访问它,并且应该记录一个不真实的案例。

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

此外,如果我作为团队中的新开发人员来到这个班级,我不知道_items做了什么。我该怎么办呢?在我查看现有代码的功能之前,我无法完成任何有意义的工作。而且我将会看到它是延迟加载属性的支持字段。如果还有一点点记录评论,那就更是如此。

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

答案 6 :(得分:-2)

怎么样

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

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