有没有任何方法可以克隆具有值类型的数组,而不创建新的引用类型

本文关键字:数组 引用类型 创建 类型 方法 任何 有没有 | 更新日期: 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分配一个对新数组的引用。