WEB开发网
开发学院软件开发C语言 创建常量、原子性的值类型 阅读

创建常量、原子性的值类型

 2009-03-26 08:22:16 来源:WEB开发网   
核心提示: 结果是出现了数据不一致的问题,当为Zip赋值的时候,创建常量、原子性的值类型(3),因为引发了异常,所以对Zip以及其后的Province的赋值都失败了,而为了实施常量性,我们不允许在为对象赋值以后还能对对象状态进行修改,但是对City的赋值是成功的,结果就是出现了Provice是陕西

结果是出现了数据不一致的问题,当为Zip赋值的时候,因为引发了异常,所以对Zip以及其后的Province的赋值都失败了,但是对City的赋值是成功的。结果就是出现了Provice是陕西,City却是青岛这种情况。

即是在赋值Zip时没有引发异常,也会出现问题:在多线程情况下,当当前线程执行到修改了 City为“青岛”,但还没有修改 Zip 和 Province的时候(Zip仍为 “710068”、Province仍为“陕西”)。如果此时其他线程访问类型实例a,那么也将会读取到不一致的数据。

常量性和原子性

我们现在已经知道了上面存在的问题,那么接下来该如何改进呢?我们先来看看作者对常量性和原子性给的定义:

对象的原子性:对象的状态是一个整体,如果一个字段改变,其他字段也要同时做出相应改变。简单来说,就是要么不改,要么全改。

对象的常量性:对象的状态一旦确定,就不能再次更改了。如果想再次更改,需要重新构造一个对象。

我们已经知道了对象的原子性和常量性这两个概念,那么接下来该如何去实施呢?对于原子性,我们实施的办法是添加一个构造函数,在这个构造函数中为对象的所有字段赋值。而为了实施常量性,我们不允许在为对象赋值以后还能对对象状态进行修改,所以我们将属性中的set访问器删除掉,同时将字段声明为readonly:

public struct Address {
    private readonly string province;
    private readonly string city;
    private readonly string zip;

    public Address(string province, string city, string zip) {
       this.city = city;           
       this.province = province;
       this.zip = zip;
    CheckZip(zip);     // 验证格式
    }

    public string Province {
       get { return province; }
    }

    public string City {
       get { return city; }
    }

    public string Zip {
       get { return zip; }
    }
    // 其余略 ...
}

上一页  1 2 3 4 5  下一页

Tags:创建 常量 原子

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接