时间:2022-10-14 06:01:39
摘要:本文详细讲述了在C#语言中的参数的传递,包括了数值、数组与对象的传递,并区分了值传递、引用传递的不同。
关键词:值类性;引用类型;值传递;引用传递
中图分类号:TP312文献标识码:A文章编号:1009-3044(2007)15-30749-02
Analyzing the Parameter Pass in C# Language
BAI Xue-bing
(Zhejiang Institute of Traffic, Hangzhou 311112, China)
Abstract: the article narrates the parameter pass in c# language, which includes number, array and object parameter pass, and it also tells the difference between the call by value and call by reference.
Key words: value type; reference type; call by value; call by reference
1 引言
目前,随着程序设计语言的不断发展,.NET平台在windows平台上已站稳脚跟,成为主流的开发平台,C#语言作为.Net平台的主流语言,重要性不言而喻。目前,C#语言已成为唯一能与Java抗衡的语言,而日益受到程序员的喜爱。
在C#程序设计中,常常会运用参数来传递对象,然而,在程序设计语言中,参数的传递常常使人含混不清,因此,有必要好好的分析一下参数的传递,才能使你在运用C#语言时更加的心应手。
首先,我们需要了解C#语言的数据类型,C#语言的数据类型可分为两大类:一种是值类性(value type),它的数据存放入栈内的一个变量之中。例如整型、浮点与结构体(int、double、struct)。另一种是引用类型(reference type),它的数据不驻留在栈中,而是存储在堆中。当访问一个具有引用类型的数据时,需要到栈中检查变量的内容,该变量引用堆中的一个实际数据。例如类,数组,字符串class,array,string)。由于这两种类型的数据在参数传递时是如此的不同,我们需要分别讨论。
2 值类型传递
在C#语言中参数的传递可分为值传递(call by value)与引用传递(call by reference),值传递中函数将参数复制到子程序的参数中。因此,改变子程序的参数不会影响用于调用的参数。而引用传递视将参数的引用传递给子程序。在子程序内部,该引用用来访问调用中的实际参数。
下面我们用例子来说明区别。引用传递在C#中使用关键字ref或out。
2.1 值传递
在给方法传递数值类型时,如int类型或double类型,它们是通过值传递。因此,在给这种类型进行值传递时,函数的调用并不会影响在主函数的原先的值。
示例如下。
using System;
class Test {
public void noChange(int i, int j) {
i = i + j;
j = -j;}}
class CallByValue {
public static void Main() {
Test ob = new Test();
int a = 15, b = 20;
Console.WriteLine("a and b before call: " + a + " " + b);
ob.noChange(a, b);
Console.WriteLine("a and b after call: " + a + " " + b);
}}
程序产生的结果如下:
A and b before call:15 20
A and b after call:15 20
由此可见,noChange()内部发生的操作不影响调用中的a和b的值。
2.2 引用传递
但是如果你在函数调用参数前使用ref参数,表示使用引用传递。
示例如下:
using System;
class Swap {
public void swap(ref int a, ref int b)//参数前加ref表示引用传递
{int t;
t = a;
a = b;
b = t; }}
class SwapDemo {
public static void Main() {
Swap ob = new Swap();
int x = 10, y = 20;
Console.WriteLine("x and y before call: " + x + " " + y);
ob.swap(ref x, ref y);
Console.WriteLine("x and y after call: " + x + " " + y); }}
程序产生的结果如下:
A and b before call:1020
A and b after call:2010
由此可见,swap函数()内部发生的操作影响调用中的a和b的值。如果不使用ref参数,a和b仍然不会变化。
3 引用类型参数传递
由于在C#程序设计中,类作为引用类型常常被使用。在参数的传递中,类的实例对象常常被用来作为函数参数,因此我们就以对象作为研究对象。另外我们也讨论一下数组。
3.1 对象值传递
由于对象本身即是引用。因此,当对象被用来当作参数传递时,对象本身是通过值传递,但是由于对象本身是引用传递,改变参数所引用的对象依然改变将影响参数所影响的对象。
示例如下
using System;
class Test {
public int a, b;
public Test(int i, int j) {
a = i;
b = j; }
public void change(Test ob) //调用test类对象ob 值调用
{ ob.a = ob.a + ob.b;
ob.b = -ob.b; }}
class CallByRef {
public static void Main() {
Test ob = new Test(15, 20);
Console.WriteLine("ob.a and ob.b before call: " + ob.a + " " + ob.b);
ob.change(ob);
Console.WriteLine("ob.a and ob.b after call: " + ob.a + " " + ob.b); }}
程序产生的结果如下:
A and b before call:15 20
A and b after call:35 -20
由此可见,尽管场change函数的参数test ob前没有加上ref关键字,但由于对象本身是引用 ,因此调用函数发生的操作仍然影响调用中的a和b的值。