繁体   English   中英

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

[英]Using this() in C# Constructors

我一直在试图弄清楚这些构造函数之间是否存在任何差异。 假设有一个不接受 arguments 的 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 正如您从其他答案中看到的那样,它的可能性很少为人所知(我只知道它出现在规范中的一些奇怪情况)。 在你得到它的地方,它没有任何好处 - 在其他地方它可能会改变结构,这不是一个好主意。 结构应该始终是不可变的:)

编辑:只是为了让人们 go “meep!” 一点点 - 分配给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时 3 是合法的。 Go 查看他的回答!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM