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>()
然后把你不可触碰的财产支持者放在那里。