私有属性和私有字段之间的区别[重复]

Posted

技术标签:

【中文标题】私有属性和私有字段之间的区别[重复]【英文标题】:Difference between private properties and private fields [duplicate] 【发布时间】:2014-10-23 09:53:25 【问题描述】:

假设你有一个班级测试:

public class test

    public test()
    
        isTesting = false;
    

    private bool isTesting;

    public bool getTesting()  return isTesting; 
    private void setTesting(bool testing)  isTesting = testing; 

还有一个:

public class test

    public test()
    
        isTesting = false;
    

    public bool isTesting  private set; get; 

这两者有什么区别吗?

应该使用一个而不是另一个还是这是一个偏好问题?

【问题讨论】:

唯一的区别是您的第一个代码类似于 java。您不需要自己声明 getter-setter 方法,让编译器担心。 @Marcus 这个问题不包括是否使用 getter/setter 或属性的选项 没有,但它描述了属性在 .NET 平台上的使用方式以及区别是什么。假设您对这个问题的看法,我建议您可以在提供的线程中找到您的答案。 【参考方案1】:

您提供的两个代码示例现在在功能上是等效的,但是 getter / setter 方法(无论它们是“属性”还是显式方法的形式)的主要原因是它们的实现可以在不修改的情况下更改调用它们的代码。如果你这样做了,这些就不等价了,因为第一个实际上并没有调用 setter,而第二个调用了。为了匹配第二个,第一个构造函数应该写成如下:

public test()

    setTesting(false);

或者第二个应该写成调用setter,即设置字段而不是属性:

public test()

    _isTesting = false;


private bool _isTesting;

public bool isTesting 
    private set  _isTesting = value; 
    get  return _isTesting; 

除此之外,没有实际区别——在大多数情况下:即使属性本质上被编译成getter和setter方法,它们仍然保留元数据,它们实际上是“属性”与“方法”相反,一些 API 依赖于这些信息。

另一个区别是语义:属性应该被视为字段,这意味着它们会从内存中进行某种基本的存储/检索。如果我在 C# 代码中看到一个名为 GetX 的方法而不是属性 X,我可能会假设该方法正在做一些更高级的事情并以不同的方式对待它。

【讨论】:

【参考方案2】:

使用 .NET,您应该使用 properties。不鼓励使用 Java 中使用的 GetX/SetX 方法。当公开一种类型的数据时,通常建议使用属性(它们定义一个公共接口)——字段应该永远是私有的。

【讨论】:

【参考方案3】:

私有属性在 .Net 中具有优势,因为它们允许您抽象内部数据,以便当内部表示发生变化时,它们不会影响实现的其他部分。私有字段中未提供此项。

另一方面,私有属性在延迟加载的情况下非常有利。

您也可以查看Are there any reasons to use private properties in C#?

【讨论】:

以上是关于私有属性和私有字段之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

私有类变量的字段与属性[重复]

只读字段和私有 getter 属性之间的区别

私有字段和私有属性的区别

c ++中受保护的派生和私有派生有啥区别[重复]

Java中是不是可以通过反射访问私有字段[重复]

使用 FakeItEasy 的私有方法和属性的单元测试用例 [重复]