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


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

    案列分析:

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

            //如有错误请立即指出,谢谢。
    } } }
  • 相关阅读:
    pyCharm最新2018激活码
    pycharm fiddler requests.exceptions.SSLError
    耐克的毛毛虫
    ROS-RouterOS hAP ac2+usb 4G上网卡+小米新推的无线上网卡是绝配
    TOM带你玩充电 篇三:15款5号电池横评及选购建议——南孚金霸王小米宜家耐时品胜一个都逃不了
    关于DELL服务器如果采购散件,进行服务器升级的相关说明
    开通微信零钱通的方法微信免手续费提现
    近期给朋友推荐的笔记本型号
    江苏中石化加油卡积分的几种类别
    Selenium geckodriver异常
  • 原文地址:https://www.cnblogs.com/hao-1234-1234/p/6054775.html
Copyright © 2020-2023  润新知