簡體   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