【问题标题】:Why cant we set the value of a property created in a structure without creating the constructor of the structure in C#? [duplicate]为什么我们不能设置在结构中创建的属性的值而不在 C# 中创建结构的构造函数? [复制]
【发布时间】:2021-04-06 12:40:46
【问题描述】:

我在结构中创建了一个字段和一个 int 类型的自动实现属性。

为什么不创建结构体的构造函数可以给字段赋值却不能设置属性值?

编辑:图片已更新

【问题讨论】:

  • 你还没有创建s1Mystruct s1 = new Mystruct();
  • @JohnnyMopp 我认为这才是问题的关键:您可以在未初始化的结构上分配字段,但不能在属性上分配字段
  • @canton7 我认为可能是这种情况,但从措辞上看不清楚。我想这就是 without 创建构造函数 所指的?
  • 是的,我认为他们的意思是“不调用构造函数”。从代码示例中可以很清楚地看到

标签: c# oop


【解决方案1】:

来自the language reference

通常,您通过使用 new 运算符调用适当的构造函数来实例化结构类型。每种结构类型至少有一个构造函数。这是一个隐式的无参数构造函数,它产生类型的默认值。您还可以使用默认值表达式来生成类型的默认值。

如果结构类型的所有实例字段都可以访问,您也可以在不使用 new 运算符的情况下对其进行实例化。在这种情况下,您必须在第一次使用实例之前初始化所有实例字段。

所以你可以通过调用它的构造函数来初始化一个结构,或者你可以声明一个未初始化的结构,然后在第一次使用之前手动初始化它的每个字段。

这里的诀窍是您确实需要直接分配每个 field - 您不能调用初始化字段的方法(或属性设置器,这是一种特殊类型的方法) .这意味着如果您的结构具有自动属性,则不能使用此技术,因为无法直接初始化自动属性的支持字段。

(这是因为编译器需要检查您是否已明确分配给每个字段。如果您调用分配这些字段的方法/属性设置器,编译器无法检查该方法正在做什么,特别是如果该结构在单独的程序集中声明,这意味着它可以更改)。

【讨论】:

  • 我可能会指出,由于需要明确分配,这是一个特定的 C# 问题/边缘情况。 VB.Net 没有这个问题。当您分配 s1 = new Mystruct(); 时,C# 和 VB 都会发出 initobj 指令,它实际上将所有字段初始化为默认值。
  • 我不会说这是个问题:这是规范的一个奇怪的角落。规范同样可以决定禁止这样做并强制用户调用结构的构造函数之一。
猜你喜欢
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2019-07-11
  • 2016-09-23
  • 1970-01-01
相关资源
最近更新 更多