首页 新闻 会员 周边

初学,属性和方法的问题。

0
[已解决问题] 解决于 2012-03-20 16:11

老师让定义了一个类,叫约瑟夫问题类。

 

属性有Number,Times,Survive,Kids,Winners.

 

当时我把Winners定义成一个字段winners。

然后用方法处理后返回winners。

 

老师说可以直接在属性里处理winners。

我始终觉得,具体算法应该在方法里面实现。当然属性里可以做。

 

对此有很大疑问,抛开属性效率高的观点。具体算法是应该在方法里么?

番茄零乱的主页 番茄零乱 | 初学一级 | 园豆:200
提问于:2010-12-15 09:14
< >
分享
最佳答案
0

C#中的属性是个语法糖,它本身就是方法(get方法和set方法)。

面向对象中的属性表示对象包含的数据或状态,是名词,C#属性的表现形式与它在语义上更一致一些。如果像Java那样,对于数据或状态的暴露采用get和set方法,在语义上就变成了动词,是获取(或设置)xxx属性的值,跟面向对象的属性就不是很一致,显得很别扭(权且这么说吧)。比如,你想获取一个Person的Age,C#直接用Person.Age就可以了,也就是直接得到年龄,但Java中要Person.getAge(),字面上是通过“获取年龄”才能得到年龄的值,这显然很别扭吧。

在C#的属性中添加算法是没有问题的,很多验证算法都在set里,很多判断是否为空的逻辑也都在get里,这是.NET推荐的做法。当然也要看你的算法复杂到什么程度,是否需要较长的运算时间,如果很复杂很耗时或者很长,还是写在单独的方法里吧。

麒麟.NET | 老鸟四级 |园豆:3614 | 2010-12-15 11:05
原来是这样。我一直把算法操作写在方法里,认为属性只能拿来存取数值。认为属性就只是一个性质。
番茄零乱 | 园豆:200 (初学一级) | 2010-12-15 12:51
@番茄零乱:要是那样的话,何必用属性去包装一下呢?直接用public的字段不就行了吗?呵呵。
麒麟.NET | 园豆:3614 (老鸟四级) | 2010-12-15 14:35
属性可以只读,只写,读写嘛。呵呵,误解了,误解了。
番茄零乱 | 园豆:200 (初学一级) | 2010-12-15 15:28
@番茄零乱:呵呵,对对对。可以参考一下《Effective C#》里的条目1。
麒麟.NET | 园豆:3614 (老鸟四级) | 2010-12-15 15:32
其他回答(4)
0

Winners是个名词,还是属性好,要不改成GetWinners,不过没有参数的Get方法还是建议用只读属性

我想我是风 | 园豆:4 (初学一级) | 2010-12-15 09:26
嗯,我写的就是GetWinners。谢谢,无参方法用只读属性。
支持(0) 反对(0) 番茄零乱 | 园豆:200 (初学一级) | 2010-12-15 09:31
0

个人观点:属性是对字段的封装 这是教科书上的话   

在我看来属性说白了就是方法   只不过是简化了写法 算是语法糖吧

所以在get访问器里写算法应该问题不大

写代码的小2B | 园豆:4371 (老鸟四级) | 2010-12-15 09:28
谢谢,学习了。
支持(0) 反对(0) 番茄零乱 | 园豆:200 (初学一级) | 2010-12-15 09:31
0

如楼上所说,C#实际为属性的每个get或set块都创建了一个方法,这些方法名是对应成员属性名加个get或set前缀的,例如,get_Winners。但是如果想实现一些具体算法问题,我感觉还是用方法好,毕竟我们理解的属性就是为了存取数据用的。

魏志飞 | 园豆:285 (菜鸟二级) | 2010-12-15 09:49
0

你用Reflector反编译一下,就可以看到,属性就是方法的封装,是微软帮你封装好了。所以我们可以直接用属性。

Lee's Blog | 园豆:530 (小虾三级) | 2010-12-15 15:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册