32

今日、レガシー コードで何かを見つけました。1つの機能に「静的新規」があります。このように見えます。

class Foo
{
    public static void Do()
    {
        Console.WriteLine("Foo.Do");
    }
}

class Bar: Foo
{
    public static new void Do()
    {
        Console.WriteLine("Bar.Do");
    }
}

クラスBarのDoメソッドのstatic new修飾子がわかりません。C# では、静的メソッドは、オブジェクト名ではなくクラス名でのみ呼び出すことができます。ですから、「新しい」があるのとないのとでは、違いはないと思います。

一般に、構文が不要な場合、C# は単にエラーとして扱います。C# でこのような構文が許可されている理由について、誰もが何か考えを持っていますか?

4

4 に答える 4

46

コードからnewを削除すると、次のようになります。

警告 CS0108: 'Bar.Do()' は、継承されたメンバー 'Foo.Do()' を非表示にします。非表示が意図されている場合は、new キーワードを使用します。

C# コンパイラは、意図していないことを行っている可能性があることを警告し、何をしているのかを理解していることを確認するためにnewキーワードを挿入するように求めます。警告を抑制する以外に、他の効果はありません。

于 2009-03-19T06:51:05.233 に答える
14

これは、外部の発信者にのみ適用されます。基本クラスの静的メソッドを呼び出すことができるため、次のようなものが有効であることを思い出してください。

class Foo
{
    public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
    public static void Something()
    {
        Do();
    }
}

これが、警告が新しいものを配置するように指示する理由です。これを行うときの混乱を避けたいと思います。

class Foo
{
    public static void Do() { Console.WriteLine("Foo.Do"); }
}
class Bar : Foo // :Foo added
{
    public static void Something()
    {
        Do();
    }
    public static new void Do() { Console.WriteLine("Bar.Do"); }
}
于 2009-03-19T06:57:22.330 に答える
8

これを見てください

public class BaseC
{
    public static int x = 55;
    public static int y = 22;
}

public class DerivedC : BaseC
{
    // Hide field 'x'.
    new public static int x = 100;

    static void Main()
    {
        // Display the new value of x:
        Console.WriteLine(x);

        // Display the hidden value of x:
        Console.WriteLine(BaseC.x);

        // Display the unhidden member y:
        Console.WriteLine(y);
    }
}
/*
Output:
100
55
22
*/

明確にするために、あなたの例は

public class Foo
{
    public static void Do() {}
}
public class Bar :Foo
{
    public new static void Do() {}
}
于 2009-03-19T06:43:53.830 に答える
4

あなたの例では、2 番目のクラス Bar は Foo から継承していないようです。それ以外の場合は意味がないため、これはタイプミスのようです。

タイプミスであると仮定すると、「new」修飾子は関数の基本クラス バージョンを明示的に非表示にしますDo()。これは、Do()メソッドの派生バージョンが基本クラス バージョンを効果的に置き換えることを意味します。

ここで「new」を使用すると、継承されたメソッドが の基本クラス バージョンの代替として意図されているという事実が示されDo()ます。

詳細については、新しい修飾子 (C#)を参照してください。

于 2009-03-19T06:54:42.417 に答える