C#数组按值和按引用传递数组区别

el/2024/6/13 11:21:36

C#中,存储数组之类对象的变量并不是实际存储对象本身,而是存储对象的引用。按值传递数组时,程序将变量传递给方法时,被调用方法接受变量的一个副本,因此在被调用时试图修改数据变量的值时,并不会影响变量的原始值;而按引用传递数组时,被调用方法接受的是引用的一个副本,因此在被调用时修改数据变量时,会改变变量的原始值。下面一个例子说明如下:

复制代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Array
{class Program{public static void FirstDouble(int[] a){for (int i = 0; i < a.Length; i++){a[i] = a[i] * 2;}a = new int[] { 11, 12, 13 };}public static void SecondDouble(ref int[] a){for (int i = 0; i < a.Length; i++){a[i] = a[i] * 2;}a = new int[] { 11, 12, 13 };}public static void OutputArray(int[] array){for (int i = 0; i < array.Length; i++){Console.WriteLine("{0}", array[i]);}//Console.WriteLine("\n");}static void Main(string[] args){int[] array = { 1, 2, 3 };Console.WriteLine("不带ref关键字方法调用前数组内容:");OutputArray(array);FirstDouble(array);Console.WriteLine("不带ref关键字方法调用后数组内容:");OutputArray(array);int [] array1={1,2,3};Console.WriteLine("带ref关键字方法调用前数组内容:");OutputArray(array1);SecondDouble(ref array1);Console.WriteLine("带ref关键字方法调用后数组内容:");OutputArray(array1);Console.ReadLine();}}
}

复制代码

 

运行结果如下图:

image

 

 

 

注意的是:调用带ref关键字的方法时,参数中也要加ref关键字。

 

 

 public static void Test()
        {
            double[] array = new double[4] { 0, 1, 2, 3 };
            A a1 = new A();
            A a2 = new A();
            a1.value = array;
            a2.value = array;
            a1.value[0] = 9999;//a1和a2都改变了,这里array是引用类型


        }


http://www.ngui.cc/el/5545770.html

相关文章

窗口句柄、窗口类对象的关系

HWND hwnd&#xff1b;//窗口句柄 CWnd wnd&#xff1b;//窗口类对象 窗口类对象中有一个成员是窗口句柄。 窗口句柄&#xff0c;提供了窗口的一个标识&#xff0c;类似于指针的概念&#xff0c;每一个窗口都对应了一个窗口句柄作为其标识&#xff0c;通过句柄可以方便的从内…

OpenCV 图像清晰度评价算法(相机自动对焦)

相机的自动对焦要求相机根据拍摄环境和场景的变化&#xff0c;通过相机内部的微型驱动马达&#xff0c;自动调节相机镜头和CCD之间的距离&#xff0c;保证像平面正好投影到CCD的成像表面上。这时候物体的成像比较清晰&#xff0c;图像细节信息丰富。 相机自动对焦的过程&#…

一种新的图像清晰度评价函数

自动聚焦是机器人视觉、数字视频系统中的关键技术之--,是决定图像质量的重要因素,是获取清晰图 像的第1步。聚焦性能取决于调焦评价函数的准确性和有效性,即评价函数必须具有无偏性好、单峰性强和 较好的抗噪性能。图像模糊的本质是高频分量的损失,聚焦图像比离焦图像包含更多的…

委托事件的线程问题

事件注册方法或委托后&#xff0c;事件所在的线程执行注册的方法或委托&#xff0c;所以如果方法中有跨线程控件就需要使用invoke等处理。

图像灰度图,直方图,像素通道问题

1.图像直方图概述   直方图广泛运用于很多计算机视觉运用当中&#xff0c;通过标记帧与帧之间显著的边缘和颜色的统计变化&#xff0c;来检测视频中场景的变化。在每个兴趣点设置一个有相近特征的直方图所构成 “标签”&#xff0c;用以确定图像中的兴趣点。边缘、色彩、角度…

信号傅里叶变换后的实数和虚数部分理解

傅里叶&#xff08;FFT、DFT、傅立叶、Fourier&#xff09;傅里叶变换的结果为什么含有复数&#xff1f; 为什么傅里叶变换的结果含有复数成份&#xff1f; 看了很多关于FFT的资料&#xff0c;现在看到一个资料说FFT转换的结果是实部虚部&#xff0c;所以不理解为什么从时域转…

C++ 简单实现HTTP GET/POST 请求

HTTP(超文本传输协议)是一种客户端与服务端的传输协议&#xff0c;最早用于浏览器和服务器之间的通信&#xff0c;后来因为其使用灵活、方便等特点&#xff0c;广泛用于客户端与服务端的通信。文章将简单介绍HTTP协议&#xff0c;同时以C方式分别实现HTTP GET、POST 请求 HTTP …

C#无损高质量压缩图片实现代码

最近&#xff0c;项目上涉及到了图像压缩&#xff0c;发现原有的图像压缩功能&#xff0c;虽然保证了图像的大小300K以内&#xff0c;但是压缩后的图像看的不在清晰&#xff0c;并且&#xff0c;限定了图片的Height或者是Width。 在CSDN上看到了一个压缩算法&#xff1a;C#无损…

vs中c++项目的配置

首先&#xff0c;我们一般不会修改解决方案的属性&#xff0c;而是设置每个项目各自的属性. 接着上一篇文章&#xff0c;我们来看看我们应该怎样来设置各项目的项目属性更好&#xff1a; 我们以NYOJ_001项目的Debug版的设置为例&#xff1a; 在常规选项里&#xff0c;我们一…

关于opencv中Mat赋值(浅拷贝,深拷贝)原理

问题点&#xff1a; 有两个垫对象&#xff1a;mat_1和mat_2将mat_2赋值给mat_1&#xff08;mat_1 mat_2&#xff09;后&#xff0c;改变mat_1&#xff0c;mat_2也会被改变&#xff08;这里的改变是指图像处理&#xff09;。 原因&#xff1a; mat_1 mat_2是浅拷贝&#xff0…