我正在学习有关属性的信息,我有一个很简单的问题:
属性仅仅是带有“内置” getter和setter的变量吗?
我的意思可以用这个例子来描述。
int variable;
public void SetVariable(int _value)
{
variable = _value;
}
public int GetVariable()
{
return variable;
}
int variable { get; set; }
这两个完全相同是相同的还是我看不到有一些细微差别?
答案 0 :(得分:2)
它们在班级中的代表有所不同。如果您使用反射或使用使用反射的工具,则这具有实际重要性。 (您的第二个示例将显示在PropertyInfo中,而您的第一个示例必须通过FieldInfo加上MethodInfo加上某些约定(Java中的la bean约定)的应用程序找到。)
因为大多数开发人员大部分时间都不直接处理反射,并且由于充其量他们对间接使用的考虑不多,因此很容易将属性视为“ field + getter + setter”周围的语法糖。 ”,但可以有所作为。
编辑:奇怪的是,当我最初回答时,我错过了(可以说)更重要的区别,那就是一旦声明,这些东西将被使用。是的,您得到的运动部件(大部分)是相同的,但是
在第一个示例中,
variable = 37;
是绕过设置器逻辑的直接分配。出于这个原因,您很可能将variable
声明为private
并将其设置为public
。因此调用代码通常不得不说
SetVariable(37);
相反。
在第二个示例中,说
variable = 37;
将使用值set
调用变量的37
方法。
再次,由于您在示例中使用的是默认设置器,因此这似乎毫无意义,但不一定总是这样。它可能与线程安全一样简单,也可能与以某种方式转换而不是直接存储在内部字段中的值一样复杂。
最后,您仍然可以说它是语法糖,但是现在它会影响接触该变量的每一部分代码,而不仅仅是声明变量本身。
答案 1 :(得分:0)
通常,方法代表动作。
属性代表数据,属性应像字段一样使用,这意味着属性不应在计算上复杂或不会产生副作用。
在不违反以下准则的情况下,请考虑使用属性而不是方法,因为经验不足的开发人员会发现更易于使用属性。