c# - 有没有办法用值类型克隆数组,而不创建新的引用类型?

时间:2013-08-29 11:07:12

标签: c# python

我是c#with python background的新手。

在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#?

4 个答案:

答案 0 :(得分:4)

也许我错过了什么,但肯定只是......

a = new int[]{1, 3, 5};

答案 1 :(得分:1)

是的,您可以使用indexer(基于零)

a[2] = 5;

如果要更改整个数组,请为其指定新引用,例如

int[] a = new[] {1, 2, 10};
a = new[] {1,2,5};

您的原始数组将丢失对它的所有引用并受GC限制。第二行为a分配对新数组的引用。

答案 2 :(得分:1)

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

请参阅Array initializers

答案 3 :(得分:1)

[编辑:似乎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()的扩展方法。)