我想知道如何证明.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在幕后做什么?
答案 0 :(得分: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
}
答案 1 :(得分: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);
}
}
答案 2 :(得分:0)
最简单的方法是转到MSDN
http://msdn.microsoft.com/en-us/library/fkbw11z0.aspx
它说
初始化List类的新实例,该实例包含从指定集合复制的元素,并且具有足够的容量来容纳复制的元素数。
所以内部它只是将传递IEnumerable的所有元素添加到新列表中。它还说
这是O(n)操作
这意味着没有假设优化。
答案 3 :(得分:0)
那是因为你引用原始列表的frist案例(因为它是一个引用类型),你通过newListObj修改了它的集合。第二种和第三种情况是您通过List构造函数List Class复制了原始对象的集合,并修改了新集合,这对原始集合没有任何影响。
答案 4 :(得分:0)
正如其他人已经说过的,有各种工具可以让你检查.NET框架的源代码。我个人更喜欢dotPeek from JetBrains,这是免费的。
在您提到的特定情况下,我认为当您将列表传递到另一个列表的构造函数时,该列表将被复制。如果您只是将一个变量分配给另一个变量,那么这些变量就只是引用相同的列表。
答案 5 :(得分:0)
你可以
答案 6 :(得分: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);
}
}
}
正如您所看到的,当您调用构造函数时,它会将所有数据复制到自身。