【是否可以用属性代替方法,有何利弊】

happySnow_zhe 2013-02-17 02:13:11
下面是一个只读属性:

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

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

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

请问这样的情况,如果我用属性替代方法有没有什么问题?…
...全文
2126 22 点赞 打赏 收藏 举报
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
warlock 2013-02-22
如果不需要传参数,跟方法基本没区别!
  • 打赏
  • 举报
回复
潇洒王子 2013-02-22
又复习了一下
  • 打赏
  • 举报
回复
showjim 2013-02-18
属性,不应该改变数据状态,资源占用不宜过大。
  • 打赏
  • 举报
回复
gemo 2013-02-18
最大的好处就是,属性从语言层面上指示了明确的含义,并且可以自动生成。 假如没有“属性”这么个设计: 当然,也可以按成员变量名自动生成对应的方法。但是你仍然可以对这些方法改变返回值,增加参数等,这样一样含义就不够直观和明确了。 这就和private的作用类似:如果没有private关键字,你仍然可以在函数加上private_前缀代表不希望被使用者调用。但是谁能保证呢?
  • 打赏
  • 举报
回复
gengchenhui 2013-02-18
你这不就是java跟C#么?java中就是这么弄的。。。
  • 打赏
  • 举报
回复
happySnow_zhe 2013-02-17
引用 5 楼 caozhy 的回复:
和你的上下文有关。你应该阅读大量优秀的代码,体会语法之外的一般约定,让你的设计变得优雅。 而不是闭门造车钻研语法书上的字眼和仅仅满足编译器能否编译,运算效率,有没有bug之类的问题。如果你钻研这些,就好比外国人说汉语,虽然看上去语法也没有错误,但是感觉很不自然。
版主有没有什么书籍或文档推荐,谢谢……
  • 打赏
  • 举报
回复
happySnow_zhe 2013-02-17
引用 4 楼 theillusion 的回复:
属性本质上是方法,但语义类似字段。属性内部的逻辑应该是简单快速的,能不能用属性代替取决于你注释里面实质做了什么 //do something... 如果是打开数据库,读取一个值,那么不要用属性,如果只是类的两个成员变量进行简单的数学运算,那么完全可以用属性
谢谢……
  • 打赏
  • 举报
回复
happySnow_zhe 2013-02-17
引用 3 楼 TheDolphin 的回复:
没什么区别 http://www.cnblogs.com/flashicp/archive/2007/03/20/681287.html 但 属性充分体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,即借助于get和set对属性的值进行读写;另一方面还可以对数据的访问属性进行控制 ……
谢谢……
  • 打赏
  • 举报
回复
nikolay 2013-02-17
引用 3 楼 TheDolphin 的回复:
没什么区别 http://www.cnblogs.com/flashicp/archive/2007/03/20/681287.html 但 属性充分体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,即借助于get和set对属性的值进行读写;另一方面还可以对数据的访问属性进行控制 属性vs.函数 l 相似点 Ø ……
+1
  • 打赏
  • 举报
回复
再举一个非常“喜欢”在属性中被调用的例子(实际上是触发事件,当然调用委托跟调用其它方法也差不多),就不多写了,看msdn:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.inotifypropertychanged.aspx
  • 打赏
  • 举报
回复
如果说到属性中过于“充血”的弊端,其实也很多例子。究其原因就是“功能抖动”的问题。 这往往跟不同框架也有关系。例如asp.net的机制是“一次次下载html”的机制,假设一个对象有10个属性,你是否会在任意一个属性被修改时立刻去重新DataBind整个页面呢?还是修改了所有属性之后仅仅在下载html之前的某个事件中才去执行一次页面DataBind呢?前者就可以在属性中调用DataBind,而后者就要把DataBind移出来,另外循着页面生命期的其它机关去部署这个DataBind语句。 显然,假设框架比较死(不能灵活地在客户端所见即所得),或者问了其它设计原因,你需要避免在属性中调用方法,而是在它应该被执行的时候才被执行。
  • 打赏
  • 举报
回复
从#2楼起都是对的,属性本来就是方法。使用set、get两个方法来屏蔽了对private了的字段的访问。只不过c#(以及vb.net)把这两个方法封装的跟字段似地。这样你先实现为字段然后以后需要时直截了当地重构为属性,而访问它的代码却不需要修改(只需要重新编译)。 比如说Timers.Timer就有一个Enable属性,当设置它的时候就调用了Start或者Stop方法。可见为属性设置值可以一定程度上替代方法。 不过不要把任何事情绝对化。自然才是最好的。比如说Timer并没有因此就删除了Start和Stop方法,因为那两个已经是公开的方法、有人访问了,设计者就不应该轻易地因为有了属性而删除了方法。
  • 打赏
  • 举报
回复
q107770540 2013-02-17
  • 打赏
  • 举报
回复
indusl 2013-02-17
属性本质上确实是方法。 但设计的初衷是,对字段的存储进行一些控制。比如说一个人的年龄,不可能小于0,也不可能大于150.所以我们在属性的set方法里面进行设置。从而避免了每次设置一个字段的值是都要运行这个方法去检查设定的值是否正确。也就是说属性是专属控制某个字段的。 如果你把专属控制字段的代码里写一些与字段控制完全无关的代码,去实现了一些其他功能,一方面逻辑上不通。另一方面,对于函数的可以传入参数。你如果为这个属性传入参数以期望有不同的返回值呢?
  • 打赏
  • 举报
回复
indusl 2013-02-17
属性本质上确实是方法。 但设计的初衷是,对字段的存储进行一些控制。比如说一个人的年龄,不可能小于0,也不可能大于150.所以我们在属性的set方法里面进行设置。从而避免了每次设置一个字段的值是都要运行这个方法去检查设定的值是否正确。也就是说属性是专属控制某个字段的。 如果你把专属控制字段的代码里写一些与字段控制完全无关的代码,去实现了一些其他功能,一方面逻辑上不通。另一方面,对于函数的传入参数,以及返回值也都被限定了。你如果为这个属性传入参数呢?
  • 打赏
  • 举报
回复
lz要记住,语言是死的,人是活的
  • 打赏
  • 举报
回复
threenewbee 2013-02-17
4L的回答“属性本质上是方法,但语义类似字段。”是最佳的回答。但是什么情况下我们希望它语义上像一个字段,这个就要你自己悟了。
  • 打赏
  • 举报
回复
threenewbee 2013-02-17
和你的上下文有关。你应该阅读大量优秀的代码,体会语法之外的一般约定,让你的设计变得优雅。 而不是闭门造车钻研语法书上的字眼和仅仅满足编译器能否编译,运算效率,有没有bug之类的问题。如果你钻研这些,就好比外国人说汉语,虽然看上去语法也没有错误,但是感觉很不自然。
  • 打赏
  • 举报
回复
theillusion 2013-02-17
属性本质上是方法,但语义类似字段。属性内部的逻辑应该是简单快速的,能不能用属性代替取决于你注释里面实质做了什么 //do something... 如果是打开数据库,读取一个值,那么不要用属性,如果只是类的两个成员变量进行简单的数学运算,那么完全可以用属性
  • 打赏
  • 举报
回复
色拉油 2013-02-17
没什么区别 http://www.cnblogs.com/flashicp/archive/2007/03/20/681287.html 但 属性充分体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,即借助于get和set对属性的值进行读写;另一方面还可以对数据的访问属性进行控制 属性vs.函数 l 相似点 Ø 都包含执行代码 Ø 都可以有访问修饰符 Ø 都可以有virtual, abstract, override 修饰符 Ø 都可以用在接口中 l 不同点 Ø 属性只能拥有get/set 语句 Ø 属性不可以是void 型 Ø 属性不能使用参数 Ø 属性不能使用[ ] 参数 Ø 属性不能使用括号
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2013-02-17 02:13
社区公告

让您成为最强悍的C#开发者