C#学习笔记 -- 数组: 数组浅克隆、ref返回与ref局部变量

1、Clone()

Clone方法为数组进行浅复制

  • 它只创建了数组本身的克隆.

  • 如果是引用类型数组, 他不会赋值元素引用的对象

  • 对于值类型和引用类型数组来说, 具有不同的结果

    • 克隆值类型数组会产生两个独立数组

    • 克隆引用类型数组会产生指向相同对象的两个数组

  • 克隆方法返回object类型的引用, 它必须被强制转换成数组类型

int[] intArr1 = {1, 2, 3};
int[] intArr2 = (int[]) intArr1.Clone();
例子1 克隆值类型
static void Main(string[] args)
{
    int[] intArr1 = { 1, 2, 3 };
    int[] intArr2 = (int[])intArr1.Clone();
​
    for (int i = 0; i < intArr2.GetLength(0); i++)
    {
        intArr2[i] = i * 100;
    }
}

例子2 克隆引用类型
static void Main(string[] args)
{
    A[] Aarry1 = new A[3] { new A(), new A() , new A() };
    A[] Aarry2 = (A[]) Aarry1.Clone();
​
    for (int i = 0; i < Aarry2.GetLength(0); i++)
    {
        Aarry2[i].Value = (i+1) * 100;
    }
    Printer.PrintArrays13Clone(Aarry1);  //100 200 300
    Printer.PrintArrays13Clone(Aarry2);  //100 200 300
}

2、ref返回和ref局部变量

  • ref返回可以把一个引用作为返回值传到方法体外

  • ref局部变量可以在调用域中使用该引用

使用ref返回和ref局部变量, 可以将某个数组中的某个元素的引用获取并使用, 而不是该元素的值

public static ref int PointerToHighestPositive(int[] nums)
{
    int highestIndex = 0;
    int highestValue = nums[0];
    for (int i = 0; i < nums.Length; i++)
    {
        if (nums[i] > highestValue)
        {
            highestValue = nums[i];
            highestIndex = i;
        }
    }
    return ref nums[highestIndex];
}
static void Main(string[] args)
{
    int[] nums = new int[] { 5, 80 };
    Console.WriteLine("before"); //5 80
    foreach (var num in nums)
    {
        Console.Write($"{num} ");
    }
    Console.WriteLine("\nafter"); //5 0
    ref int heightElement = ref Program1314.PointerToHighestPositive(nums);
    heightElement = 0; //修改最高值
    foreach (var num in nums)
    {
        Console.Write($"{num} ");
    }
}
//5 80
//5 0

posted on 2023-05-27 00:16  老菜农  阅读(127)  评论(0编辑  收藏  举报

导航