web-dev-qa-db-ja.com

constructor-extension-methodを作成することは可能ですか?どうやって?

コンストラクター拡張メソッドを追加することは可能ですか? List <T>コンストラクターを追加して、特定の部分的に満たされたバッファーから特定の量のバイトを受け取ります(関連するバイトのみをコピーするなどのオーバーヘッドなし)。

...
public static List<T>(this List<T> l, T[] a, int n)
{
    for (int i = 0; i < n; i++)
       l.Add(a[i]);
}
...

そのため、使用法は次のようになります。

List<byte> some_list = new List<byte>(my_byte_array,number_of_bytes);

AddRange拡張メソッドを既に追加しました:

public static void AddRange<T>(this List<T> l, T[] a, int n)
{
   for (int i = 0; i < n; i++)
       l.Add(a[i]);
}

コンストラクターとしてもやりたいです。出来ますか ?はいの場合-方法は?

73
Tar

いいえ。ただし、AddRange署名を変更してリストインスタンスを返す場合は、少なくとも

var list = new List<int>().AddRange(array, n);

とにかくコンストラクターをオーバーロードするよりも、おそらくこの方が明確です。

52

SWekoの答えは基本的に正しいですが、もちろん彼がリンクしている記事は拡張コンストラクタではなく拡張プロパティに関するものです。

また、拡張プロパティを作成すると同時に、拡張コンストラクターの大まかな設計も行いました。それらは、ファクトリーパターンのニース構文糖です。ただし、設計段階を通過することはありませんでした。この機能はニースですが、本当に必要ではなく、素晴らしい新しいシナリオを有効にしません。

拡張コンストラクタが解決するような本当に素晴らしい問題があれば、もっと詳細を聞いてうれしいです。実際のフィードバックが多いほど、毎年得られるさまざまな機能提案の相対的なメリットをより適切に評価できます。

35
Eric Lippert

一言で言えば-いいえ。説明のために this を見てください。

それらはC#3機能リストから切り取られ、次にC#4機能リストから切り取られ、C#5機能を作成できることを期待できますが、私はあまり楽観的ではありません。

20
SWeko

これはバンプであることを知っていますが、Listクラスを継承して次のようなことができることを指摘したかっただけです。

class List<T> : System.Collections.Generic.List<T>
    {
        public List(T[] a, int n)
            : base()
        {
                AddRange(a, n);
        }
    }
11
Bauss