c# - 没有默认构造函数和自动属性,为什么它仍然可以编译

标签 c# .net oop

我是 C# 新手,只是关于默认构造函数和自动属性的问题。基于 stackoverflow 上的一个问题: How can I set the value of auto property backing fields in a struct constructor?

所以我们有以下结构

public struct SomeStruct
{
   public SomeStruct(String stringProperty, Int32 intProperty)
   {
      this.StringProperty = stringProperty;
      this.IntProperty = intProperty;
   }
   public String StringProperty { get; set; }
   public Int32 IntProperty { get; set; }
}

但是为什么它在不通过 :this() 调用默认构造函数的情况下对我来说编译得很好? 另一个问题是为什么同样的规则不适用于类(class)?你可以有一个没有默认构造函数的自动属性吗?

最佳答案

最终,结构在可以作为整个值进行访问之前,对明确的赋值有严格的规则(这是 this 访问所必需的);在 C# 6 之前,编译器不会将构造函数中的自动属性视为明确赋值的一部分,因此调用属性 setter 的访问被视为无效。从 C# 6 开始,确实如此(将自动属性视为结构构造函数中明确赋值的一部分),因此所示的代码现在有效。

因为它是有效的(对于任何最新的编译器,即使您设置的语言级别早于 C# 6),它也会编译。

但请注意,这适用于构造函数内部。以下内容仍然无效(尽管它适用于裸字段):

SomeStruct x;
x.StringProperty = "abc"; // CS0165 Use of unassigned local variable x
x.IntProperty = 123;
SomeMethod(x);

关于c# - 没有默认构造函数和自动属性,为什么它仍然可以编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56423055/

相关文章:

c# - 如何检查 Xamarin.Android 中的内存泄漏?

c# - 使用 C# 使用 Assembly GetManifestResourceStream 方法读取资源文件

oop - 类成员变量不和全局变量一样糟糕吗?

c# - GridView 验证将整行标记为无效,而不仅仅是单元格

c# - 允许移动用户下载和安装应用程序的本地服务器......这样的事情可能吗?

c# - 如何防止错误的项目引用?

java - 动态实现接口(interface)?

.net - DOT NET 中的文件夹名称访问速度非常慢 - 或文件夹迭代速度问题

c# - 检查对象是否为空或 null

oop - 如何通过查看程序集来判断程序是否使用动态调度