• C#值类型和引用类型


    C#的类型一共分为两类,一种是值类型(Value Type),一类是引用类型(Reference)。值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。

    值类型(value type)

    byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。

    引用类型(reference type)

    string 和 class统称为引用类型。当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。

    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Text;
    
     
    
    namespace Parameters
    
    {
    
        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                Dowork();
    
            }
    
     
    
            static void Dowork()
    
            {
    
                int i = 0;  // int 是值类型
    
                Console.WriteLine(i);   // i = 0
    
                Pass.value(i);          // 值类型使用的是 i 的副本,i不变
    
                Console.WriteLine(i);   // i = 0
    
     
    
                WrappendInt wi = new WrappendInt(); // 创建类 WrappendInt 的另外一个实例
    
                Console.WriteLine(wi.Number);   // 0 // 被默认构造器初始化为 0
    
                Pass.Reference(wi);     // 调用方法,wi 和 param 将引用同一个对象
    
                Console.WriteLine(wi.Number);   // 42
    
            }
    
        }
    
        class Pass
    
        {
    
            public static void value(int param)
    
            {
    
                param = 42; // 赋值操作使用的是值类型参数的一个副本,原始参数不受影响
    
            }
    
     
    
            public static void Reference(WrappendInt param) // 创建类 WrappendInt 的一个实例
    
            {
    
                param.Number = 42;  // 此参数是引用类型的参数
    
            }
    
        }
    
        class WrappendInt   // 类是引用类型
    
        {
    
            public int Number;
    
        }
    
    }

    总结

    c#的值类型是为变量在栈上分配了一块内存,用于存储数据,而引用类型分为两部分,声明时只在栈上分配了一小部分内存,堆上没分配,而new引用变量时,是在堆上分配了一块内存,存储的是栈上的内存地址,注意:struct是值类型,string和class是引用类型,string不需要new是因为想要语义化“字符串”省略创建过程

    文章转载自:快速开发平台
    地址:https://www.hocode.com/

  • 相关阅读:
    关于 RuntimeBinderException 异常
    IE 跨域session丢失问题
    一个简单的方法去掉angular application中URLs的hashtag
    ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
    (转载)Why you shouldn't use Entity Framework with Transactions
    angular自启动过程
    HTML中的IE条件注释,让低版本IE也能正常运行HTML5+CSS3网站的3种解决方案
    angualrjs 总结 随记(三)
    angualrjs 总结 随记(二)
    angualrjs 总结 随记(一)
  • 原文地址:https://www.cnblogs.com/frfwef/p/12763835.html
Copyright © 2020-2023  润新知