在C#构造函数中使用this()

Tim*_*Tim 10 c# constructor

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

例1

public Foo()
    : this()
{
     blah;
     blah;
     blah;
}
Run Code Online (Sandbox Code Playgroud)

例2

public Foo()
{
     this();
     blah;
     blah;
     blah;
}
Run Code Online (Sandbox Code Playgroud)

例3

public Foo()
{
     this = new Foo();
     blah;
     blah;
     blah;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 32

  • 示例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
    }
}
Run Code Online (Sandbox Code Playgroud)


mqp*_*mqp 11

示例2和3不是合法的C#.

编辑:乔恩准确地指出3是合法Foostruct.去看看他的答案吧!