向方法传递结构和向方法传递引用之间的区别 总结
2016-11-11 16:35
218 查看
向方法传递结构中(值类型变量)和向方法传递类中(引用类型变量)之间的区别
案列分析:
class Program {
//声明一个类 class theClass {
//在类中声明一个字段 public string willIChange; } //声明一个结构 struct theStruct {
//在结构中声明一个字段 public string willIChange; }
//一个用于测试的类 class TestClass_Struct {
//用于测试类的方法 static void ClassTaker(theClass c) { c.willIChange = "旧金山"; Console.WriteLine("在方法ClassTaker对实例重新赋值后={0}", c.willIChange); }
//用于测试结构的方法 static void StructTaker(theStruct s) { s.willIChange = "纽约"; Console.WriteLine("在方法StructTaker对实例重新赋值后={0}", s.willIChange); }
//Main函数 static void Main() { theClass testClass = new theClass(); //实例化一个类 theStruct testStruct = new theStruct();//实例化一个结构 testClass.willIChange = "北京"; //赋值 testStruct.willIChange = "上海"; Console.WriteLine("向方法ClassTaker传递实例前={0}", testClass.willIChange); Console.WriteLine("向方法StructTaker传递实例前={0}", testStruct.willIChange); Console.WriteLine(); ClassTaker(testClass); StructTaker(testStruct); Console.WriteLine("调用方法ClassTaker方法后={0}", testClass.willIChange); Console.WriteLine("调用方法StructTaker方法后={0}", testStruct.willIChange); // Console.WriteLine("StructTaker(testStruct)={0}", StructTaker(testStruct));//报错 // StructTaker方法是void类型,不能返回方法执行后的值。所以testStruct.willIChange还是上海 Console.ReadKey();
/*A简单说明: 在向方法传递结构时,传递的是该结构的副本,而在传递类实例时,传递的是一个引用。 输出结果表明:当向 ClassTaker 方法传递类实例时,只更改类字段的值。但是向 StructTaker 方法传递结构实例并不更改结构字段。这是因为向 StructTaker 方法传递的是结构的副本,而向 ClassTaker 方法传递的是对类的引用。 */ /* B深入理解:内存中堆和栈的概念。 概念准备: 1变量,用于存储数据。每个变量在内存中分配一小块存储空间,每个变量都有一个类型,类型决定分配内存的大小,也决定什么值可以存储在变量中。 2在C#中,在类或结构中定义的变量叫字段,在方法中定义的变量就叫变量。作用域不同:全局和非全局。字段概念是变量概念的子集。 下面我们统一叫变量吧。 一、向方法传递类中实例时,传递的是变量的引用。 解释: 1变量的引用位于栈中,变量的实际值位于堆中; 2引用存放的是变量位于堆中的地址,通过栈中的引用可以寻找到堆中变量的实际值。 (这样,存储的数据相同仅名称不同的变量时,使用相同的引用,可以大大减少内存消耗) 3如果修改了变量的引用,就寻找不到堆中的实际值了。 4垃圾回收器会对堆中无对象引用的实际值进行回收,以减少内存堆消耗。 所以:即便是调用的方法无返回值,变量的实际值还是会改变。 二、 向方法传递结构中实例时,传递的是变量的副本。 解释: 1变量的实际值直接放在堆中,并不在栈中存放位于堆中的地址。或说:结构是值类型,类是引用类型。
(不需要占用内存栈资源,对于存储数据量较小且不同的数据效率高) 2传递变量时,把变量的实际值复制一份传递过去,相当于相同的数据放到了两个不同的地方。 3对另一个作用域的变量的实际值修改时,并不会影响本作用域相同名称的变量的实际值。 所以:调用的方法无返回值,变量的实际值不会改变。 */
//如有错误请立即指出,谢谢。
} } }
相关文章推荐
- C#学习基本概念之类与结构--向方法传递结构与类引用之间的区别
- 如何:了解向方法传递结构和向方法传递类引用之间的区别(C# 编程指南)
- 了解向方法传递结构和向方法传递类引用之间的区别(C# 编程指南)
- C#之方法传递结构和类之间的区别学习案例
- Asp.net页面之间传递参数方法总结
- 总结:Asp.net页面之间传递参数的几种方法
- asp.net参数之间传递方法总结(修改了几处错误)
- C C++中关于值传递和引用传递,指针传递之间的区别
- 第2章 Java编程基础——FAQ2.14 变量之间传值时可分为值传递和引用传递, 那么它们有何区别?
- C#类和结构介绍,方法介绍,值传递和引用传递,静态和非静态,字符串方法介绍
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- Java变量之间传值时可分为值传递和引用传递, 那么它们有何区别?
- js---js中的继承方法call、bind、apply,以及三者之间的区别总结。
- c#方法中调用参数的值传递方式和引用传递方式,以及ref与out的区别
- Android中Activity之间数据传递的几种方法总结
- 读<<CLR via C#>>总结(7) 以传引用的方式向方法传递参数---ref&out
- php中页面之间传递变量方法总结
- java引用传递和对象传递的区别(对象在方法中传递时,仅仅传的是地址的副本)
- java方法的参数是值传递,区别于引用传递的概念
- Java方法传参的值传递和引用传递的区别(code)