这篇文章主要讲解了“C#中参数的传递方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中参数的传递方式是什么”吧!
class Program { static void Main(string[] args) { int a = 10; Add(a); Console.WriteLine("传递之后的值为:" + a); Console.ReadKey(); } private static void Add(int i) { Console.WriteLine("传递之前的值为:" + i); i = i + 10; } }
结果:
可见,值类型参数在被方法调用的时候,是对本身实例的拷贝和操作,在方法调用前后参数值不变。
当引用类型参数传递时,是对托管堆上对象实例内容的操作。
也就是引用类型按值传递,传递的是引用变量的指针,指向托管堆上的对象实例。
class Program { static void Main(string[] args) { Student student = new Student(); Add(student); Console.WriteLine("参数传递之后的值为:" +student._score); Console.ReadKey(); } private static void Add(Student s) { Console.WriteLine("参数传递之前的值为:" + s._score); s._score = 90; } } public class Student { public int _score = 80; }
结果
可见,引用类型参数在被方法调用的时候,是针对变量的引用的操作,一旦引用对象内容发生改变,原来变量的值也随着改变。
引用类型参数按值传递和按引用传递的不同之处:
按值传递,传递的是参数本身的值,即引用指针。
按引用传递,传递的是参数的地址,也就是实例指针。
另外,值类型也有按引用传递,这时候,传递的是值类型的地址。
class Program { static void Main(string[] args) { int i = 100; string str = "one"; ChangeByValue(ref i); ChangeByRef(ref str); Console.WriteLine(i); Console.WriteLine(str); Console.ReadKey(); } private static void ChangeByValue(ref int iValue) { iValue = 200; } private static void ChangeByRef(ref string sValue) { sValue = "One more"; } }
可见,不管是值类型,还是引用类型,加入关键字ref作为参数,就意味着是对参数地址的操作,即托管堆上实例地址的改变。
另外:
如果需要按引用传递,方法的定义和方法的调用,都要显式地使用ref和out。
如果一个方法的参数除了ref和out关键字不同,还有其他参数不同,这才构成方法的2个重载。如果仅仅ref和out关键字不同,会报错"...不能仅在ref和out上有差别的重载方法"。
out告诉编译器,参数会在方法内部初始化,而在方法之前不需要初始化。
int x; Foo(out x);
ref告诉编译器,参数在方法之前必须初始化。
int y = 0; Foo(ref y);
class Program { static void Main(string[] args) { string str = "Old String"; Console.WriteLine("传递之前的值为:" + str); ChangeStr(str); Console.WriteLine("传递之后的值为:"+str); Console.ReadKey(); } private static void ChangeStr(string astr) { astr = "Change String"; } }
结果:
可见,虽然string是引用类型,但按值传递的表现和值类型按值传递的表现一样。
感谢各位的阅读,以上就是“C#中参数的传递方式是什么”的内容了,经过本文的学习后,相信大家对C#中参数的传递方式是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。