如果定义这样的一个结构:struts S{
public int P{get;set;}
}我们知道未赋值的局部变量是不能使用的,所以下面这句不能通过编译:S s;
s.ToString();正确做法应该是:S s=new S();
s.ToString();但是却惊奇的发现这样的使用下面语句居然也能通过编译:S s;
s.P=0;
s.ToString();给s的属性赋值就能编译通过了。难道C#的编译看到"="号就放过吗?
public int P{get;set;}
}我们知道未赋值的局部变量是不能使用的,所以下面这句不能通过编译:S s;
s.ToString();正确做法应该是:S s=new S();
s.ToString();但是却惊奇的发现这样的使用下面语句居然也能通过编译:S s;
s.P=0;
s.ToString();给s的属性赋值就能编译通过了。难道C#的编译看到"="号就放过吗?
不是属性是字段:struts S{
public int P;
}最近vs2008用的多了些,习惯性的写成属性了...
这个也写错了
杯具啊
有米有赋值应该都算有实例的吧(反正就是有值的,不知怎么表达)
就是语法问题了吧。
我感觉在为写s.P=0;之前,并没给s赋值,所以会报错,写完后,通过s.P给P赋值了,s里也就有具体的值了,所以不会报错吧……
个人猜测……菜鸟、小易 上。
Console.WriteLine(s.p);//也是会报错,所可能使用未赋值的变量
s.p = 1;
s.ToString();
------------------
对应的CIL是:.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 24 (0x18)
.maxstack 2
.locals init (valuetype CSDN_Testing.S V_0)
IL_0000: nop
IL_0001: ldloca.s V_0
IL_0003: ldc.i4.1
IL_0004: stfld int32 CSDN_Testing.S::p
IL_0009: ldloca.s V_0
IL_000b: constrained. CSDN_Testing.S
IL_0011: callvirt instance string [mscorlib]System.Object::ToString()
IL_0016: pop
IL_0017: ret
} // end of method Program::Main会看到s.ToString()是调用object实例方法ToString()
{
public int P;
public int Q;
}熟悉就好了。不过我肯定不会去熟悉它——我从来不使用struct。
struct不用new。使用new初始化的方式只是兼容类的写法。
你写不写new实际上都已经创建好一个结构体了。
但是没有初始化就使用,在编译时候就会提示错误。
刚才又试验了一下,如果结构含有属性,则必须要new一下才能使用
“如果不使用 new,则在初始化所有字段之前,字段都保持未赋值状态且对象不可用。”
关键...
msdn不是解释了嘛,编译器本来就是这样刻意设计的,以方便两种不同习惯的人确保编程正确(而不是少写几个字母)。
如果结构某些字段是私有的private,
这样的用法就行不通了个人感觉通用性不强。不过我很少用结构,这个特性反正没影响我呵呵
特别是除以零的情况,就让其值为零就是了嘛如:123/0=0 很多情况都需要这么用的。打屁多事,弄得sql语句里边一大堆的case when、excel公式里边一大堆的iserror。