我一直在试图弄清楚这些构造函数之间是否存在任何差异。假设有一个不带参数的 Foo() 构造函数,所有这些构造函数都会有相同的结果吗?

实施例1

public Foo()
    : this()
{
     blah;
     blah;
     blah;
}

实施例2

public Foo()
{
     this();
     blah;
     blah;
     blah;
}

实施例3

public Foo()
{
     this = new Foo();
     blah;
     blah;
     blah;
}
有帮助吗?

解决方案

  • 示例 1 是有效的(假设有一个无参数构造函数),并且调用无参数构造函数作为初始化的一部分。看我的 关于构造函数链的文章 更多细节。编辑:请注意,自从OP编辑以来,它是无限递归的。
  • 示例 2 永远无效
  • 示例 3 仅当 Foo 是结构体时才有效,并且不执行任何有用的操作。

我会避免分配给 this 在结构中。从其他答案可以看出, 可能性 它的鲜为人知(我只知道因为它出现在规范中的一些奇怪的情况)。在你得到它的地方,它没有任何好处 - 在其他地方它可能会改变结构,这是 不是 一个好主意。结构应该始终是不可变的:)

编辑:只是为了让人们“喵喵喵”一点 - 分配给 this 与链接到另一个构造函数不太一样,因为您也可以在方法中执行此操作:

using System;

public struct Foo
{
    // Readonly, so must be immutable, right?
    public readonly string x;

    public Foo(string x)
    {
        this.x = x;
    }

    public void EvilEvilEvil()
    {
        this = new Foo();
    }
}

public class Test
{
    static void Main()
    {
        Foo foo = new Foo("Test");
        Console.WriteLine(foo.x); // Prints "Test"
        foo.EvilEvilEvil();
        Console.WriteLine(foo.x); // Prints nothing
    }
}

其他提示

示例2和3不合法C#。

编辑:当 Foo struct 时,Jon准确地指出3是合法的。去看看他的回答!

不,他们不会,因为只有第一个构造函数实际上是合法的。其他两个因各种原因是非法的。

编辑有趣的是,当Foo是一个结构时,3确实合法。但即使在这种情况下,这也是一项冗余任务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top