购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP


陷阱06
事与愿违
——结构初始化产生的陷阱

1.陷阱产生的场景

在应用程序开发过程中,有时会用到结构struct,C#中的结构可以包含字段、属性、方法及构造器等。下面代码中包含两个结构。第一个结构是StructWithPublicMembers,该结构包含两个公共整型成员X和Y;第二个结构是StructWithProperties,该结构包含两个公共属性X和Y,这两个属性管理两个私有整型成员_x和_y。

例4.6 结构初始化产生的陷阱(光盘位置:光盘\MR\Instance\4\06\InitStruct),该实例的主要代码如下:

注意

C#中的结构与类相似,但结构缺乏某些功能,例如继承。另外,由于结构是一个值类型,因此通常创建结构要比创建类的速度快。如果你有一些紧凑循环,需要在其中创建大量新数据结构,则应考虑使用结构而不是类。结构还用于封装数据字段组,例如网格上点的坐标或矩形的尺寸。

下面使用赋值语句分别给上面两个结构中的公共字段和属性赋值,具体代码如下:

当编译以上代码时,却出现了编译错误,在错误列表中提示“使用了未赋值的局部变量‘PropertiesStruct’”,如图4.10所示。

图4.10 错误提示

2.陷阱的分析

从上面的错误提示中可知,包含公共字段的结构能够正常编译,但包含属性的结构编译出错。进一步分析,两个结构变量的定义方式相同,只是调用的成员不同,一个结构变量调用公共字段;另一个结构变量调用属性,而出现问题的恰恰是调用属性的那个结构变量,这也许就是问题的突破口,事实证明这种判断是正确的。原因是,在C#语法中,当调用结构体的属性或方法时,需要使用new关键字来声明结构变量,而上面的两个结构变量的声明都没有使用new关键字。

注意

在C#语言中,不允许在结构中显示声明无参构造方法(即默认构造器)。但可以显示声明其他有参数的重载构造方法。

3.陷阱的解决方法

使用new关键字定义结构变量,这样就不会编译出错了,具体代码如下所示:

说明

通过上面的代码,可以做出以下总结,当调用结构的公共字段时,可以不使用new关键字来定义结构变量;当调用结构的属性或方法时,必须使用new关键字来定义结构变量。 fCrjKNS4Qup5MJe69lhauuF7oQrXiE7n+A0oCkIsFmIBM2Cv0Aw0hOS1JFa5JhBl

点击中间区域
呼出菜单
上一章
目录
下一章
×