理解C#中参数的值和引用以及传递结构和类引用的区别
值与引用参数之间的区别:
在 C# 中,既可以通过值也可以通过引用传递参数。在调用环境中通过引用传递参数允许函数成员(方法、属性、索引器、运算符和构造函数)更改参数的值,并保持该更改。若要通过引用传递参数,请使用 ref 或 out 关键字。
下面的示例阐释值与引用参数之间的区别:
class Program { static void Main(string[] args) { int arg; // Passing by value. // The value of arg in Main is not changed. arg = 4; squareVal(arg); Console.WriteLine(arg); // Output: 4 // Passing by reference. // The value of arg in Main is changed. arg = 4; squareRef(ref arg); Console.WriteLine(arg); // Output: 16 } static void squareVal(int valParameter) { valParameter *= valParameter; } // Passing by reference static void squareRef(ref int refParameter) { refParameter *= refParameter; } }
向方法传递结构和向方法传递类引用之间的区别
下面的示例演示如何使用 结构 到方法与通过 类 实例不同传递给方法。在此示例中,两个参数 (结构和类实例) 将值和两个方法通过更改参数的一个字段的值。但是,这两个方法的结果是不同的,因为的传递,当您通过时结构什么不同通过,则可以通过类的实例。
由于结构是 值类型,那么,当您对方法的 使用结构值 ,方法受到并对结构参数的副本。方法无法访问原始结构中调用方法并不能将其更改任何方式。该方法可以仅更改副本。
类的实例是 引用类型,而不是值类型。当对方法的 引用类型通过值 ,方法进行引用的复制到类实例。即方法受到实例,而不是复制实例的地址的副本。在调用方法的类实例都有一个地址,在调用方法的参数的地址的副本,因此,两个地址是否引用同一对象。由于该参数包含该地址的副本,调用方法不能更改类实例的地址在调用方法的。但是,调用方法可以使用该地址访问原始地址和该副本引用的类成员。如果调用方法将类成员,在调用方法的原始类的实例也会发生更改。
下面的示例的输出显示差异。,因为该方法在参数中使用该地址查找类的实例,的指定字段调用将类实例的 willIChange 字段的值传递给方法 ClassTaker 。调用不更改结构的 willIChange 字段在调用方法为方法 StructTaker ,因为参数的值是结构的副本,而不是复制其地址。 StructTaker 更改该副本,因此,该副本丢失,在向 StructTaker 调用完成时。
class TheClass { public string willIChange; } struct TheStruct { public string willIChange; } class TestClassAndStruct { static void ClassTaker(TheClass c) { c.willIChange = "Changed"; } static void StructTaker(TheStruct s) { s.willIChange = "Changed"; } static void Main() { TheClass testClass = new TheClass(); TheStruct testStruct = new TheStruct(); testClass.willIChange = "Not Changed"; testStruct.willIChange = "Not Changed"; ClassTaker(testClass); StructTaker(testStruct); Console.WriteLine("Class field = {0}", testClass.willIChange); Console.WriteLine("Struct field = {0}", testStruct.willIChange); // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } }
输出:
Class field = Changed Struct field = Not Changed
您可能感兴趣的文章:
- Java 6 JVM参数选项大全(中文版)
- c#调用COM组件
- autoit 命令行参数说明
- 给IE加个参数 永远不怕IE主页被修改
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析