public class Demo
{
private List<string> _items;
private List<string> Items
{
get
{
if (_items == null)
_items = ExpensiveOperation();
return _items;
}
}
}
Demo
类中的其他方法可以访问_items
字段。由于我使用属性来延迟加载项目,我不希望其他开发人员错误地尝试使用_items
字段。
我知道我可以使用ObsoleteAttribute,但这个字段在技术上并不过时。
有没有更好的方法将会员标记为“不使用”?
答案 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方法通常是以任何方式支持字段的方法。
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>()
然后把你不可接触的财产支持者放在那里。