C# 属性只是创建getter和setter的简单方法吗?

C# 属性只是创建getter和setter的简单方法吗?,c#,C#,我正在学习房地产,我有一个相当简单的问题: 属性只是带有“内置”getter和setter的变量吗 我的意思可以用这个例子来描述 int variable; public void SetVariable(int _value) { variable = _value; } public int GetVariable() { return variable; } 这两种方法是完全相同的还是有一些我看不到的细微差别?一般来说,方法代表动作 属性表示数据,属性的用途类似于字

我正在学习房地产,我有一个相当简单的问题:

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

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

int variable;

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

public int GetVariable()
{
    return variable;
}


这两种方法是完全相同的还是有一些我看不到的细微差别?

一般来说,方法代表动作

属性表示数据,属性的用途类似于字段,这意味着属性在计算上不应复杂或产生副作用


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

一般来说,方法表示动作。 属性表示数据,属性的用途类似于字段,这意味着属性在计算上不应复杂或产生副作用


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

< P>它们在类中不同地表示。如果您使用反射,或者如果您使用使用使用反射的工具,这是非常重要的。(第二个示例将显示在PropertyInfo中,而第一个示例必须通过FieldInfo加上MethodInfo加上某种约定的应用程序(Java中的一种la bean约定)找到。)

因为大多数开发人员大部分时间都不直接处理反射,而且充其量他们也不会考虑太多的间接使用,所以很容易将属性看作是围绕“field+getter+setter”的语法糖,但它可以起到不同的作用


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

在你的第一个例子中

variable = 37;
是绕过setter逻辑的直接赋值。因此,您可能会将
变量
声明为
私有
,并使getter/setter
公开
;所以调用代码通常必须说

SetVariable(37);
相反

在你的第二个例子中,说

variable = 37;
将使用值
37
调用变量的
set
方法

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


最后,你仍然可以说它是语法上的糖分,但现在它影响到与变量相关的每一位代码,而不仅仅是变量本身的声明。

它们在类中的表示方式不同。如果您使用反射,或者如果您使用使用使用反射的工具,这是非常重要的。(第二个示例将显示在PropertyInfo中,而第一个示例必须通过FieldInfo加上MethodInfo加上某种约定的应用程序(Java中的一种la bean约定)找到。)

因为大多数开发人员大部分时间都不直接处理反射,而且充其量他们也不会考虑太多的间接使用,所以很容易将属性看作是围绕“field+getter+setter”的语法糖,但它可以起到不同的作用


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

在你的第一个例子中

variable = 37;
是绕过setter逻辑的直接赋值。因此,您可能会将
变量
声明为
私有
,并使getter/setter
公开
;所以调用代码通常必须说

SetVariable(37);
相反

在你的第二个例子中,说

variable = 37;
将使用值
37
调用变量的
set
方法

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


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

除了命名,它们是一样的。属性实际上是通过具有特殊名称的getter和setter方法实现的,为了方便起见,这些方法是隐藏的。请注意,永远不要在.NET中使用
Get/Set
方法而不是属性,因为了解capital-P属性的客户机和工具不会发现该“属性”。C#属性的不同“风格”在@jeroenmoster中有详细解释,这回答了我的问题。除了命名,他们是一样的。属性实际上是通过具有特殊名称的getter和setter方法实现的,为了方便起见,这些方法是隐藏的。请注意,永远不要在.NET中使用
Get/Set
方法而不是属性,因为了解capital-P属性的客户机和工具将无法发现该“属性”。C#属性的不同“风格”在@jeroenmoster中有详细解释,这回答了我的问题。这在WPF中也很重要。您只能绑定到属性;一种方法是行不通的。@BradleyDotNET-我相信这属于“使用反射的工具”的范畴,它在WPF中也很重要。您只能绑定到属性;一种方法是行不通的。@BradleyDotNET-我相信这属于“使用反射的工具”的范畴