首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >允许类之外的字段访问是一种良好做法,还是应该始终允许字段仅通过属性访问外部?

允许类之外的字段访问是一种良好做法,还是应该始终允许字段仅通过属性访问外部?
EN

Stack Overflow用户
提问于 2019-03-02 11:58:43
回答 2查看 116关注 0票数 1

我试图理解字段的正确用法,以及字段是应该允许其他类访问,还是应该始终通过属性访问?

假设我有如下代码:

代码语言:javascript
运行
复制
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;
   }
}

这是允许访问另一个类之外的公共字段的良好做法,还是应该始终只通过属性访问?

当我检查列表的源代码时,我看到了以下内容:

代码语言:javascript
运行
复制
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;
    }

私有属性被标记为下划线,而相同的字典私有成员没有用下划线标记,如下所示:

代码语言:javascript
运行
复制
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,即清单和字典的私人成员之间有什么区别,还是我遗漏了什么?

这不完全是重复,因为我已经问了太多的事情,当然,我可以在问题中提到,但因为我不希望我的头衔问题太大。

此外,我在我的代码(字段和属性代码片段)中显示的内容以及在我的特定场景中是否是一个良好实践时,我也会问这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-02 12:20:51

根据

有时候,您可以使用非私有字段,因为无论出于什么原因,您都不关心上面的兼容性原因。但是,即使是在简单的情况下,使用属性也有好处: -有更细粒度的属性访问控制。需要它是公开的可获取,但实际上只希望它设置与受保护的访问?没有问题(至少从C# 2开始)。 当值发生变化时,-Want是否会闯入调试器?只需在设置器中添加一个断点即可。 -Want来记录所有访问?只需将日志添加到getter即可。属性用于数据绑定;字段不是。 几乎在所有情况下,字段都应该是私有的。不只是非公开的,而是私人的。使用C# 3中的自动属性,使用属性而不是字段所涉及的可读性或代码量基本上没有成本。有时候,您可能会发现一个真正好的理由,但是在做出选择之前,要仔细考虑它,特别是如果您将它暴露在内部访问之外的话。

和下划线:

没有语言定义的意义--这只是一些人用来区分实例变量和局部变量的惯例。其他变体包括m_foo (以及s_foo或g_foo或静态变量)或mFoo;或者,有些人喜欢在局部变量(和参数)前缀,而不是实例变量。

当您想要在类中创建变量时,在类前面放置一个简单的{set;get;}。没有造成伤害。

代码语言:javascript
运行
复制
public int a {set; get;}
票数 2
EN

Stack Overflow用户

发布于 2019-03-02 12:22:33

最佳实践是尽可能使用属性而不是直接访问字段。这样可以进行更好的调试和封装。

关于下划线,私有字段就是私有字段。它的名称不会改变它的可访问性。这是一个命名约定的问题,也许两个不同的团队在列表和字典上工作,他们对事物的命名也不同。

通常,C#开发人员倾向于避免下划线,但私有字段可以例外(参见这里)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54958265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档