Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 属性getter是否应该返回私有成员以外的值?_.net_Properties_Code Formatting - Fatal编程技术网

.net 属性getter是否应该返回私有成员以外的值?

.net 属性getter是否应该返回私有成员以外的值?,.net,properties,code-formatting,.net,Properties,Code Formatting,我见过开发人员将更复杂的代码添加到Getter中,设置其他成员和属性等。给我返回一个非关联成员变量的值会导致调试混乱 这样更好吗 private int _myField; public int MyField { get { return _myField * 99; } set { _myField * value; } } 还是这个 private int _myField; public int MyField { get { return _myField

我见过开发人员将更复杂的代码添加到Getter中,设置其他成员和属性等。给我返回一个非关联成员变量的值会导致调试混乱

这样更好吗

private int _myField;
public int MyField
{
  get {
   return _myField * 99;
}
set {
   _myField * value;
}
}
还是这个

private int _myField;
public int MyField
{
  get {
   return _myField = _myField * 99;
}
set {
   _myField * value;
}
}

属性存在的原因之一就是你可以做这样的事情。属性是一种封装形式,它使您能够对调用方隐藏需要隐藏的任何逻辑


我个人的想法是,像你这样的东西很好(即,简单的数据操作,不会产生副作用),但一旦逻辑变得比几行更复杂,你应该转换为一种方法,向调用者表明正在发生更多的事情。

好吧,属性存在的原因之一是,您可以这样做。属性是一种封装形式,它使您能够对调用方隐藏需要隐藏的任何逻辑


我个人的理念是,像你这样的东西是好的(即简单的数据操作,不会产生副作用),但一旦逻辑变得比几行更复杂,你就应该换一种方法,向调用者表明正在发生更多的事情。

这两种方法都不好。在某些情况下,设置其他成员、执行缓存等都是可以的——毕竟,没有规则规定属性必须由没有逻辑的成员变量支持,而验证就是一个非常好的例子,说明您需要其他逻辑的地方

然而,通常写一个属性并不是一个好主意,这样得到一个刚刚设置的值将给出一个完全不同的答案。特别是,

private int _myField;
public int MyField
{
  get {
   return _myField;
}
set {
   _myField = value * 99;
}
}
几乎不应该做任何重要的事情(而在您的示例中,它会改变值)


(话虽如此,前两个示例的setter代码已被破坏。)

这两个都不好。在某些情况下,设置其他成员、执行缓存等都是可以的——毕竟,没有规则规定属性必须由没有逻辑的成员变量支持,而验证就是一个非常好的例子,说明您需要其他逻辑的地方

然而,通常写一个属性并不是一个好主意,这样得到一个刚刚设置的值将给出一个完全不同的答案。特别是,

private int _myField;
public int MyField
{
  get {
   return _myField;
}
set {
   _myField = value * 99;
}
}
几乎不应该做任何重要的事情(而在您的示例中,它会改变值)


(话虽如此,前两个示例的setter代码已被破坏。)

我认为您的第二个代码片段完全违反了代码的语义。使用getter不应该影响公共值——也就是说,你可以在getter内部做任何你想做的事情,比如缓存或延迟初始化等等——但是在外部,对getter的两个连续调用应该返回相同的结果。

我认为你的第二个代码片段完全违反了代码的语义。使用getter不应该影响公共值——也就是说,你可以在getter内部做任何你想做的事情,比如缓存或延迟初始化等等——但是在外部,对getter的两个连续调用应该返回相同的结果。

在我看来这两个调用都是无效的,因为
MyField=MyField
不是禁止操作的。(而且我不是落选者)在我看来,这两个人都很沮丧,因为
MyField=MyField
并不是不可能的。(我也不是落选者)感谢所有人的响应。我同意属性在调用时应该返回相同的值,因此第二个示例尤其会导致问题。在这里造成混乱的实际情况是复杂的代码路径,getter正在设置其他属性,如果验证失败,membe会对这些属性进行验证初始属性的r变量从未被设置。我相信,在复杂的代码路径上。如果将设置代码重构为setter或其他内容,并让getter获得结果字段,会是更好的做法。感谢所有响应。我同意在调用该属性时应返回相同的值,因此在中的第二个示例中特别是会引起问题。在这里造成混乱的实际情况是复杂的代码路径,其中getter正在设置其他属性,而这些属性又对它们进行了一些验证,如果验证失败,则初始属性的成员变量从未设置。我相信,对于复杂的代码路径,重新设置会是更好的做法将设置代码分解为setter或其他内容,让getter获得结果字段。