【问题标题】:Are properties just a simpler way of creating getter and setter? [duplicate]属性只是创建 getter 和 setter 的一种更简单的方法吗? [复制]
【发布时间】:2019-01-22 09:57:51
【问题描述】:

我正在学习属性,我有一个相当简单的问题:

属性只是带有“内置”getter 和 setter 的变量吗?

我的意思可以用这个例子来描述。

int variable;

public void SetVariable(int _value)
{
    variable = _value;
}

public int GetVariable()
{
    return variable;
}

int variable { get; set; }

这两个完全一样是一样的还是有一些我看不到的细微差别?

【问题讨论】:

  • 除了命名之外,它们是相同的。属性实际上是使用具有特殊名称的 getter 和 setter 方法实现的,为了方便起见,这些方法被隐藏了。请注意,您永远不应在 .NET 中使用Get/Set 方法而不是属性,因为知道大写-P 属性的客户端和工具将无法发现该“属性”。
  • C#属性的不同“风味”详解in the documentation
  • @JeroenMostert 谢谢,回答了我的问题。

标签: c#


【解决方案1】:

他们在班级中的表现不同。如果您使用反射,或者如果您使用使用反射的工具,这具有实际重要性。 (您的第二个示例将显示在 PropertyInfo 中,而您的第一个示例必须通过 FieldInfo 加上 MethodInfo 加上一些约定的应用程序,Java 中的 la bean 约定。)

因为大多数开发人员大多数时候并不直接处理反射,而且他们最多也不会过多考虑间接使用,因此很容易将属性视为围绕“字段 + getter + setter”的语法糖",但它可以有所作为。


编辑:奇怪的是,当我最初回答时,我错过了(可以说)更重要的区别,这就是这些东西在声明后使用的方式。是的,你得到(大部分)相同的移动部件,但是

在你的第一个例子中,

variable = 37;

是绕过 setter 逻辑的直接赋值。因此,您可能会将variable 声明为private 并将getter/setter 设为public;所以调用代码通常不得不说

SetVariable(37);

改为。

在你的第二个例子中,说

variable = 37;

将使用值37 调用变量的set 方法。

再一次,这似乎毫无意义,因为您在示例中使用了默认设置器,但情况并非总是如此。它可以像线程安全一样简单,也可以像以某种方式转换而不是直接存储在内部字段中的值一样复杂。

最后你仍然可以说它是语法糖,但现在它会影响涉及变量的每一段代码,而不仅仅是变量本身的声明。

【讨论】:

  • 它在 WPF 中也很重要。您只能绑定到属性;一个方法行不通。
  • @BradleyDotNET - 我相信这属于“使用反射的工具”的范畴
【解决方案2】:

一般来说,方法代表动作。

属性代表数据,属性旨在像字段一样使用,这意味着属性不应计算复杂或产生副作用。

如果不违反以下准则,请考虑使用属性而不是方法,因为经验不足的开发人员会发现属性更易于使用。

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2020-07-28
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    相关资源
    最近更新 更多