Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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)_.net_Properties_Function - Fatal编程技术网

属性与函数(特别是.NET)

属性与函数(特别是.NET),.net,properties,function,.net,Properties,Function,我读了一些关于这个话题的讨论,有些事情我就是不明白 最常见的答案似乎是:使用只读属性返回缓存数据,使用函数返回非缓存数据。根本不要使用WriteOnly属性,因为“它没有意义” 这没有性能原因。在IL中,MyProperty作为get\u MyProperty和set\u MyProperty方法存在。唯一的原因显然是应该假设上述答案 好吧,那为什么还要费心处理只读属性呢?为什么不让变量公开而不是私有? 那为什么还要为属性而烦恼呢?缓存数据->公共变量,非缓存数据->函数,写入数据->子 让我们

我读了一些关于这个话题的讨论,有些事情我就是不明白

最常见的答案似乎是:使用只读属性返回缓存数据,使用函数返回非缓存数据。根本不要使用WriteOnly属性,因为“它没有意义”

这没有性能原因。在IL中,MyProperty作为
get\u MyProperty
set\u MyProperty
方法存在。唯一的原因显然是应该假设上述答案

好吧,那为什么还要费心处理只读属性呢?为什么不让变量公开而不是私有? 那为什么还要为属性而烦恼呢?缓存数据->公共变量,非缓存数据->函数,写入数据->子

让我们忘记以上所有内容,将属性作为一个方便的功能使用? 一个“项”用于获取和设置数据。使用常识了解Get是否不会返回缓存数据(可能导致延迟)

-编辑- 我看到人们或多或少都同意房产是最好的选择。
我只是不明白为什么会有这么多人在讨论中反对属性。

只读属性的一个很好的理由是计算出的值。在这种情况下,没有要导出的变量

比如说

public class Person {
  private readonly DateTime _birthday;
  public int Age { get { return (DateTime.Now - _birthday).TotalYears; } }
  ...
}

在这种情况下,是否将_birth作为属性或字段公开无疑是有争议的。但对于其他计算值,如年龄,将其作为变量公开的唯一方法是将其存储在对象中。在这种情况下,使用一个额外的年龄变量实际上是存储冗余信息。将其作为计算属性公开具有较小的开销并避免存储冗余数据

属性比自动属性更重要。如果您这样做:

public int MyProp { public get; public set; }
那真的和

public int MyProp;
但前者的最大优点是,您可以在以后将其更改为:

public int MyProp {
    get {
        // Do some processing
        return someValue;
    }

    set {
        // Do some processing
        DoMyProcess(value);
    }
}

其他使用对象的代码无需重新编译即可工作。相反,如果您使用了公共字段,则如果要将其从字段更改为属性,则需要重新编译客户端代码。

属性是基于方法的操作的方便替代品。属性getter setter和执行相同操作的方法之间没有功能上的区别;事实上,如果您查看IL,您将看到属性访问器被“get”和/或“set”方法替换


使用属性而不仅仅是允许访问变量的最大原因是封装。假设您正在编写一个库,并公开了一个
IsBlue
变量。你分发图书馆,每个人都喜欢并使用它。现在,到了版本2的时候了,当用户将
设置为蓝色时,您希望执行一些操作-可能执行检查,可能缓存一些内容。为此,必须将变量转换为属性或方法,并在其中执行检入。现在,您已经破坏了所有客户端代码-他们访问的变量不再存在。如果最初将其实现为属性,则可以修改属性的代码,并保留二进制兼容性。

“缓存数据->公共变量”-坏主意。这将允许另一个类修改缓存的数据。此外,计算缓存数据的成本可能会很高:使用只读属性可以将计算推迟到访问该属性为止。

从类中公开变量被认为是不好的做法。另外,如果更改对象的结构但保持属性不变,则不会影响使用类的代码。

原因1=属性可用于数据绑定。方法不能

原因#2=调试时,监视窗口将自动公开属性/展开对象。方法不会以这种方式自动监视

我记得在某个地方读到,read属性不应该改变对象状态。我认为这是一个很好的做法,尤其是考虑到原因。只要您观察一个对象并在“观察”中展开它,对象状态就会发生变化,从而使调试更加困难

此外,如果一个昂贵的财产受到意外约束,它可能会带来严重的性能问题。(属性可以从数据绑定中“隐藏”属性,但只要将它们设置为方法,就不必担心了。)

属性为窗口开发提供了便利。它们在设计师中的“使用”方式不同

(我有时只是公开一些变量。但我将它们命名为属性。因此

整数mCounter=0

我就是喜欢

整数计数器=0


如果将来某个时候我必须做“额外的事情”,我会用相同的名称创建属性,并将变量重命名为mCounter。无可否认,这是我的懒惰,我并不真的推荐它。只需将它包装在属性中即可。)

你的问题到底是什么?你的最后一段要么与你的问题相矛盾,要么提供了你自己的答案。我的最后一段提供了我自己的观点。我在寻找同意或不同意(提供理由)。@Dan:你是对的,对于我从事的90%的项目来说,这也没什么大不了的。和其他任何东西一样,属性也是一种工具——如果它们对您有帮助,请使用它们,如果没有帮助,请忽略它们。然而,之所以如此强调属性,是因为人们用Java编写getter和setter,甚至是因为人们编写
if(0==foo)
而不是
if(foo==0)
——这是一种防御性的编码机制,已经成为一种习惯。许多人会争辩说,这种习惯值得努力。同样,如果它对你有帮助,就用它。