感觉结构体的成员初始化跟赋值非常麻烦,为什么不能像class那样简洁
感觉结构体的成员初始化和赋值非常麻烦,为什么不能像class那样简洁?
首先,struct不能声明无参的构造函数, 是因为编译器默认会给我声明一个无参的并初始化成员?
但是这样我感觉更加麻烦了,例如我有:
我必须先初始化一个s obj,然后obj.m_i=3; obj.m_s=2 这样来赋值
不能像class那样,变量声明后面直接给一个初始值。而class是可以这样做的。
所以我不明白的地方是,为什么struct不让我在声明成员变量的时候给个初始值,这样做的好处或者出发点是什么?
看不出来这种限制产生的原因!
------解决思路----------------------
可以直接初始化赋值的,结构体里写个new方法
------解决思路----------------------
相对class来说,struct是轻量的一种’结构‘,它可以不用’显式‘的初始化。
比如Point points = new Point[2];
MessageBox.Show("x=" + points[0].X); // 可以直接使用,不需要points[0] = new Point()的赋值过程。
‘不用’显式‘的初始化’,是因为结构有固定的大小,而且根据C#语言规范(11.3.4 Default values),结构成员将初始化为默认值。
‘不用’显式‘的初始化’‘,也说明了没有人调用结构的自定义初始化,因此obj.m_i=3; 的赋值不能保证得到执行。
------解决思路----------------------
如果要赋初值,写个有参的构造函数就行了。为什么一定要在没有构造函数的情况下,让一些成员自动取了一个业务上有特定意义的值,这种做法是不透明的做法。
------解决思路----------------------
为了效率考虑
首先一个类可以给成员初始化,其本质是编译器会为将这些初始化过程插入默认构造函数的起始位置
如果一个结构体也可以写一个默认的构造函数,意味着int,float这些变量也会拥有默认构造函数
向int[] arr = new int[1000]时就需要有1000次的函数调用,这样显然是不愿意看到的
------解决思路----------------------
struct 本来就是 C/C++ 语言的一个数据块,C# 将其保留并对其对象化应该是出于无奈
毕竟 C/C++ 程序员习惯于把数据块定义成 struct 而不是 class
如果 C# 丢弃了太多 C/C++ 语法成分的话,C# 就没法与 Java 拼命了
首先,struct不能声明无参的构造函数, 是因为编译器默认会给我声明一个无参的并初始化成员?
但是这样我感觉更加麻烦了,例如我有:
struct s
{
int m_i ;
short m_s;
}
我必须先初始化一个s obj,然后obj.m_i=3; obj.m_s=2 这样来赋值
不能像class那样,变量声明后面直接给一个初始值。而class是可以这样做的。
所以我不明白的地方是,为什么struct不让我在声明成员变量的时候给个初始值,这样做的好处或者出发点是什么?
看不出来这种限制产生的原因!
------解决思路----------------------
可以直接初始化赋值的,结构体里写个new方法
------解决思路----------------------
相对class来说,struct是轻量的一种’结构‘,它可以不用’显式‘的初始化。
比如Point points = new Point[2];
MessageBox.Show("x=" + points[0].X); // 可以直接使用,不需要points[0] = new Point()的赋值过程。
‘不用’显式‘的初始化’,是因为结构有固定的大小,而且根据C#语言规范(11.3.4 Default values),结构成员将初始化为默认值。
‘不用’显式‘的初始化’‘,也说明了没有人调用结构的自定义初始化,因此obj.m_i=3; 的赋值不能保证得到执行。
------解决思路----------------------
如果要赋初值,写个有参的构造函数就行了。为什么一定要在没有构造函数的情况下,让一些成员自动取了一个业务上有特定意义的值,这种做法是不透明的做法。
------解决思路----------------------
为了效率考虑
首先一个类可以给成员初始化,其本质是编译器会为将这些初始化过程插入默认构造函数的起始位置
如果一个结构体也可以写一个默认的构造函数,意味着int,float这些变量也会拥有默认构造函数
向int[] arr = new int[1000]时就需要有1000次的函数调用,这样显然是不愿意看到的
------解决思路----------------------
struct 本来就是 C/C++ 语言的一个数据块,C# 将其保留并对其对象化应该是出于无奈
毕竟 C/C++ 程序员习惯于把数据块定义成 struct 而不是 class
如果 C# 丢弃了太多 C/C++ 语法成分的话,C# 就没法与 Java 拼命了