C#中的属性是个语法糖,它本身就是方法(get方法和set方法)。
面向对象中的属性表示对象包含的数据或状态,是名词,C#属性的表现形式与它在语义上更一致一些。如果像Java那样,对于数据或状态的暴露采用get和set方法,在语义上就变成了动词,是获取(或设置)xxx属性的值,跟面向对象的属性就不是很一致,显得很别扭(权且这么说吧)。比如,你想获取一个Person的Age,C#直接用Person.Age就可以了,也就是直接得到年龄,但Java中要Person.getAge(),字面上是通过“获取年龄”才能得到年龄的值,这显然很别扭吧。
在C#的属性中添加算法是没有问题的,很多验证算法都在set里,很多判断是否为空的逻辑也都在get里,这是.NET推荐的做法。当然也要看你的算法复杂到什么程度,是否需要较长的运算时间,如果很复杂很耗时或者很长,还是写在单独的方法里吧。
Winners是个名词,还是属性好,要不改成GetWinners,不过没有参数的Get方法还是建议用只读属性
个人观点:属性是对字段的封装 这是教科书上的话
在我看来属性说白了就是方法 只不过是简化了写法 算是语法糖吧
所以在get访问器里写算法应该问题不大
如楼上所说,C#实际为属性的每个get或set块都创建了一个方法,这些方法名是对应成员属性名加个get或set前缀的,例如,get_Winners。但是如果想实现一些具体算法问题,我感觉还是用方法好,毕竟我们理解的属性就是为了存取数据用的。
你用Reflector反编译一下,就可以看到,属性就是方法的封装,是微软帮你封装好了。所以我们可以直接用属性。