结构初始化产生的陷阱——学习《asp.net编程之道》

最近一段时间在学习《asp.net编程之道》,在这里我会不断地跟大家一起分享,里面的精彩内容……

技术陷阱——结构初始化产生的陷阱

陷阱产生的场景

在实际开发项目中,有时会使用结构struct。在C#语言中,结构中可以包含字段、属性、方法及构造器,使用简单的赋值语句就可以将值赋给机构中的方法或字段。下面代码中包含两个机构。

View Code

提示:这两个结构的区别是结构StructWithPublicMembers中包含两个公共成员,而结构StructWithProperties中包含两个属性

下面使用简单的赋值语句调用这两个结构,代码如下:

View Code

笔者在编译上述代码时,错误列表中提示“使用了未赋值的局部变量PropertiesStruct”,代码不能通过编译。

陷阱的排查及分析

经过一系列的排查,总结如下:

1、从错误信息中可以看出,是第二个结构PropertiesStruct的问题;

2、两个结构的赋值语句完全相同,以此可以推断:赋值过程没有问题,是结构本身定义有问题;

3、第一个结构中包含两个公共成员,赋值是没有问题,第二个结构中包含两个属性,难道是属性的问题。

原来,结构是值类型(与类不同,类是引用类型),C#语言不允许为值类型添加默认的无参数的构造器,下面为结构添加一个无参数的构造器的代码:

View Code
public struct StructWithProperties
{
public StructWithProperties(){}
private int _X;
public int X
{
get{return _X;}
set{_X=value;}
}
private int _Y;
public int Y
{
get{return _Y;}
set{_Y=value;}
}

}

陷阱的解决方法

属性必须在构造器中被初始化,虽然结构中不允许创建无参的构造器,但开发者可以使用new运算符显示地创建结构的实例,这样就不会编译出错了,代码如下:

View Code
public class client
{
public static void Main(String[] args)
{
StructWithPublicMembers MemberStruct;
StructWithProperties PropertiesStruct=new StructWithProperties();
MemberStruct.X=50;
MemberStruct.Y=100;
PropertiesStruct.X=50;
PropertiesStruct.Y=100;
}
}




 

 


posted @ 2012-01-10 08:26  liyijiu  阅读(179)  评论(0编辑  收藏  举报