2009-03-19 6 views
21

今日、私はレガシーコードで何かを見つけました。 1つの機能に対して「静的な新規」があります。それはこのように見えます。関数の静的な新しい修飾子のポイントは何ですか?

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

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

私はクラスバーいます方法について静的新しい修飾子を理解していません。 C#では静的メソッドはオブジェクト名ではなくクラス名で呼び出すことができます。だから、私は "新しい"とないことの間に差があるとは思わない。

一般に、いくつかの構文が不要な場合、C#はエラーとみなします。 誰かがC#でそのような構文を許可する理由を知っていますか?

答えて

37

次のようになります。

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

C#コンパイラは、ちょうどあなたが意図していなかった何かをやっている可能性があることを警告し、あなたが何をしているか知っていることを確認する新しいキーワードを挿入するように要求されます。警告を抑制するだけでなく、他の効果もありません。

+12

警告は表示されません。他の効果はありません。 –

+0

良い点。私はそれをアンガーに加えた。 –

+4

警告を抑制するだけですが、混乱を避けるために明示的に意図しています。 – eglasius

7

this

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() {} 
} 
4

例では、2番目のクラスのBarはFooから継承されていないようです。そうでなければ意味がないので、これはタイプミスのようです。

typoであると仮定すると、 "new"修飾子は、関数Do()の基本クラスバージョンを明示的に隠します。これは、派生バージョンのDo()メソッドが実質的に基本クラスのバージョンを置き換えることを意味します。

"new"は、継承されたメソッドが基本クラスのバージョンDo()の代わりに使用されることを示しています。詳細については

、唯一の外部発信者に対して適用されるnew Modifier (C#)

+0

[新しい修飾子](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/new-modifier)の最新のドキュメントです。 – zodo

10

を参照してください。あなたは、基本クラスの静的メソッドを呼び出すことができることに注意してくださいので、このようなものは有効です。

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"); } 
} 
関連する問題