向方法传递结构和向方法传递引用之间的区别 总结

向方法传递结构中(值类型变量)和向方法传递类中(引用类型变量)之间的区别

案列分析:

    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对另一个作用域的变量的实际值修改时,并不会影响本作用域相同名称的变量的实际值。 所以:调用的方法无返回值,变量的实际值不会改变。
*/

        //如有错误请立即指出,谢谢。
} } }

 

posted @ 2016-11-11 16:35  hao_1234_1234  阅读(468)  评论(0编辑  收藏  举报