有没有任何方法可以克隆具有值类型的数组,而不创建新的引用类型
本文关键字:数组 引用类型 创建 类型 方法 任何 有没有 | 更新日期: 2023-09-27 18:29:40
我是python背景的c#新手。
在python中,我可以这样做:
a = [1, 5, 10] #initialize
a = [1, 3, 5] #change the value
如何在c#上执行a = {1, 3, 5}
?目前我找到了这种方式。
int[] a = {1, 5, 10}; //initialize
int[] b = {1 ,3, 5}; //create new reference type
a = (int[])b.Clone(); //change the value
有没有更好的方法将整个阵列a
从{1, 5, 10}
更改为{1 ,3, 5}
?
即python上的a = [1, 3, 5]
到C#?
也许我错过了什么,但肯定只是。。。
a = new int[]{1, 3, 5};
a
是一个类似于python的变量。
当分配给变量a = {1, 5, 10}
时,它会将引用的值分配给变量中的数组。这是分配数组的简写语法。
要重新分配变量,只需使用new
运算符a = new[] {1, 5, 5}
再次将其分配给它。
样品:
int[] a = {1, 5, 10}; // Shorthand syntax for creating array
a = new[] {1, 5, 5}; // Reassign using new operator
请参阅数组初始化程序
[EDIT:看起来OP不想复制现有的数组,只是想创建一个全新的数组。但我会把这个留在这里以防万一。]
这是创建数组副本的正常方法,而不仅仅是对原始数组的引用。
有一种更快的方法,那就是直接使用Array.Copy()
。您可以将其封装在扩展方法中,使其更易于使用:
/// <summary>Shallow clones an array.</summary>
/// <typeparam name="T">The type of array elements.</typeparam>
/// <param name="array">An array to clone.</param>
/// <returns>The cloned array.</returns>
/// <remarks>This is much faster than the built-in <see cref="Array.Clone"/> method.</remarks>
public static T[] ShallowClone<T>(this T[] array)
{
if (array == null)
{
throw new ArgumentNullException("array");
}
T[] result = new T[array.Length];
Array.Copy(array, result, array.Length);
return result;
}
通常情况下,您不会担心性能问题,但这确实比使用Array.Copy()
更快。
你可以这样使用:
int[] a = {1, 2, 3};
int[] b = a.ShallowClone();
通过这种方式,它的和都更快,您不需要强制转换(尽管您当然也可以编写一个使用Array.Clone()
的扩展方法)
是的,您可以使用索引器(基于零)
a[2] = 5;
如果你想改变整个数组,那么为它分配一个新的引用,比如
int[] a = new[] {1, 2, 10};
a = new[] {1,2,5};
您的原始数组将丢失对它的所有引用,并受到GC的约束。第二行为a
分配一个对新数组的引用。