分析C#程序设计语言中参数的传递

时间:2022-10-14 06:01:39

分析C#程序设计语言中参数的传递

摘要:本文详细讲述了在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的值。

上一篇:基于VB的多媒体数据库图像存取优化与实现 下一篇:B2B电子商务中Web服务安全和服务质量分析