関数の「静的な新しい」修飾子のポイントは何ですか?
-
20-08-2019 - |
質問
今日、私はレガシーコードで何かを見つけました。 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#がそのような構文を許可する理由について誰かが何か考えを持っていますか?
解決
削除した場合 新着 あなたが得るあなたのコードから:
警告CS0108: 'bar.do()'継承されたメンバー 'foo.do()'を隠します。隠れている場合は、新しいキーワードを使用します。
C#コンパイラは、あなたがあなたが意図していないことをしているかもしれないとあなたに警告し、あなたに挿入するように頼みます 新着 あなたが何をしているのかを知っていることを確認するためのキーワード。警告を抑制することに加えて、他の効果はありません。
他のヒント
それは外部発信者にのみ適用されます。基本クラスの静的方法を呼び出すことができるので、このようなものは有効です。
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"); }
}
見て これ
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() {}
}
あなたの例では、セカンドクラスのバーはFooから継承していないようです。そうでなければ意味をなさないので、これはタイプミスのようです。
タイプミスであると仮定すると、「新しい」修飾子は関数の基本クラスバージョンを明示的に隠します Do()
. 。これは、の派生バージョンを意味します Do()
メソッドは、基本クラスのバージョンを効果的に置き換えます。
ここで「新しい」を使用することは、継承された方法が基本クラスのバージョンの代替として意図されているという事実を文書化します Do()
.
詳細については、参照してください 新しい修飾子(C#)