拡張メソッドと継承の間に何らかの関係を築くことはできますか?
new
それとも、C# で -keywordを使用するのと同様の拡張メソッドですか?
拡張メソッドと継承の間に何らかの関係を築くことはできますか?
new
それとも、C# で -keywordを使用するのと同様の拡張メソッドですか?
両方の質問にいいえ。拡張メソッドは、実際には、拡張機能が最初のパラメーターとして操作するオブジェクトを取るメソッドです。
キーワードは、クラスのnew
インスタンスにリソースを割り当てるために使用されます。null
拡張メソッドはインスタンスで動作しますが、最初のパラメーターとしてインスタンス (またはその型) を必要とするため、新しい置換として機能することはできません。
検討:
public static class StringExtensions
{
public static string Reverse(this string _this)
{
// logic to reverse the string
}
}
この静的メソッドは、次の 2 つの方法で呼び出すことができます。
// as an extension method:
string s = "hello world";
string t = s.Reverse();
// as a static method invocation:
string t = StringExtensions.Reverse(s);
いずれの場合も、コンパイラは MSIL の呼び出しを変更して、2 番目の呼び出しをマップします。コンパイル後、-キーワードなしでは拡張メソッドを対応する静的メソッドから認識する方法はありませんthis
。
要約する
new
(ただし、メソッド内でクラスをインスタンス化することはもちろん可能です)。null
ますが、それ以外の場合、そのクラスのメソッドはNullReferenceException
. これは、インスタンスが単に静的メソッドの最初のパラメーターであるという事実から生じます。string
、これは継承では不可能です (シールされたクラスから派生することはできません)。編集: Tigran とFloran
は、この質問がnew modifierに関するものであることをほのめかしました。
拡張メソッドは、キーワードのどちらの意味とも関係ありません。new
ただし、相互に関連するいくつかの考えがあります。これ以上混乱しないことを願っています。もしそうなら、「編集」の上の部分に固執してください;)
新しい修飾子について:
新しいジェネリック制約について:
拡張メソッド自体はジェネリックにすることができ、パラメーター (つまり、それが操作できるクラス) は新しいジェネリック制約によって制限できます。
// this ext. method will only operate on classes that inherit
// from ICollectible and have a public parameterless constructor
public static int CalculateTotal<T>(this T _collectible)
where T : ICollectible, new()
{
// calculate total
}
いいえ、拡張メソッドは既存のクラスの機能を拡張するだけです。
拡張メソッドを使用すると、新しい派生型を作成したり、再コンパイルしたり、元の型を変更したりすることなく、既存の型にメソッドを「追加」できます。
拡張メソッドに関するMSDN(C#プログラミングガイド)を参照してください。
このnew
キーワードはoverride
、基本クラスの非仮想メソッドと静的メソッドを使用できるようにするために必要です。
public class A
{
public virtual void One();
public void Two();
}
public class B : A
{
public override void One();
public new void Two();
}
B b = new B();
A a = b as A;
a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B
vsでこのリンクをnew
override
チェックしてください。
いいえ。拡張メソッドは、「拡張」される型のオブジェクトを最初の引数として受け取る、個別の静的クラスの構文糖衣です。継承とはまったく関係ありません。このメソッドは、他のクラスと同様に、「拡張」クラスのパブリック メンバーにのみアクセスできます。
拡張メソッドは、継承やnew
キーワード (またはコンストラクター) とは関係ありません。ソースコードを持っていないクラスに機能を追加したい場合、より良いコードを可能にします。ソース コードがある場合にも機能しますが、通常はソース コードを変更するだけの方が適切です。
たとえば、これを実行できるようにしたい場合があります。
string text = "this is my string";
int count = text.WordCount();
このメソッドはクラスに存在しないため、次のString
ようにする必要があります。
string text = "this is my string";
int count = MyCommon.WordCount(text);
whereWordCount()
は、ある種の一般的なライブラリの静的メソッドです。
ただし、拡張メソッドを使用すると、次のこともできます。
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
クラスtext.WordCount()
で定義された通常のメソッドであるかのように機能します。String
それだけで少し使いやすくなります。
hereから取得したコードも読むことをお勧めします。