最近在写项目中有同事碰到这样的传值问题,可能很多对这个参数的传递还有点疑惑,自己也是对这个基础知识做一个回顾和巩固。
首先什么是值类型和引用类型可以去园里看一下相关的资料,都有介绍。
常用值类型包括:int ,long ,bool,decimal,char,float 等
常用的引用类型包括:string,arry,delegate, interface,class 等
一。传递值类型参数
向方法传递值类型变量意味着向方法传递变量的一个副本。方法内发生的对参数的更改对该变量中存储的原始数据无任何影响。如果希望所调用的方法更改参数的值,必须使用 ref 或 out 关键字通过引用传递该参数。
static void SquareInt(int x) { x *= x; System.Console.WriteLine("步骤二: {0}", x); } static void Main() { int n = 5; System.Console.WriteLine("步骤一: {0}", n); SquareInt(n); System.Console.WriteLine("步骤三: {0}", n); }
以上通过值传递值类型,输出:步骤一:5 步骤二:25 步骤三:5
static void SquareInt(ref int x) { x *= x; System.Console.WriteLine("步骤二: {0}", x); } static void Main() { int n = 5; System.Console.WriteLine("步骤一: {0}", n); SquareInt(ref n); System.Console.WriteLine("步骤三: {0}", n); }
以上通过引用传递值类型,输出:步骤一:5 步骤二:25 步骤三:25
二。传递引用类型参数
引用类型的变量不直接包含其数据;它包含的是对其数据的引用。当通过值传递引用类型的参数时,有可能更改引用所指向的数据,如某类成员的值。但是无法更改引用本身的值;也就是说,不能使用相同的引用为新类分配内存并使之在块外保持。若要这样做,应使用 ref 或 out 关键字传递参数。
public class People { public string name { get; set; } public int age { get; set; } } static void Main() { People model = new People(); model.name = "张三"; model.age = 18; System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age); Change(model); System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age); } private void Change(People model) { model.name = "李四"; model = new People() { name = "王五", age = 20 }; System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age); }
以上通过值传递引用类型,输出:姓名:张三,年龄:18 姓名:王五,年龄:20 姓名:李四,年龄:18
public class People { public string name { get; set; } public int age { get; set; } } static void Main() { People model = new People(); model.name = "张三"; model.age = 18; System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age); Change(ref model); System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age); } private void Change(ref People model) { model.name = "李四"; model = new People() { name = "王五", age = 20 }; System.Console.WriteLine("姓名:{0},年龄:{1}", model.name, model.age); }
以上通过引用传递引用类型,输出:姓名:张三,年龄:18 姓名:王五,年龄:20 姓名:王五,年龄:20
二。传递特殊的引用类型参数string
string是引用类型,没错,但它的很多操作是与值类型看齐的,下面直接代码演示
static void Main() { string str1 = "张三"; StringBuilder str2 = new StringBuilder(); str2.Append("李四"); System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); SwapStrings(str1, str2); System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); } private void SwapStrings(string s1,StringBuilder s2) { s1 = "张三疯"; s2.Append("李四疯"); s2 = new StringBuilder(); s2.Append("王五"); System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString()); }
以上通过值传递引用类型string,输出:str1是张三str2是李四 str1是张三疯str2是王五 str1是张三str2是李四李四疯
static void Main() { string str1 = "张三"; StringBuilder str2 = new StringBuilder(); str2.Append("李四"); System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); SwapStrings(ref str1, ref str2); System.Console.WriteLine("str1是{0}str2是{1}", str1, str2.ToString()); } private void SwapStrings(ref string s1,ref StringBuilder s2) { s1 = "张三疯"; s2.Append("李四疯"); s2 = new StringBuilder(); s2.Append("王五"); System.Console.WriteLine("str1是{0}str2是{1}", s1, s2.ToString()); }
以上通过引用传递引用类型string,输出:str1是张三str2是李四 str1是张三疯str2是王五 str1是张三疯str2是王五