• 了解向方法传递结构和向方法传递类引用之间的区别(C# 编程指南)


    下面的示例演示如何使用 结构 到方法与通过  实例不同传递给方法。在此示例中,两个参数 (结构和类实例) 将值和两个方法通过更改参数的一个字段的值。但是,这两个方法的结果是不同的,因为的传递,当您通过时结构什么不同通过,则可以通过类的实例。

    由于结构是 值类型,那么,当您对方法的 使用结构值 ,方法受到并对结构参数的副本。方法无法访问原始结构中调用方法并不能将其更改任何方式。该方法可以仅更改副本。

    类的实例是 引用类型,而不是值类型。当对方法的 引用类型通过值 ,方法进行引用的复制到类实例。即方法受到实例,而不是复制实例的地址的副本。在调用方法的类实例都有一个地址,在调用方法的参数的地址的副本,因此,两个地址是否引用同一对象。由于该参数包含该地址的副本,调用方法不能更改类实例的地址在调用方法的。但是,调用方法可以使用该地址访问原始地址和该副本引用的类成员。如果调用方法将类成员,在调用方法的原始类的实例也会发生更改。

    下面的示例的输出显示差异。,因为该方法在参数中使用该地址查找类的实例,的指定字段调用将类实例的 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
  • 相关阅读:
    node.js 实际应用记录
    常用数组操作方法 包含es6语法
    JavaScript获取获取屏幕、浏览器窗口 ,浏览器,网页高度、宽度方法汇总
    vue-cli脚手架发布项目进行build压缩时遇到的问题
    路由传参
    vue 点击新的路由<router-link to=‘’></router-link>时 同时嵌套一个新网页
    vue-cli 里 利用mockjs 实现模拟后台数据并成功请求
    vue2.0 实现click点击当前li,动态切换class
    vue 动态获取浏览器内容高度并赋值给元素
    在vue中给列表中的奇数行添加class
  • 原文地址:https://www.cnblogs.com/huibin-benteng/p/5044787.html
Copyright © 2020-2023  润新知