本文详细讲解了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;
}
结果
可见,引用类型参数在被方法调用的时候,是针对变量的引用的操作,一旦引用对象内容发生改变,原来变量的值也随着改变。
按引用传递 ref和out
引用类型参数按值传递和按引用传递的不同之处:
- 按值传递,传递的是参数本身的值,即引用指针。
- 按引用传递,传递的是参数的地址,也就是实例指针。
另外,值类型也有按引用传递,这时候,传递的是值类型的地址。
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上有差别的重载方法"。
ref和out使用时的不同点:
out告诉编译器,参数会在方法内部初始化,而在方法之前不需要初始化。
int x;
Foo(out x);
ref告诉编译器,参数在方法之前必须初始化。
int y = 0;
Foo(ref y);
特殊引用类型string的传递
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#中参数的传递方式详解
基础教程推荐
- ZooKeeper的安装及部署教程 2023-01-22
- C# List实现行转列的通用方案 2022-11-02
- C#类和结构详解 2023-05-30
- 一个读写csv文件的C#类 2022-11-06
- winform把Office转成PDF文件 2023-06-14
- C# 调用WebService的方法 2023-03-09
- unity实现动态排行榜 2023-04-27
- C#控制台实现飞行棋小游戏 2023-04-22
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- C# windows语音识别与朗读实例 2023-04-27