精华内容
下载资源
问答
  • C# 值类型和引用类型

    2016-03-31 10:32:47
    值类型和引用类型

    从概念上看,值类型和应用的区别是:

     值类型直接存储值,存储在堆栈中,超出作用域后系统自动释放内存,初始化后才能使用。以下类型属于值类型:

    1、 整型(sbyte, byte, short, ushort, int, uint, long, ulong);

    2、 字符型(char);

    3、 浮点型(float, double);

    4、 decimal类型;

    5、 bool类型;

    6、 结构类型(struct);

    7、 枚举(enum);

    引用类型存储对值的引用,存储在托管堆中,通过垃圾回收机制进行回收,初始化时默认为null。以下类型属于引用类型

    1、 类;

    2、 接口;

    3、 委托;

    4、 数组;

    5、 内置object;

    6、 内置string;

     

    基本类型(如int、bool)为值类型,包含许多较大类型(通常在有类的情况下)为引用类型,C#设计这种方式的原因是可以得到最佳性能。如果要把自己的类型定义为值类型,应该把它声明为一个结构。

     

    //值类型,下面的语句会在内存的两个地方存储值20

    int i = 20;

    int j = i;

     

    //引用类型,代码假定已经定义了个类Vector,Vector是一个引用,他有一个int类型的成员变量Value:

    Vector x, y;

    x = new Vector();

    v.Value = 30;

    y = x;

    Console.WriteLine(y.Value);

    y.Value = 50;

    Console.WriteLine(x.Value);

     

    输出:

    30

    50

    在执行这段代码后,只有一个Vector对象。x和y都指向包含对象的内存位置。因为x和y是引用类型的变量,声明这两个变量只保留了一个引用——而不会实例化给定类型的对象。两种情况下都不会真正创建对象。要创建对象,就必须使用new关键字。因为x和y引用同一对象,所以对x的修改会影响y,反之亦然。string类型属于引用类型,但对string的操作与此不同,详见:string类型(引用类型)

    展开全文
  • 主要介绍了c#值类型和引用类型使用示例,需要的朋友可以参考下
  • 本篇文章主要是对C#中值类型和引用类型进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
  • C#和Java中对象分为值类型和引用类型,不同类型的对象存储方式不同,如果想要深入了解程序首先要分清楚:哪些是值类型?哪些是引用类?

    C#和Java中对象分为值类型和引用类型,不同类型的对象存储方式不同,如果想要深入了解程序首先要分清楚:哪些是值类型?哪些是引用类?

    C#中值类型和引用类型

    这里写图片描述
    区别:
    1、值类型分配在栈上,它的变量直接存储变量的对象。
    2、引用类型分配在栈上,它的变量通常存储一个指向对象的指针,变量通过该指针来引用对象,对象存储在托管堆中。
    3、值类型继承自ValueType(注意:System.Value又继承自System.Object);引用类型继承自System.Object。
    4、值类型变量存储其实例数据,因此在默认情况下,值类型的参数传递不会影响参数本身;而引用类型变量存储其数据在托管堆中的地址,因此以引用方式进行参数传递会影响到参数本身,因为两个变量引用了内存中的同一块地址。
    5、值类型有装箱和拆箱两种表示,运行库提供了所有值类型的已装箱形式;而引用类型只有装箱形式。
    6、值类型的内存不由GC控制,作用域结束时值类型会自动释放,减少了托管堆的压力,因此具有性能上的优势。例如:通常struct比class更高效;引用类型的内存回收由GC来完成。
    7、值类型是密封的(sealed),不能作为其他任何类型的基类,但是可以单继承或多继承接口;而引用类型一般都有继承性。
    8、值类型不具有多态性;而引用类型具有多态性。
    9、值类型变量不可为null值,值类型变量都会自动初始化为0值;而引用类型变量默认情况下创建为null值,表示没有存储任何指向托管堆的引用地址。对值为null的引用类型对象做任何操作,都会抛出NullReferenceException异常。
    值类型默认值截图:
    这里写图片描述
    引用类型默认值截图:
    这里写图片描述

    Java中值类型和引用类型

    Java中值类型只有八种,没看错只有八种:byte、short、int、long、float、double、char、boolean,其余的全部都是引用类型。

    展开全文
  • 理解C#值类型和引用类型

    千次阅读 2012-06-02 11:04:34
    网上偶尔浏览到这一篇文章,还不错就修改了下分享给大家。  工作许久了,可是对C#值类型和C#引用类型却一直无法很好的理解。这两天花了不少时间查找... C#值类型数据直接在他自身分配到的内存中存储数据,而C#引用

             网上偶尔浏览到这一篇文章,还不错就修改了下分享给大家。

            工作许久了,可是对C#值类型和C#引用类型却一直无法很好的理解。这两天花了不少时间查找资料,看文章,终于有所收获,在此将自己理解整理出来,方便日后自己查看,同时希望对跟我有一样困惑的朋友有所帮助。废话不多说,下面开始说说怎么理解值类型和引用类型!

            C#值类型数据直接在他自身分配到的内存中存储数据,而C#引用类型只是包含指向存储数据位置的指针。

            1.值类型

            那么有哪些类型是C#值类型的呢,我把他们归纳成三类:       

            1)基础数据类型(string类型除外):包括整型、浮点型、十进制型、布尔型。

            整型包括:sbyte、byte、char、short、ushort、int、uint、long、ulong 这九种类型;

            浮点型就包括 float 和 double 两种类型;

            十进制型就是 decimal ;

            布尔型就是 bool 型了。

            2)结构类型:就是 struct 型

            3)枚举类型:就是 enum 型

            2.引用类型

             有五种:class(类)、interface(接口)、delegate(委托)、object(通用对象)、string(字符串)

            上面说的是怎么区分哪些C#值类型和C#引用类型,而使用上也是有区别的。所有值类型的数据都无法为null的,声明后必须赋以初值;引用类型才允许为null。

    int i = 0;   
    //或者   
    int i = new int();   
    //以上两种都是可以正确的且是等同的   
    int i = null;//这样的语句是无法通过编译的,因为i是值类型的,是不允许为null的   
    class c = null;//这样则是可以通过编译的,这里的c是引用类型的,允许为null  

            值类型和引用类型在赋值(或者说复制)的时候也是有区别的。值类型数据在赋值的时候是直接复制值到新的对象中,而引用类型则只是复制对象的引用。例如:

    public class abc   
    {   
    public int Attribute;   
    public abc()   
    {   
    Attribute = 1;   
    }   
    }   
    public static void Main()   
    {   
    int i = 0;   
    int j = i;   
    i = 1;   
    Console.WriteLine("i={0}",i);   
    Console.WriteLine("j={0}",j);   
    //结果是:   
    //i=1   
    //j=0   
    abc a1 = new abc();   
    abc a2 = a1;   
    a1.Attribute = 2;   
    Console.WriteLine("a1={0}",a1.Attribute);   
    Console.WriteLine("a2={0}",a2.Attribute);   
    //结果是:   
    //a1=2   
    //a1=2   
    }  

            这个例子就很好的说明了值类型和引用类型的不同了。

            最后还有值C#类型要么是分配在堆栈的,要么就是在结构中以内联方式分配的。C#引用类型是分配在堆的。C#引用类型和C#值类型都是从基类 Object 派生出来的。当C#值类型需要充当对象时,就在堆上分配一个包装(该包装能使值类型看上去像引用对象一样),并且将该值类型的值复制给它。该包装被加上标记,以便系统知道它包含一个值类型。这个进程称为装箱,反过来操作就称为拆箱。装箱和拆箱能够使任何类型像对象一样进行处理。

    展开全文
  • C#值类型和引用类型解析

    千次阅读 2012-10-24 19:05:42
    C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。 常见的值类型数据有:整值型(整形,浮点型,十进制型),布尔类型,枚举类型; 引用类型有:接口,数组,Object类型...

    在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。

    常见的值类型数据有:整值型(整形,浮点型,十进制型),布尔类型,枚举类型;

    引用类型有:接口,数组,Object类型,类,委托,字符串,null类型。

    在C#中每种类型的存储方式有两种:1)分配在托管栈中;2)分配在托管堆中;

    内存的分配有CLR管理(即公共语言运行时),这两种方法的区别是:

    1)分配在托管栈中的变量会在创建它们的方法返回时自动释放,例如在一个方法中声明Char型的变量UserInput=C,当实例化它的方法结束时,UserInput变量在栈上占用的内存就会自动释放;

    2)分配在托管堆中的变量并不会在创建它们的方法结束时释放内存,它们所占用的内存会被CLR中的垃圾回收机制释放。

    看下面的代码:

    static void Main(string[] args)
            {
                //当nStudent声明并赋值是,这时在托管栈上就会开辟一块内存来存储nStudent的值,当实例化nStudent的Main()方法结束时,
                //nStudent在托管栈上占用的内存会自动释放。
                int nStudent = 0;
                //当声明strStuName时,这个时候“小明”存储在托管堆中,而托管栈中存储的是strStuName指向的引用。
                string strStuName = "小明";
    
                Console.WriteLine("学生的总数是{0},五号的名字是{1}", nStudent, strStuName);
                Console.ReadKey();
            }

    装箱和拆箱

    当值类型的数据转换成引用类型时,CLR会先在托管堆配置一块内存,将值类型的数据复制到这块内存,然后再让托管栈上的引用类型的变量指向这块内存,这样的过程称为装箱。相反的话,有引用类型转换成值类型的话就称为拆箱。

    一般情况下,.NET会主动的帮我们完成装箱操作,但是拆箱并非主动,我们必须知道拆箱对象的实力类型,然后明确的去执行拆箱操作。

    int BirthdayNum = 1989;
                object BoxBirthdayNum = BirthdayNum;//系统自动装箱
                int nBirthdayNum = (int)BoxBirthdayNum;//明确数据类型的拆箱

    因为花费了更多的时间,所以装箱和拆箱对程序的性能有一定的影响。

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    类型推断

    从C#3.0开始,C#引入了一个隐式类型推断的关键字var,编译器可以通过它的初始值来判断变量的具体类型。var只能用于局部变量的声明,不能用于字段级的变量声明。使用var关键字时,var必须得有初始值,这样编译器才能判断是否是真实变量。

    class Program
        {
            static void Main(string[] args)
            {
                var i = 10;//隐式类型
                int m = 10;//显示类型
    
                var Program=new Program();
                Program.nAge = 20;
                Program.SayHello();
            }
    
            private int nAge;
            public void SayHello()
            {
                var message = "my age is {0}";
                Console.WriteLine(message, nAge);
            }
        }
    message初始值的变量为字符串类型,因此编译器可以推断其类型为String类型。


    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。

    展开全文
  • C# 值类型和引用类型--string

    千次阅读 2012-05-23 10:10:12
    C#中类型分为值类型和引用类型,其中string是引用类型。从第三个例子中看string似乎是值类型,但从第四个例子很容易能够看出string其实是引用类型,这个需要注意。 namespace ConsoleApplication1 { class A { ...
  • C#值类型和引用类型用C语言理解

    千次阅读 2014-09-21 19:58:43
    需要注意区别:对C\C++来说,任何类型都可以当成C#的“引用类型”,因为有指针。 【在内存上】 void foo() { int aaa = 0; //值类型,aaa在Stack上分配(SUB ESP,XX) int* paaa = new int[123]; //引用类型,...
  • 2.引用类型:表示指向存储在内存堆中的数据的指针或引用(包括类、接口、数组字符串)。 C#中定义的值类型包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal...
  • c#值类型和引用类型的比较

    千次阅读 2008-12-28 16:45:00
    C#中有两种类型的数据,一种是值类型数据,一种是引用类型数据。在编码的时候区分这两种类型数据,可以避免一些细小的编码错误。 首先说说什么类型是值类型,例如:int、float、bool之类的基础类型,以及用struct...
  • C#值类型和引用类型的区别

    千次阅读 2008-04-12 17:07:00
    C#中有两种类型的数据,一种是值类型数据,一种是引用类型数据。在编码的时候区分这两种类型数据,可以避免一些细小的编码错误。首先说说什么类型是值类型,例如:int、float、bool之类的基础类型,以及用struct...
  • C#值类型和引用类型

    千次阅读 2007-09-16 15:42:00
    由于值类型变量直接在堆栈中存储该类型的值,此类类型在内存的使用上以及访问的效能上比引用类型更好。因为引用类型变量存放的是指向实际对象的指针,因此访问对象时必须多进行一次内存引用的操作方可获得数据。且...
  • 主要介绍了C#值类型引用类型中的Equals和==的区别浅析,本文分别对C#值类型和引用类型中的Equals和==做了讲解和给出了实例,需要的朋友可以参考下
  •  引用类型和值类型都继承自System.Object类。不同的是,几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类,即直接继承System.ValueType。  作为所有类型的基类,System.Object提供了一组方法...
  • C#笔记 值类型 引用类型

    千次阅读 2015-09-17 18:23:52
    c# 值类型 引用类型 的说明
  • C#值类型和引用类型的区别
  • c# 引用类型和值类型

    2021-01-01 06:45:25
    CLR支持两种类型:引用类型和值类型。 引用类型总是从托管堆上分配的。 c#中的New操作符返回对象的内存地址。 引用对象的注意点: 1、内存从托管堆中分配 2、堆上分配对象,有一些额外的操作,影响一些性能的 3、从...
  • C#值类型引用类型区别,一些基础算法,刚入门的小伙伴,希望对你有用
  • C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。下面我们来简单谈谈C#中的值类型和引用类型
  • c#值类型引用类型

    千次阅读 2014-08-30 12:11:57
    一.引用类型值类型 值类型是个轻量级类型...注: 值类型的实例并不是一定在线程栈上,定义的位置也有关系,局部变量方法参数一定在栈上,但是类的成员变量总是会有类中的其他数据分配在一起,就有可能分配在堆上
  • c# 值类型 引用类型 内存分析 图解 ,从根本上理解值类型和引用类型变量的本质区别。
  • C#值类型引用类型

    千次阅读 2019-03-20 17:22:02
    类型 C#中的类型指的是{类,结构,接口,枚举,...类型可以分为值类型以及引用类型,没有第三种情况 值类型:结构枚举 引用类型:类、接口、指针、字符串、委托、数组 引用类型Reference Type 内存布局 引用...
  • 主要介绍了C#预定义数据类型之值类型和引用类型介绍,本文着重讲解了引用类型中的object(对象)类型和string(字符串)类型,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,092
精华内容 50,036
关键字:

c#值类型和引用类型

c# 订阅