C# 方法参数传递之值传递和引用传递
2011-08-15 17:34 DylanChan 阅读(717) 评论(1) 编辑 收藏 举报
1、大部分情况下,使用C#预定义的类型时,都是按照值传递使用的,比较复杂的情况是按照引用传递各种类型(值类型和引用类型),其实实质上的不同时对变量的操作方式上的不同
2、在c#内置基本类型当中,除了object和string外,都是值类型。同时,自己定义的类,也都是引用类型。因为自定义类全部继承自System.Object
3、在 C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员(方法、属性、索引器、运算符和构造函数)更改参数的值,并保持该更改。若要通过引用传递参数,请使用ref或out关键字。out与ref类似,唯一的不同是ref修饰变量时,变量需要初始化,而out修饰变量时则不需要。
即:值传递操作变量副本,引用传递操作变量本身
(1)值传递值类型:
class ValClass { static void AddValue(int x) { x++; } static void Main() { int i = 22; AddValue(i); Console.WriteLine(i); //输出结果:22 } }
(2)引用传递值类型:
class ReferenceClass { static void AddValue(ref int x) { x++; } static void Main() { int i = 22; AddValue(ref i); Console.WriteLine(i); //输出结果:23 } }
(3)值传递引用类型:
class ValClass { string str = "Definition Str In ValClass"; static void ChangeVal(string str) { str = str + "was changed!"; } static void Main() { string str = "Definition Str In Main"; ChangeVal(str);//值传递 Console.WriteLine(str); //输出结果:Definition Str In Main } }
(4)引用传递引用类型:
class ValClass { string str = "ValClass.str"; static void ChangeVal(ref string str) { str = "Str Was Changed In ValClass"; } static void ChangeObj(ValClass vc) { vc.str = "Definition Str Again In ValClass"; } static void Main() { string str = "Definition Str In Main"; ChangeVal(ref str);//引用传递 Console.WriteLine(str); //输出:Str Was Changed In ValClass Console.WriteLine("-------------------------"); ValClass vc = new ValClass(); Console.WriteLine(vc.str); //输出:ValClass.str ChangeObj(vc);//引用传递 Console.WriteLine(vc.str); //输出:Definition Str Again In ValClass } }