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

关于属性的问题
我想问一下:
1、在什么情况下要将属性定义为可读可写的?
2、在什么情况下将属性定义为只可读的?
3、在什么情况将属性定义为只可写的?
这个问题一直不是很明白,麻烦各位在解答的时候能够说的详细一点。

------解决方案--------------------
举几个例子,这些例子并不是告诉你只读、只写属性的所有运用场合,只是给你一些启发:
比如说,有几个属性,它们彼此相关,典型的我们定义这样一个类

class Address
{
    public Address(string country, string province, string city)
    {
        Country = country; Province = province; City = city;
    }
    public string Country { get; private set; }
    public string Province { get; private set; }
    public string City { get; private set; }
}


我们只允许通过构造函数一次性设置国家、省、市三个字段,而不允许分别设置。这样做的好处在于,保持任何时候一个地址对象永远是有效的。
假设不这么做,而是允许分别设置,那么这个对象就存在程序只更新了国家字段,在更新省、城市的时候因为某种原因没有更新完成,而导致出现一个无效的状态,比如中国华盛顿州洛杉矶市;或者中国安徽省济南市这种因为只更新了部分字段而造成的无效状态。
在.NET类库中,Font、DateTime都使用了类似的技巧避免数据不完整的问题。

至于只写属性,这个比较罕见,比如说当我们访问一个不能随机读写的存储设备,我们可以通过只写属性改变它的存储,而在内部通过命令重排优化其写入的过程,因为在写入前,它的状态是随机的,所以读取它没有什么意义。因为只写属性只在很少的场合使用,所以除非你知道你这么做的目的,否则不要滥用它。

当你定义一个只写属性,会收到一个编译器警告。http://msdn.microsoft.com/zh-cn/library/vstudio/ms182165.aspx
------解决方案--------------------
你的问题不好回答,因为你对面向对象编程还没有入门,需要你在今后的学习中慢慢体会。
可读可写就是这个属性需要在类外部进行读取和更改。
只可读,就是这个属性在类外部只可以读取,不需要去更改或者不能更改。
只可写,就是这个属性可以在类外部更改,但是只能在类内部使用。
至于怎么应用到实例当中,就要看你的属性是什么了。
------解决方案--------------------
关于只读属性,我还可以举一些例子,比如说你定义一个气象预报的类,它可以从服务器返回当前的天气。

但是明显这个数据是单向流动的,气象台更新到服务器,你的程序从服务器获取。你能“更改”明天的天气么?很多类似的场合,我们只能获取数据,无法改变它,或者无需改变它,我们可以使用只读属性。