深夜在线等:C# 结构 使用new来实例化和不使用new的区别

来源:百度知道 编辑:UC知道 时间:2024/05/31 04:46:33
网上查资料说:如果使用 new 运算符创建结构对象,则会创建该结构对象,并调用适当的构造函数。与类不同,结构的实例化可以不使用 new 运算符。如果不使用 new,则在初始化所有字段之前,字段都保持未赋值状态且对象不可用。
后面这句话如果不使用 new,对象不可用,不对象不可用就不能调用某个属性吗,比如struct Mystr {int a=1;int b=2};Mystr mystr1;这个mystr1对象不可用吗,但我明明看到别人用它!mystr1.a,就这么用的!

结构是值类型,首先 NEW 在结构的使用有 类类型有所不同,
类类型使用new 是调用构造函数在托管堆分配内存存储空间,返回其地址。而结构类型使用new 不会分配托管堆分配内存而是调用构造函数初始化字段。结构的构造函数要么是有参数的,不可能是无参数,应为无参数是系统自己隐式添加的,就算有另外的构造函数,如果你显示的声明一个无参数的构造函数在结构里,将导致编译错误。
结构的是值类型 存储在栈中,值类型的变量即包括变量地址和变量内容所以可以直接像int ,double ..等使用,不要需要new 使用new 只是说可以方便一点初始化字段,但需要自己添加构造函数。
struct my
{
int x;
int y;
my(int x,int y)
{this.x=x;this.y=y}
}

my mytest=new my(10,10);
这样mytest.x 和mytest.y 都初始化为10;
结构还可以这么初始化
my mytest; 现在的mytest 数据值类型变量
mytest.x=XX;

而引用类型就不允许这么做,引用类型存储其地址,所以需要使用new返回地址及分配空间。

不能在结构中初始化字段,
比如
struct my
{
int x=10;
}
将导致编译错误,因为my现在属于一个数据类型,它不占用存储空间,只有在定义变量的时候才能初始化使用
struct my
{
int x;
}
my mytest;
mytest.x=10;