首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List<String> ByRef

List<String> ByRef
EN

Stack Overflow用户
提问于 2013-06-28 15:42:08
回答 6查看 272关注 0票数 2

我想知道如何才能证明.Net框架在幕后所做的事情。

我有一个接受List<String> originalParameterList参数的方法。

在我的方法中,如果我执行以下操作,就会有另一个List<String> newListObj

代码语言:javascript
复制
List<String> newListObj = originalParameterList
    newListObj.Add(value);
    newListObj.Add(value1);
    newListObj.Add(value2);

originalParameterList的计数增长(+3)。

如果我这么做:

代码语言:javascript
复制
List<String> newListObj = new List<String>(originalParamterList);

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

originalParameterList的计数保持为sames (+0)。

我还发现,这段代码的行为是相同的:

代码语言:javascript
复制
List<String> newListObj = new List<String>(originalParamterList.ToArray());

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

originalParameterList的计数保持为sames (+0)。

我的问题是,有没有一种方法可以明确地看到.Net框架在幕后所做的事情?

EN

回答 6

Stack Overflow用户

发布于 2013-06-28 17:05:23

您可以将您的程序集加载到ILDASM中(加载时),找到您的方法并双击它,它将在搜索中的windows菜单中显示method.Just类型"IL“的模具代码。

或者,您也可以使用以下方式创建一个新的独立列表

代码语言:javascript
复制
        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

        }
票数 1
EN

Stack Overflow用户

发布于 2013-06-28 15:47:19

通常,文档应该提供足够的信息来使用API。

在您的具体示例中,public List(IEnumerable<T> collection)的文档说明(强调我的):

初始化列表类的新实例,该实例包含从指定集合复制的元素复制的,并且具有足够的容量来容纳复制的元素的数量。

这里的参考是构造函数的源代码:

代码语言:javascript
复制
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);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2013-06-28 15:47:25

做这件事的最简单的方法就是使用MSDN。

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

上面写着

初始化List类的新实例,该实例包含从指定集合复制的元素,并且具有足够的容量来容纳复制的元素数。

因此,在内部,它只是将传递的IEnumerable的所有元素添加到新列表中。它还说

这是一个O(n)操作

这意味着没有假设任何优化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17368575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档