日期:2014-05-17  浏览次数:20825 次

【是否可以用属性代替方法,有何利弊】
下面是一个只读属性:

private int readOnlyNum;
public int ReadOnlyNum
{
  get
  {
     //do something...
     return x;
  }
}

下面是一个有返回值的方法:

public int MethodNum()
{
   //do something...
   return x;
}

请问这样的情况,如果我用属性替代方法有没有什么问题?…

------解决方案--------------------
属性在本质上就是一个方法
------解决方案--------------------
没有~~~~~
------解决方案--------------------
没什么区别

http://www.cnblogs.com/flashicp/archive/2007/03/20/681287.html

但 属性充分体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,即借助于get和set对属性的值进行读写;另一方面还可以对数据的访问属性进行控制

属性vs.函数

l       相似点

?       都包含执行代码

?       都可以有访问修饰符

?       都可以有virtual, abstract, override 修饰符

?       都可以用在接口中

l       不同点

?       属性只能拥有get/set 语句

?       属性不可以是void 型

?       属性不能使用参数

?       属性不能使用[ ] 参数

?       属性不能使用括号
------解决方案--------------------
属性本质上是方法,但语义类似字段。属性内部的逻辑应该是简单快速的,能不能用属性代替取决于你注释里面实质做了什么

//do something...

如果是打开数据库,读取一个值,那么不要用属性,如果只是类的两个成员变量进行简单的数学运算,那么完全可以用属性
------解决方案--------------------
和你的上下文有关。你应该阅读大量优秀的代码,体会语法之外的一般约定,让你的设计变得优雅。

而不是闭门造车钻研语法书上的字眼和仅仅满足编译器能否编译,运算效率,有没有bug之类的问题。如果你钻研这些,就好比外国人说汉语,虽然看上去语法也没有错误,但是感觉很不自然。
------解决方案--------------------
4L的回答“属性本质上是方法,但语义类似字段。”是最佳的回答。但是什么情况下我们希望它语义上像一个字段,这个就要你自己悟了。
------解决方案--------------------
lz要记住,语言是死的,人是活的
------解决方案--------------------
属性本质上确实是方法。

但设计的初衷是,对字段的存储进行一些控制。比如说一个人的年龄,不可能小于0,也不可能大于150.所以我们在属性的set方法里面进行设置。从而避免了每次设置一个字段的值是都要运行这个方法去检查设定的值是否正确。也就是说属性是专属控制某个字段的。

如果你把专属控制字段的代码里写一些与字段控制完全无关的代码,去实现了一些其他功能,一方面逻辑上不通。另一方面,对于函数的传入参数,以及返回值也都被限定了。你如果为这个属性传入参数呢?

------解决方案--------------------
属性本质上确实是方法。

但设计的初衷是,对字段的存储进行一些控制。比如说一个人的年龄,不可能小于0,也不可能大于150.所以我们在属性的set方法里面进行设置。从而避免了每次设置一个字段的值是都要运行这个方法去检查设定的值是否正确。也就是说属性是专属控制某个字段的。

如果你把专属控制字段的代码里写一些与字段控制完全无关的代码,去实现了一些其他功能,一方面逻辑上不通。另一方面,对于函数的可以传入参数。你如果为这个属性传入参数以期望有不同的返回值呢?

------解决方案--------------------

------解决方案--------------------
从#2楼起都是对的,属性本来就是方法。使用set、get两个方法来屏蔽了对private了的字段的访问。只不过c#(以及vb.net)把这两个方法封装的跟字段似地。这样你先实现为字段然后以后需要时直截了当地重构为属性,而访问它的代码却不需要修改(只需要重新编译)。

比如说Timers.Timer就有一个Enable属性,当设置它的时候就调用了Start或者Stop方法。可见为属性设置值可以一定程度上替代方法。

不过不要把任何事情绝对化。自然才是最好的。比如说Timer并没有因此就删除了Start和Stop方法,因为那两个已经是公开的方法、有人访问了,设计者就不应该轻易地因为有了属性而删除了方法。
------解决方案--------------------