2

.Net フレームワークが舞台裏で何をしているのかをどのように証明できるのか疑問に思っています。

のパラメーターを受け入れるメソッドがありますList<String> originalParameterList

私の方法でList<String> newListObjは、次のようにすると別の方法があります。

List<String> newListObj = originalParameterList
    newListObj.Add(value);
    newListObj.Add(value1);
    newListObj.Add(value2);

originalParameterList の数が増えます (+3)。

私がこれを行う場合:

List<String> newListObj = new List<String>(originalParamterList);

newListObj.Add(value);
newListObj.Add(value1);
newListObj.Add(value2);

originalParameterList のカウントは同じ (+0) のままです。

また、このコードが同じように動作することもわかりました。

List<String> newListObj = new List<String>(originalParamterList.ToArray());

newListObj.Add(value);
newListObj.Add(value1);
newListObj.Add(value2);

originalParameterList のカウントは同じ (+0) のままです。

私の質問は、.Net Framework が舞台裏で何をしているのかを決定的な方法で確認する方法はありますか?

4

7 に答える 7

1

アセンブリをILDASMにロードし、(ロードされたときに)メソッドを見つけてダブルクリックすると、そのメソッドのcilコードが表示されます.検索でWindowsのスタートメニューに「IL」と入力するだけです.

または、次の方法を使用して、新しい独立したリストを作成することもできます

        private void GetList(List<string> lst)
        {
            List<string> NewList = lst.Cast<string>().ToList();
            NewList.Add("6");
            //not same values.
            //or....
            List<string> NewList = lst.ConvertAll(s => s);
            NewList.Add("6");
            //again different values

        }
于 2013-06-28T17:05:23.000 に答える
0

これは List コンストラクターのコードです。

public List(IEnumerable<T> collection)
{
    if (collection == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
    }
    ICollection<T> collection2 = collection as ICollection<T>;
    if (collection2 != null)
    {
        int count = collection2.Count;
        this._items = new T[count];
        collection2.CopyTo(this._items, 0);
        this._size = count;
        return;
    }
    this._size = 0;
    this._items = new T[4];
    using (IEnumerator<T> enumerator = collection.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            this.Add(enumerator.Current);
        }
    }
}

ご覧のとおり、IEnumerable を取る costructor を呼び出すと、すべてのデータがそれ自体にコピーされます。

于 2013-06-28T15:50:15.260 に答える
0

通常、ドキュメントには API を使用するための十分な情報が記載されています。

あなたの特定の例では、ドキュメントにpublic List(IEnumerable<T> collection)は次のように書かれています(強調は私のものです):

指定したコレクションからコピーされた要素を格納し、コピーされた要素の数を格納するのに十分な容量を持つ、List クラスの新しいインスタンスを初期化します 。

参照用に、コンストラクターのソース コードを次に示します。

public List (IEnumerable <T> collection)
{
    if (collection == null)
        throw new ArgumentNullException ("collection");

    // initialize to needed size (if determinable)
    ICollection <T> c = collection as ICollection <T>;
    if (c == null) {
        _items = EmptyArray<T>.Value;;
        AddEnumerable (collection);
    } else {
        _size = c.Count;
        _items = new T [Math.Max (_size, DefaultCapacity)];
        c.CopyTo (_items, 0);
    }
}

void AddEnumerable (IEnumerable <T> enumerable)
{
    foreach (T t in enumerable)
    {
        Add (t);
    }
}
于 2013-06-28T15:47:19.020 に答える
0

最も簡単な方法は、MSDN にアクセスすることです。

http://msdn.microsoft.com/en-us/library/fkbw11z0.aspx

それは言う

指定したコレクションからコピーされた要素を格納し、コピーされた要素の数を格納するのに十分な容量を持つ、List クラスの新しいインスタンスを初期化します。

内部的には、渡された IEnumerable のすべての要素を新しいリストに追加するだけです。それはまた言う

これは O(n) 操作です

これは、最適化が想定されていないことを意味します。

于 2013-06-28T15:47:25.737 に答える
0

これは、最初のケースが元のリストを参照し (参照型であるため)、newListObj を介してそのコレクションを変更したためです。2 番目と 3 番目のケースでは、List コンストラクターList Classを介して元のオブジェクトのコレクションをコピーし、新しいコレクションを変更しましたが、元のコレクションには何の影響もありません。

于 2013-06-28T15:47:43.173 に答える