Cod*_*uth 40 c# linq extension-methods
我每天处理一个框架,我们有时提供接受IEnumerable<MyBusinessObject>作为参数的方法,以显示用户界面,执行计算等.
如果我传入一个MyBusinessObject像这样的数组:
MyBusinessObject[] myArray = new MyBusinessObject { obj1, obj2, ..., objN };
frameworkClass.MyMethod(myArray);
....
public class FrameworkClass
{
public void MyMethod(IEnumerable<MyBusinessObject> objs)
{
// Other code that uses the enumerable
MyBusinessObject[] objectArray = objs.ToArray();
// More code that uses the enumerable
}
}
Run Code Online (Sandbox Code Playgroud)
该行objs.ToArray()只是简单地解析IEnumerable<MyBusinessObject>回原始数组,还是将它复制到一个全新的数组,准备好使用?
Nei*_*ell 57
不,您将始终获得数组的新副本,尽管其中的对象不是副本,它们与原始数组中的引用相同.
返回数组的更改有时会影响源,有时会影响源,这将是非常不一致的.ToList出于同样的原因,同样的方式.
如果需要查看详细信息,可以检查源代码(截至2015年):Enumerable.ToArray,它依次创建内部Buffer类的元素副本(针对ICollection并进行优化Array[],但仍然进行复制).
如果数组中有一个或多个元素,您将获得该数组的一份新副本。对于空数组,您可能会得到相同的数组,至少在 .NET 5 中是这样:
Console.WriteLine(Object.ReferenceEquals(Array.Empty<string>(), Array.Empty<string>().ToArray()));
Run Code Online (Sandbox Code Playgroud)
这返回 true。
| 归档时间: |
|
| 查看次数: |
6703 次 |
| 最近记录: |