C#入门及进阶|数组和集合(四):数组的参数传递

数组的参数传递

向方法传递参数有两个方法,一个是"传值",另一个是"传引用"。

传值时,如果对被调用的方法的值的副本进行修改,不会影响原始变量的值。

1.值传递

通过"传值"方式来传递引用,相当于允许方法直接访问和修改调用者的原始数据。

下面我们将通过一个实例(见后面代码)来演示:通过将变量myInt传递给方法SquareIt。方法内发生的任何更改对变量的原始值无任何影响。

通过向Change方法传递引用类型的参数myArray。由于该参数是对myArray的引用,所以有可能更改数组元素的值。但试图将参数重新分配到不同的内存位置时,该操作仅在方法内有效,并不影响原始变量myArray。

2.引用传递

如果希望通过传递一个值类型参数,在方法内对该参数的修改能够返回给原始参数,那又该怎么办呢?为了实现这样的编程,C#提供了关键字ref和out。

ref和out关键字指出一个值类型变量或引用类型变量应该以传递引用方式传递。如果使用关键字ref和out通过引用传递变量,则方法能够修改变量本身。具体说,如果参数为对象变量,则在方法内可以给它分配新的对象。

若要使用ref参数,必须将参数作为ref参数显式传递到方法。ref参数的值被传递到ref参数。传递到ref参数的参数必须最先初始化。

若要使用out参数,必须将参数作为out参数显式传递到方法。out参数的值不会传递到out参数。不必初始化作为out参数传递的变量。然而,必须在方法返回之前为out参数赋值。out参数通常用于产生多个返回值的方法中。

cs 复制代码
//求平方

void SquareIt(int x)

{

    x = x * x;

}

//修改数组的值,主函数中数组中的值发生改变

void Change(int[] arr)

{

    arr[0] = 888;

}

//重新分配内存,主函数中值不变

void Change0(int[] arr)

{

    arr = new int[] {888,999};

}

//传值,不能改变实参

void change(string s)  

{

    char[] cc = new char[] { 'a', 'b', 'c' };

    s = new string(cc);

}

//ref关键字的使用

void change(ref string s)  

{

    char[] cc = new char[] { 'x', 'y', 'z' };

    s = new string(cc);

}

//out关键字的使用

void changeout(out string s)   

{

    s = "hello";

}

private void button1_Click(object sender, EventArgs e)

{

    int myInt = 5;

    SquareIt(myInt);

    richTextBox1.AppendText(myInt.ToString()+"\n");

    int[] myArray = new int[2] {1,2};

    //值不变

    Change0(myArray);

    richTextBox1.AppendText(myArray[0].ToString() + "\n");

    //值发生改变

    Change(myArray);

    richTextBox1.AppendText(myArray[0].ToString() + "\n");

    //方法能够更改变量和它引用的对象的成员

    string str = "aaa";

    change(ref str);

    richTextBox1.AppendText(str + "\n");

    string str2;

    changeout(out str2);

    //方法不能更改变量,但可以更改它引用的对象的成员

    str = "aaa";

    change(str);
    richTextBox1.AppendText(str + "\n");

    string str2;

    changeout(out str2);

    //方法不能更改变量,但可以更改它引用的对象的成员 
    str = "aaa";

    change(str);

    richTextBox1.AppendText(str + "\n");
}
相关推荐
小莞尔23 分钟前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号44 分钟前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_1 小时前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty1 小时前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再1 小时前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame
Anson Jiang1 小时前
浏览器标签页管理:使用chrome.tabs API实现新建、切换、抓取内容——Chrome插件开发从入门到精通系列教程06
开发语言·前端·javascript·chrome·ecmascript·chrome devtools·chrome插件
唐青枫1 小时前
从入门到进阶:C#.NET Stopwatch 计时与性能测量全攻略
c#·.net
会开花的二叉树1 小时前
继承与组合:C++面向对象的核心
java·开发语言·c++
长河3 小时前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
Cyan_RA93 小时前
SpringMVC @RequestMapping的使用演示和细节 详解
java·开发语言·后端·spring·mvc·ssm·springmvc