程序出自我的一个小项目:
Point endFt;
if(isshow)
{
endFt = new Point(200,200);
}
if (x != 0 && y != 0 && endFt != null)
{
Point pCenterPoint = new Point(x, y);
Point pEndPoint = endFt;
}
在这段程序中编译时会出错说 Error:Use of unassigned local variable 'endFt'(Point pEndPoint = endFt;本行中)
我们在 if (x != 0 && y != 0 && endFt != null)中指明了endFt为空时不往下执行,当然此问题有很多办法解觉,但我觉得编译器应该能做些判断.算是给microsoft的一点见意,可能是我考虑欠全面,大家也表明一下看法
Point endFt;
if(isshow)
{
endFt = new Point(200,200);
}
if (x != 0 && y != 0 && endFt != null)
{
Point pCenterPoint = new Point(x, y);
Point pEndPoint = endFt;
}
在这段程序中编译时会出错说 Error:Use of unassigned local variable 'endFt'(Point pEndPoint = endFt;本行中)
我们在 if (x != 0 && y != 0 && endFt != null)中指明了endFt为空时不往下执行,当然此问题有很多办法解觉,但我觉得编译器应该能做些判断.算是给microsoft的一点见意,可能是我考虑欠全面,大家也表明一下看法
Point endFt;
语法都是正确的,现在只是想让他初始为空!
Point endFt;就已经给endFt赋值了,不需要再new Point(),没有指定,系统会默认endFt.X = 0;endFt.Y = 0;所以当然不会出现endFt == null;
你先了解一下什么叫引用类型和值类型,了解一下这些基础知识。
*****************************************************************************
欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码)
http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
Point endFt; 在申明的时候,只是给他一个类型,让编译器了解其数据结构,以便在运行期的时给其赋予恰当的值。Point endFt= new Point(); 在定义的时候,会调用默认的构造函数,初始化其值,并且分配实际的内存空间。比如你写 DataSet ds; 但以后不用他,编译器会说 “声明了变量“ds”,但从未使用过”,
但如果你写 DataSet ds=new DataSet(); 就没有任何问题。
省点力气吧 先把语法弄明白了
我所说的出错不是这个错,而是 Error:Use of unassigned local variable 'endFt'(Point pEndPoint = endFt;
确实是编译器的原因。Point endFt;
因为Point是值类型,所以IL指令自动为其在工作进程栈中分配了地址,并将endFt的值赋为0(二进制意义上的0,具体我也不是很明白,底层知识不够)。所以流程会进入(endFt!=null)的判断。但因为如果RefPoint是引用类型,那么
RefPoint refPoint;这种只声明而不实例化的情况下,refPoint == null;因为refPoint在工作进程栈中作为指针没有指向托管区内任何对象。所有的struct和enmurator类型都是值类型,所有的class都是引用类型。在你声明的时候,编译器能够区分你声明的变量是何类型,IL指令也会相应分配进程内存和托管区空间,但编译器需要你实例化(就是手动指定内存空间)才能编译通过,确实只是编译器的规范化限制。