C# 引用类型作为值参数和引用参数
2021/9/24 9:10:41
本文主要是介绍C# 引用类型作为值参数和引用参数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 引用类型作为值类型传递,形参和实参其实是两个指针,只不过指向的是同一块内存。新
new
一个对象是,它们两的联系就被切断了,指向了不同的内存块。 - 引用类型作为引用参数,此时的形参其实是实参的一个别名,它们两个其实是一个指针,新
new
一个对象是,指向的还是同一内存块,因为它们本身就是同一个指针。
两种情况的最后指向是不一样的。
以下情况是, 在方法内创建一个新对象并赋值给形参。
引用类型作为值参数
using System; namespace RefParameter { class MyClass { public int test = 20; } class Program { static private void RefparameterTest( MyClass mc) { mc.test = 50; Console.WriteLine("修改值之后:{0}", mc.test); mc = new MyClass(); Console.WriteLine("新创建之后:{0}", mc.test); } static void Main(string[] args) { MyClass mc = new MyClass(); Console.WriteLine("原始值:{0}\n=======", mc.test); RefparameterTest( mc); Console.WriteLine("=======\n最后值:{0}", mc.test); Console.ReadKey(); } } }
输出:
原始值:20 ======= 修改值之后:50 新创建之后:20 ======= 最后值:50 // 被修改
引用类型作为引用参数
using System; namespace RefParameter { class MyClass { public int test = 20; } class Program { static private void RefparameterTest(ref MyClass mc) { mc.test = 50; Console.WriteLine("修改值之后:{0}", mc.test); mc = new MyClass(); Console.WriteLine("新创建之后:{0}", mc.test); } static void Main(string[] args) { MyClass mc = new MyClass(); Console.WriteLine("原始值:{0}\n=======", mc.test); RefparameterTest(ref mc); Console.WriteLine("=======\n最后值:{0}", mc.test); Console.ReadKey(); } } }
输出:
原始值:20 ======= 修改值之后:50 新创建之后:20 ======= 最后值:20 // 还是原来
如果不在方法内部改变引用形参的指向,他们操纵的内存区域是一样的,结果也是一样的。
using System; namespace RefTest { class Myclass { public int val = 10; } class Program { static void Mymethod(Myclass a, int b) // 看这里 { a.val += 5; b += 5; } static void Main() { Myclass a = new Myclass(); int b = 20; Console.WriteLine($"调用前:a = {a.val}, b = {b}"); Mymethod(a, b); // 看这里 Console.WriteLine($"调用后:a = {a.val}, b = {b}"); Console.ReadKey(); } } }
输出:
调用前:a = 10, b = 20 调用后:a = 15, b = 20 // 可见 对象a的数值成员值改变了,值变量b没有改变。
using System; namespace RefTest { class Myclass { public int val = 10; } class Program { static void Mymethod(ref Myclass a, ref int b) // 看这里 { a.val += 5; b += 5; } static void Main() { Myclass a = new Myclass(); int b = 20; Console.WriteLine($"调用前:a = {a.val}, b = {b}"); Mymethod(ref a, ref b); // 看这里 Console.WriteLine($"调用后:a = {a.val}, b = {b}"); Console.ReadKey(); } } }
输出:
调用前:a = 10, b = 20 调用后:a = 15, b = 25 // 可见 都改变了。
参考:
《C#图解教程》 -> P66
这篇关于C# 引用类型作为值参数和引用参数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID
- 2024-01-23用CI/CD工具Vela部署Elasticsearch + C# 如何使用
- 2024-01-23.NET开源的简单、快速、强大的前后端分离后台权限管理系统
- 2024-01-23C#对象二进制序列化优化:位域技术实现极限压缩