C#学习基本概念之类与结构--向方法传递结构与类引用之间的区别
2016-11-25 22:51
441 查看
下面的示例演示如何使用 结构 到方法与通过 类 实例不同传递给方法。 在此示例中,两个参数 (结构和类实例) 将值和两个方法通过更改参数的一个字段的值。 但是,这两个方法的结果是不同的,因为的传递,当您通过时结构什么不同通过,则可以通过类的实例。
由于结构是 值类型,那么,当您对方法的 使用结构值 ,方法受到并对结构参数的副本。 方法无法访问原始结构中调用方法并不能将其更改任何方式。 该方法可以仅更改副本。
类的实例是 引用类型,而不是值类型。 当对方法的 引用类型通过值
,方法进行引用的复制到类实例。 即方法受到实例,而不是复制实例的地址的副本。
在调用方法的类实例都有一个地址,在调用方法的参数的地址的副本,因此,两个地址是否引用同一对象。
由于该参数包含该地址的副本,调用方法不能更改类实例的地址在调用方法的。 但是,调用方法可以使用该地址访问原始地址和该副本引用的类成员。
如果调用方法将类成员,在调用方法的原始类的实例也会发生更改。
下面的示例的输出显示差异。 ,因为该方法在参数中使用该地址查找类的实例,的指定字段调用将类实例的
备注:转载自https://msdn.microsoft.com/zh-cn/library/8b0bdca4.aspx
由于结构是 值类型,那么,当您对方法的 使用结构值 ,方法受到并对结构参数的副本。 方法无法访问原始结构中调用方法并不能将其更改任何方式。 该方法可以仅更改副本。
类的实例是 引用类型,而不是值类型。 当对方法的 引用类型通过值
,方法进行引用的复制到类实例。 即方法受到实例,而不是复制实例的地址的副本。
在调用方法的类实例都有一个地址,在调用方法的参数的地址的副本,因此,两个地址是否引用同一对象。
由于该参数包含该地址的副本,调用方法不能更改类实例的地址在调用方法的。 但是,调用方法可以使用该地址访问原始地址和该副本引用的类成员。
如果调用方法将类成员,在调用方法的原始类的实例也会发生更改。
下面的示例的输出显示差异。 ,因为该方法在参数中使用该地址查找类的实例,的指定字段调用将类实例的
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(); } } /* Output: Class field = Changed Struct field = Not Changed */
备注:转载自https://msdn.microsoft.com/zh-cn/library/8b0bdca4.aspx
相关文章推荐
- 了解向方法传递结构和向方法传递类引用之间的区别(C# 编程指南)
- C#之方法传递结构和类之间的区别学习案例
- 如何:了解向方法传递结构和向方法传递类引用之间的区别(C# 编程指南)
- 向方法传递结构和向方法传递引用之间的区别 总结
- C#学习基本概念之传递引用类型参数(二)
- C#学习之类与结构的区别
- C#学习基本概念之结构与类
- 第一天,第一个C#程序,学习C#基本语法。掌握命名空间、类、变量、方法等基本概念。
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- 深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别
- c#方法中调用参数的值传递方式和引用传递方式以及ref与out的区别深入解析
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- 理解C#中参数的值和引用以及传递结构和类引用的区别
- C#学习基本概念之方法
- C#学习基本概念之匿名方法及Lambda表达式
- C#学习基本概念之传递值类型参数(一)
- c#基础概念之类和结构的区别
- 深入C#内存管理来分析值类型&引用类型,装箱&拆箱,堆栈几个概念组合之间的区别
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- C#学习基本概念之属性与索引器之间的比较