值类型和引用类的区别是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值类型和引用类的区别是啥?相关的知识,希望对你有一定的参考价值。

值类型和引用类的区别是什么?
不要翻版
你不会回答就别回答 这样我们新人看不懂~

(1)值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据。
(2)引用类型:对象、数组、函数。

1、值类型:包括:sbyte、short、int、long、float、double、decimal(以上值类型有符号)byte、ushort、uint、ulong(以上值类型无符号)bool、char
2、引用类型:包括:对象类型、动态类型、字符串类型。二、具体区别:
1、值类型:byteb1=1;byteb2=b1;Console.WriteLine("0,1。",b1,b2);b2=
2;Console.WriteLine("0,1。",b1,b2);Console.ReadKey();解释:byteb1=1;声明b1时,在栈内开辟一个内存空间保存b1的值1。byteb2=b1;声明b2时,在栈内开辟一个内存空间保存b1赋给b2的值1。Console.WriteLine("0,1。",b1,b2);输出结果为1,1。b2=2;将b2在栈中保存的值1改为
2。Console.WriteLine("0,1。",b1,b2);输出结果为1,2。
2、引用类型:复制代码。
参考技术A 如果数据类型在它自己的内存分配中存储数据,则该数据类型就是“值类型”。“引用类型”包含指向存储数据的其他内存位置的指针。

值类型
值类型包括:

所有数字数据类型

Boolean、Char 和 Date

所有结构,即使其成员是引用类型

枚举,因为其基础类型总是 SByte、Short、Integer、Long、Byte、UShort、UInteger 或 ULong

引用类型
引用类型包括:

String

所有数组,即使其元素是值类型

类类型,如 Form

委托

非类型的元素
以下编程元素未限定为类型,因为您无法将它们中的任何一个指定为声明元素的数据类型:

命名空间

模块

事件

属性和过程

变量、常数和字段

使用对象数据类型
可以将引用类型或值类型指派给 Object 数据类型的变量。Object 变量总是存储指向数据的指针,从不存储数据本身。然而,如果将值类型指派给 Object 变量,则 Object 变量将表现得像存储自己的数据一样。有关更多信息,请参见 Object 数据类型。

通过将 Object 变量传递给 Microsoft.VisualBasic 命名空间中 Information 类的 IsReference 方法,可以确定该变量是用作引用类型还是值类型。如果 Object 变量的内容表示引用类型,则 Information..::.IsReference 返回 True。本回答被提问者采纳

引用类型和值类型

CLR支持两种类型:引用类型和值类型。

引用类型总是从托管堆上分配,值类型一般在线程栈上分配。

在.NET Framework SDK中指出,任何称为类的类型都是引用类型,所有值类型都成为结构或枚举

以下代码演示值类型与引用类型区别

class someref
{
    public int x;//引用类型
}
struct someval
{
    public int x;//值类型
}
namespace 值类型_引用类型
{
    class Program
    {
        static void Main(string[] args)
        {
            someref r1 = new someref();//在堆上分配
            someval v1 = new someval();//在栈上分配
            r1.x = 5;//提领指针
            v1.x = 5;//在栈上修改
            Console.WriteLine(r1.x);//显示5
            Console.WriteLine(v1.x);//显示5
            Console.ReadKey();

            someref r2 = r1;//只复制引用(指针)
            someval v2 = v1;//在栈上从新分配并复制成员
            r1.x = 8;//r1,r2会同时改变,因为r1跟r2指向同一个东西
            v1.x = 9;//只改变v1,v2不变,因为v1,v2是两个东西
            Console.WriteLine(r1.x);//显示8
            Console.WriteLine(r2.x);//显示8
            Console.WriteLine(v1.x);//显示9
            Console.WriteLine(v2.x);//显示5
        }
    }

}

值类型与引用类型的一些区别

     值类型有已装箱和未装箱两种形式,,引用类型总是处于已装箱形式。

     值类型从System.ValueType派生,该类型直接从System.Object派生,他重写了System.Object的Equals和GetHashCode方法。

     值类型不能作为基类定义一个新的基类型或者引用类型,所以不能再值类型中引入新的虚方法,所有方法不能是抽象的,所有方法都不能重写。

     引用类型的变量包含的是堆上的一个对象的地址。默认创建时被初始化为null,表明引用类型的变量当前不指向一个有效的对象。值类型的标量重视包含其基础类型的一个值,而且

值类型的所有成员都初始化为0,。

     将一个值类型的变量赋给另一个值类型变量时会进行一次逐字段的复制。将引用类型的变量赋给另一个引用类型时,只复制内存地址(如上例)。

     基于上一条,可能会有多个引用类型变量引用堆中的同一个对象,所以对一个变量的操作可能会影响其他变量引用的对象。相反值类型不会。

     由于未装箱的值类型不在堆上分配,当定义该类型的方法不处于活动状态时就会被释放,也不会通过Finalize方法接收到通知。

以上是关于值类型和引用类的区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C#在方法调用中,参数按值传递与按引用传递的区别是啥?

基本数据类型和包装类的区别

C# 泛型是引用类型还是值类型,是根据啥判断?

引用类型和值类型

java引用类型的类型转换规则是啥?

int和integer的区别是啥?