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 } }