我试图理解字段的正确用法,以及字段是应该允许其他类访问,还是应该始终通过属性访问?
假设我有如下代码:
internal class MyCalculator : IDisposable
{
public Type1 type1;
public MyCalculator(Type1 type1)
{
this.type = type1;
}
}
internal class Accessor
{
public void Foo()
{
MyCalculator obj = new MyCalculator();
obj.type1.Id = 10;
}
}这是允许访问另一个类之外的公共字段的良好做法,还是应该始终只通过属性访问?
当我检查列表的源代码时,我看到了以下内容:
public class List<T> : IList<T>, System.Collections.IList, IReadOnlyList<T>
{
private const int _defaultCapacity = 4;
private T[] _items;
[ContractPublicPropertyName("Count")]
private int _size;
private int _version;
}私有属性被标记为下划线,而相同的字典私有成员没有用下划线标记,如下所示:
public class Dictionary<TKey,TValue>: IDictionary<TKey,TValue>, IDictionary, IReadOnlyDictionary<TKey, TValue>, ISerializable, IDeserializationCallback {
private struct Entry {
public int hashCode; // Lower 31 bits of hash code, -1 if unused
public int next; // Index of next entry, -1 if last
public TKey key; // Key of entry
public TValue value; // Value of entry
}
private int[] buckets;
private Entry[] entries;
private int count;
private int version;
private int freeList;
private int freeCount;
}所以我有点困惑,上面的2,即清单和字典的私人成员之间有什么区别,还是我遗漏了什么?
这不完全是重复,因为我已经问了太多的事情,当然,我可以在问题中提到,但因为我不希望我的头衔问题太大。
此外,我在我的代码(字段和属性代码片段)中显示的内容以及在我的特定场景中是否是一个良好实践时,我也会问这个问题。
发布于 2019-03-02 12:20:51
根据这的
有时候,您可以使用非私有字段,因为无论出于什么原因,您都不关心上面的兼容性原因。但是,即使是在简单的情况下,使用属性也有好处: -有更细粒度的属性访问控制。需要它是公开的可获取,但实际上只希望它设置与受保护的访问?没有问题(至少从C# 2开始)。 当值发生变化时,-Want是否会闯入调试器?只需在设置器中添加一个断点即可。 -Want来记录所有访问?只需将日志添加到getter即可。属性用于数据绑定;字段不是。 几乎在所有情况下,字段都应该是私有的。不只是非公开的,而是私人的。使用C# 3中的自动属性,使用属性而不是字段所涉及的可读性或代码量基本上没有成本。有时候,您可能会发现一个真正好的理由,但是在做出选择之前,要仔细考虑它,特别是如果您将它暴露在内部访问之外的话。
和下划线:
没有语言定义的意义--这只是一些人用来区分实例变量和局部变量的惯例。其他变体包括m_foo (以及s_foo或g_foo或静态变量)或mFoo;或者,有些人喜欢在局部变量(和参数)前缀,而不是实例变量。
当您想要在类中创建变量时,在类前面放置一个简单的{set;get;}。没有造成伤害。
public int a {set; get;}发布于 2019-03-02 12:22:33
最佳实践是尽可能使用属性而不是直接访问字段。这样可以进行更好的调试和封装。
关于下划线,私有字段就是私有字段。它的名称不会改变它的可访问性。这是一个命名约定的问题,也许两个不同的团队在列表和字典上工作,他们对事物的命名也不同。
通常,C#开发人员倾向于避免下划线,但私有字段可以例外(参见这里)。
https://stackoverflow.com/questions/54958265
复制相似问题