C#传值和传值调用分析

本文主要分析C#中调用是传值还是传址的情况,取决于数据类型和是否使用ref和out。介绍了值类型、引用类型和特殊系统类型string的传参特点,还总结了使用经验,如值类型传值、引用类型传址等。

调用是传值还是传址,主要取决于数据类型和是否使用了ref和out,下面对此作一一分析(本文出处http://blog.youkuaiyun.com/AppleDotnet/
首先是数据类型
C#中的数据类型按我理解的分类有
1、值类型:
 a)除string以外的所有基本类型(如int,float,double等);
 b)结构的对象;
2、引用类型
 a)数组;
 b)类的对象;
3、特殊的系统类型;
 a)string
 
说明:
string的特殊之处在于:传递string参数时,传递的是引用(传址),但方法中不可以修改它,这是因为string设计上不能修改的,修改就会产生一个新的string,所以在用代码作测试时,string会看起来像一个传值的调用(在方法中修改不影响原先的变量)

在这里总结一下我个人使用中的经验,供大家参考
1、所有值类型都是传值调用,也就是会复制一份传递给被调用的方法(意味着可能多使用内存)
2、不需要使用ref或out,所有引用类型都是传址调用,即参数是数组或类的对象的时候,C#就已经是用传址调用了,再加ref是没意义的(也不会导致出错),但是out是有意义,因为可能需要传入未定义的引用类型变量;
3、特殊的系统类型string,平时使用中可以把它当作是值类型来看,虽然它实质上不是;
4、ref参数,所有使用了ref的参数都是传址调用————如果你不确定一个变量是值还是引用,可以滥用它;
5、out参数
 a)使用了out参数,那这个参数原先的值就是没意义的,因为你在方法内必须构造它(注意是必须),而且根本访问不到原先的值,编译器会提示使用了未赋值的变量;
 b)out参数实际上不是一种调用方式,因为它什么值也没传入,它可以理解为一种返回值的约定;

C#中,引用是两种不同的数据递方式,它们的原理及区别如下: ### 时,系统首先为被调用方法的形参分配内存空间,并将实参的按位置一一对应地复制给形参。此后,被调用方法中形参的任何改变都不会影响到相应的实参。例如,当递一个类型的变量时,递的是该变量所存储的实际数据。C#中定义的类型包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct) [^2][^3]。 ### 引用 引用时,系统不是将实参本身的复制后递给形参,而是将其引用(即地址递给形参。因此,形参所引用的该地址上的变量与递的实参相同,方法体内相应形参的任何改变都将影响到作为引用递的实参。引用类型变量本身保存的是位于堆(Heap)上的该类型的实例的内存地址,并不包含数据。当声明一个引用类型变量时,该变量会被分配到栈上。如果仅仅只是声明这样一个变量,由于在堆上还没有创建该类型的实例,因此,变量为null,意思是不指向任何类型实例(堆上的对象)。C#中的引用类型分为引用引用的对象,包括类类型、接口类型、数组类型委托类型 [^2][^1][^4]。 ### 代码示例 ```csharp using System; class Program { // 示例 static void ValuePassing(int value) { value = 10; } // 引用示例 class MyClass { public int Value; } static void ReferencePassing(MyClass obj) { obj.Value = 20; } static void Main() { // int num = 5; ValuePassing(num); Console.WriteLine($"后num的: {num}"); // 输出: 5 // 引用 MyClass myObj = new MyClass { Value = 15 }; ReferencePassing(myObj); Console.WriteLine($"引用后myObj.Value的: {myObj.Value}"); // 输出: 20 } } ``` 在上述代码中,`ValuePassing` 方法接收一个 `int` 类型的参数,这是一个类型,方法内部对形参的修改不会影响到实参。而 `ReferencePassing` 方法接收一个 `MyClass` 类型的对象,这是一个引用类型,方法内部对形参的修改会影响到实参。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值