c# - 结构初始化和新操作符

标签 c# .net struct

我在 C# 中有两个相似的结构,每个都包含一个整数,但后者实现了 get/set 访问器。

为什么我必须在分配 a 字段之前使用 new 运算符初始化 Y 结构?当我用 new 初始化 y 时它仍然是一个值类型吗?

public struct X
{
    public int a;
}

public struct Y
{
    public int a { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        X x;
        x.a = 1;

        Y y;
        y.a = 2; // << compile error "unused local variable" here

        Y y2 = new Y();
        y2.a = 3;
    }
}

最佳答案

一个有效而另一个无效的原因是您不能在未初始化的对象上调用方法。属性 setter 也是方法。

public struct X
{
    public int a;
    public void setA(int value)
    { this.a = value; }
}

public struct Y
{
    public int a { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        X x;
        x.setA(1); // A: error
        x.a = 2; // B: okay

        Y y;
        y.a = 3; // C: equivalent to A
    }
}

不允许的原因是属性 setter 可以观察到对象的未初始化状态。调用者不知道属性 setter 是仅仅设置一个字段,还是做更多的事情。

关于c# - 结构初始化和新操作符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20226477/

相关文章:

c# - C# 编程的 XML 注释技巧

c# - 字符串插值与 String.Format

.net - 带有 .Net 的 Active Directory 服务器

python - 读取 Wireshark 转储文件中的数据包时间

c# - 如何确定新创建的对象是否具有用户设置的任何属性值

c# - 使用 HttpClient 获取 Bearer Token

c# - 如何阻止我的 System.Messaging.MessageQueue 将我的字符串包装在 XML 中?

.net - 如何在 webapi 中手动优化文件夹中的多个图像(减小文件大小)?

c - 使用malloc和直接初始化到堆栈在内存空间方面的区别

c++ - std::sort 函数给出 "Bus error: 10"