为什么结构体的成员不能在声明的时候赋初值?

g1343jksd 2014-03-04 08:52:32
我这样声明一个结构体会编译不过去:

struct C
{
public int i = 0;
}

提示: cannot have instance field initializers in structs
但是如果我把struct改成class就好了。

为什么C#的语法有这样的限制呢?我知道struct意味着值类型,class意味着引用类型,为什么值类型里面的成员不支持声明时赋值。如果可以这样做的话,C#的语法会引起什么歧义或者判定上的问题吗?

求教。
...全文
1325 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Regan-lin 2014-03-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/yixiantian7/article/details/11634789
BenBenBears 2014-03-04
  • 打赏
  • 举报
回复
有几种变量在创建时自动初始化为它们的默认值。对于类类型和其他引用类型的变量,此默认值为 null。但是,由于结构是不能为 null 的值类型,结构的默认值是通过将所有值类型字段设置为它们的默认值,并将所有引用类型字段设置为 null 而产生的值。如上所述,结构的默认值就是将所有值类型字段设置为它们的默认值并将所有引用类型字段设置为 null 而产生的值。由于这个原因,结构不允许它的实例字段声明中含有变量初始值设定项。此限制只适用于实例字段。在结构的静态字段声明中可以含有变量初始值设定项。 示例 struct Point { public int x = 1; // Error, initializer not permitted public int y = 1; // Error, initializer not permitted } 出现错误,因为实例字段声明中含有变量初始值设定项。 简单的说这样是为了避免码农将值类型的变量初始化为null。
g1343jksd 2014-03-04
  • 打赏
  • 举报
回复
引用 1 楼 BenBenBears 的回复:
有几种变量在创建时自动初始化为它们的默认值。对于类类型和其他引用类型的变量,此默认值为 null。但是,由于结构是不能为 null 的值类型,结构的默认值是通过将所有值类型字段设置为它们的默认值,并将所有引用类型字段设置为 null 而产生的值。如上所述,结构的默认值就是将所有值类型字段设置为它们的默认值并将所有引用类型字段设置为 null 而产生的值。由于这个原因,结构不允许它的实例字段声明中含有变量初始值设定项。此限制只适用于实例字段。在结构的静态字段声明中可以含有变量初始值设定项。 示例 struct Point { public int x = 1; // Error, initializer not permitted public int y = 1; // Error, initializer not permitted } 出现错误,因为实例字段声明中含有变量初始值设定项。 简单的说这样是为了避免码农将值类型的变量初始化为null。
没有看懂你说的"由于这个原因,结构不允许它的实例字段声明中含有变量初始值设定项。"----这个原因和结果之间我没看出来有什么逻辑上的推理或者联系啊。 由于这个原因,怎么就不允许了呢? 就像你举的例子,如果我 Point p; 这样声明一个结构体的实例,那么x和y的值都是默认的1,都什么不妥吗? 请继续执教!
C++课后答案: 2.1 C++语言中类 class 和结构 struct 的主要区别是什么? 【解答】在 C++中,对结构体做了一个很重要的扩充,即允许结构体包含函数成 员。如此一来,我们可以使用结构体中的数据成员描述对象的属性,使用结构体 中的函数成员描述对象的操作。 2.2 什么是类的接口,什么是类的实现? 【解答】 一般把仅含函数原型的类声明部分称为类的接口; 一个类的内部数据结构和其所有成员函数的定义部分称为类的实现。 2.3 公用 public 成员和私有 private 成员有何区别? 【解答】 私有 private 成员只能被该类中的其他成员访问,而程序中的其它代码是不能直接 访问这些变量的。 公用 public 成员既可以被该类的其他成员访问,也可以被程序中的其它代码访问。 类中的公用成员对外部代码是开放的,通常情况下,程序中的其它代码通过类的 公用成员函数来访问类的私有成员。 2.4 构造函数和析构函数的主要作用是什么?它们各自有什么特性? 【解答】 构造函数是类的一种特殊成员函数,用来为对象进行初始化(给对象的成员 变量初值、申请一些 系统资源、打开文件操作等)。在对象生成的时候自动执行初始化,这会消除任何 错误地不执行初始化的可能。这是 C++面向对象程序设计帮助减少复杂性的另一 途径。 析构函数的作用与构造函数正好相反,当对象被删除时,利用析构函数进行一 些善后处理。一般情况 下析构函数执行构造函数的逆操作,例如可以利用析构函数来释放构造函数所动 态申请的内存空间。

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧