`

c# 引用类型和值类型区别

阅读更多
值类型包括C#的基本类型(用关键字int、char、float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型);而引用类型包括类(用class关键字声明的类型)和委托(用delegate关键字声明的特殊类)。

C#中的每一种类型要么是值类型,要么是引用类型。所以每个对象要么是值类型的实例,要么是引用类型的实例。值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。引用类型的对象总是在进程堆中分配(动态分配)。

System.Object和System.ValueType

引用类型和值类型都继承自System.Object类。不同的是,几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类,即直接继承System.ValueType。作为所有类型的基类,System.Object提供了一组方法,这些方法在所有类型中都能找到。其中包含 toString方法及clone等方法。System.ValueType继承System.Object。它没有添加任何成员,但覆盖了所继承的一些方法,使其更适合于值类型。

值类型
C#的所有值类型均隐式派生自System.ValueType:

结构体:struct(直接派生于System.ValueType)。

数值类型:整型,sbyte(System.SByte的别名),short(System.Int16),int(System.Int32),long(System.Int64),byte(System.Byte),ushort(System.UInt16),uint(System.UInt32),ulong(System.UInt64),char(System.Char)。

浮点型:float(System.Single),double(System.Double)。

用于财务计算的高精度decimal型:decimal(System.Decimal)。

bool型:bool(System.Boolean的别名)。

用户定义的结构体(派生于System.ValueType)。

枚举:enum(派生于System.Enum)。

可空类型。

每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。例如:

int i = 0;

等价于:

int i = new int();

使用new运算符时,将调用特定类型的默认构造函数并对变量赋予默认值。在上例中,默认构造函数将值0赋给了i。

引用类型

数组(派生于System.Array)

类:class(派生于System.Object);

接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。接口只是表示一种contract约定[contract])。

委托:delegate(派生于System.Delegate)。

object(System.Object的别名);

字符串:string(System.String的别名)。

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

1.赋值方式不同:基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
2.值类型不可能派生出新的类型:所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。
3.值类型不可能包含 null 值:然而,可空类型功能允许将 null 赋给值类型。
4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。


1、这个类型分配在哪里?
值类型:分配在栈上
引用类型:分配在托管堆上
2、基类型是什么?
值类型:必须继承自System.ValueType可以继承自除了System.ValueType以外的任何类型,只要那个类型不是sealed(密封)的
3、这个类型能作为其他类型的基类吗?
值类型:不能。值类型是密封的,不能被继承
引用类型:是的。如果这个类型不是密封的,它可以作为其他类型的基类
4、默认的参数传递是什么?
值类型:变量是按值传递的(也就是,一个变量的副本被传入被调用的函数)变量是按引用传递(例如,变量的地址传入被调用的函数)
5、我可以为这个类型定义构造函数吗?
值类型:是的,但是默认的构造函数被保留(也就是自定义构造函数必须全部带有参数)
引用类型:当然!
6、这个类型的变量什么时候消亡?
值类型:当它们越出定义的作用域时。
引用类型:当托管堆被垃圾回收时。
引用类型:
引用类型:


分享到:
评论

相关推荐

    C#中引用类型和值类型的区别

    在C#编程语言中,类型系统是其核心组成部分,它主要分为两大类:引用类型和值类型。这两种类型的差异在程序设计与优化中扮演着关键角色,了解它们的区别对于提高代码质量和性能至关重要。 ### 引用类型 引用类型在...

    c# 引用类型和值类型区别 (2).docx

    C#编程语言中,引用类型和值类型是两种基本的类型分类,它们有着显著的不同,对程序员的理解和使用至关重要,因为这直接关系到程序的性能和内存管理。 1. **值类型**:值类型包括基本类型(如int、char、float等)...

    C#引用类型和值类型的区别

    在C#编程语言中,值类型和引用类型是两种主要的数据类型,它们在内存管理和行为上有显著的区别。值类型直接存储其实际值,比如整数、浮点数、布尔值,以及自定义的结构体(struct)和枚举类型。变量在栈中分配内存,...

    C#值类型与引用类型区别

    在C#编程语言中,值类型和引用类型是两种基本的数据类型,它们在内存管理和操作方式上有着显著的差异。了解这些差异对于编写高效、安全的代码至关重要,尤其是在处理大量数据或复杂对象时。 首先,让我们来探讨值...

    C#引用类型的赋值 类的赋值

    在C#编程语言中,变量分为两种类型:值类型和引用类型。本文将重点介绍引用类型的赋值特点及其背后的实现机制。 #### 一、引用类型的定义与特点 在C#中,除了基本类型(如`int`、`char`、`float`等)之外的所有...

    c# 值类型 引用类型 内存分析

    c# 值类型 引用类型 内存分析 图解 ,从根本上理解值类型和引用类型变量的本质区别。

    C#中引用类型和值类型

    C#中的引用类型和值类型 C# 中的类型系统可以分为两大类:引用类型(reference type)和值类型(value type)。了解这两种类型的差异是非常重要的,因为它们在内存中的存储方式、赋值方式和使用场景都有所不同。 ...

    C#基础知识 值类型、引用类型

    本文将深入探讨C#中的核心概念:值类型和引用类型。这两种类型在内存管理和数据处理上有着显著的区别,理解它们对于编写高效且无错的代码至关重要。 值类型(Value Types)包括基本类型如整型(int)、浮点型...

    c# 引用类型与值类型的区别详解

    用Jeffrey Richter(《CLR via C#》作者)的话来说,“不理解引用类型和值类型区别的程序员将会把代码引入诡异的陷阱和诸多性能问题”。这就要求我们正确理解和使用值类型和引用类型。值类型包括C#的基本类型(用...

    训练师脚本:《使用C#中的枚举、结构、值类型和引用类型

    ### 使用C#中的枚举、结构、值类型和引用类型 #### 枚举(Enum) **定义**: 枚举是一种特殊的类,它定义了一组固定的命名常量,通常用于表示一系列预定义的值。 **语法**: ```csharp [访问修饰符] enum 枚举名 { ...

    C#中的值类型和引用类型

    在C#编程语言中,值类型和引用类型是两种基本的数据类型,它们在内存管理和数据存储方式上有着显著的区别,对程序性能和行为有直接影响。理解这两种类型是编写高效、安全C#代码的关键。 值类型(Value Types): 1....

    C#源代码-值类型和引用类型.zip

    在C#编程语言中,值类型和引用类型是两种基本的数据类型分类,它们在内存管理、性能和使用方式上有着显著的区别。理解这两者之间的差异对于编写高效且可靠的C#程序至关重要。 一、值类型(Value Types) 1. 定义:...

    理解 C#值类型与引用类型 (2).docx

    在C#编程中,了解值类型(Value Types)与引用类型(Reference Types)的区别至关重要,因为这直接影响到程序的性能和正确性。这两种类型的本质差异在于它们如何在内存中存储和处理。 1. 通用类型系统(Common Type...

    C#基础知识 值类型装箱

    总结一下,C#中的值类型装箱是一个将值类型转换为引用类型的过程,允许值类型与null比较并参与多态操作,但会引入额外的内存消耗和性能开销。了解和合理运用装箱、解箱机制,是提升C#程序性能的关键之一。通过实践和...

    理解C# String类型:特殊的引用类型

    C# String 类型:特殊的引用类型 C# String 类型是一个特殊的引用类型,它的实例是只读的。这意味着 String 类型的变量在被赋值时,实际上是重新创建了一个字符串,而不是修改原来的字符串。这点与其他引用类型不同...

    浅谈C#中的值类型和引用类型

    C#只有两种数据类型:值类型和引用类型 值类型在线程栈分配空间,引用类型在托管堆分配空间 值类型转为引用类型称成为装箱,引用类型转为值类型称为拆箱 以下是值类型和引用类型对照表 从上图可以简单看出:string...

    理解 C#值类型与引用类型.docx

    在C#编程中,理解值类型和引用类型是至关重要的,因为它们决定了变量如何存储、复制和传递。本文将深入探讨这两个概念,并提供实用的建议,以帮助开发人员避免潜在的错误和性能问题。 1. **通用类型系统** C#的...

    c#基础系列之值类型和引用类型的深入理解

    C#基础系列之值类型和引用类型的深入理解 C#把数据类型分为值类型和引用类型,它们是CLR支持的两种基本类型。值类型直接存储值,而引用类型存储对值的引用。值类型存储在堆栈中,而引用类型存储在托管堆上。存储...

    理解 C#值类型与引用类型 (2).pdf

    在C#编程中,理解值类型和引用类型是至关重要的,因为这直接影响到代码的运行效率和健壮性。本文将深入探讨这两种类型的区别、内存布局以及如何在实践中正确使用。 1. 通用类型系统(Common Type System, CTS) CTS...

    C#类和接口、虚方法和抽象方法及值类型和引用类型的区别等等.........

    这里有好多比较好的资料,很适合正在学习Java和对Java想进一步了解的朋友. ... 一.C#类和接口、虚方法和抽象方法及值类型和引用类型的区别 二 .C#中 接口与抽象类 的区别 三.浅谈java封装思想 四.抽象类和接口的区别

Global site tag (gtag.js) - Google Analytics