c# 引用类型和值类型_C#教程

CLR支持两种类型:引用类型和值类型。
引用类型总是从托管堆上分配的。

c#中的New操作符返回对象的内存地址。

引用对象的注意点:

1、内存从托管堆中分配
2、堆上分配对象,有一些额外的操作,影响一些性能的
3、从托管堆中分配一个对象时,可能强制执行一次垃圾回收。

CLR中的值类型是轻量级的。不需要提领一个指针,不需要垃圾回收,可以减少垃圾回收的次数。
在CLR中一般称为“类”的都是引用类型,所有的值类型都称为结构或者枚举。
所有的结构都是抽象类ValueType的直接派生类。ValueType是直接从Object派生的。
所有的枚举都是从Enum抽象类中派生的,Enum又是从ValueType派生的。

一个值类型可以实现一个或者多个接口,但是不能继承基类。所有的值类型都是隐式密封的。

c#中用struct声明结构,class声明类。

值类型应满足:

1、类型具有基元类型
2、类型不需要从其他任何类型继承
3、不会作为基类
4、类型的大小不要超过16k

值类型和引用类型的不同点:

1、不能将值类型作为基类型
2、引用类型变量包含的是堆上的一个对象地址。值类型是值对象本身。
3、值类型赋值的时候会执行一次逐字段的复制,引用类型变量赋值的时候,只复制内存地址。
4、引用类型的多个变量可能引用堆中的同一个对象,值类型是自成一体的,互不影响的。

时间: 2024-10-23 02:12:52

c# 引用类型和值类型_C#教程的相关文章

C# 引用类型、值类型

CLR支持两种类型:引用类型和值类型,它们的区别是在内存分配方式上的差异:引用类型是从托管堆上分配的:值类型是在线程栈上分配的.而CLR的垃圾回收是针对托管堆的,因此值类型不受垃圾回收器的控制. 在FCL中,所有称为"结构"(struct)的类型都是值类型,所有称为"类"(class)的类型都是引用类型.所有的Struct都直接派生自抽象类System.ValueType,而System.ValueType直接从System.Object派生.所有的枚举都直接从Sy

[CLR via C#]5.2 引用类型和值类型

原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的new操作符会返回对象的内存地址--也就是指向对象数据的内存地址. 使用引用类型必须注意到一些性能问题,首先考虑一下事实: 1)内存必须从托管堆上分配. 2)对上分配的每个对象都有一些额外的成员(比如前面提到过得"类型对象指针"和"同步块索引"),这些成员必须初始化. 3)

C#当中的引用类型和值类型的困域

问题描述 即然string是引用类型的但是下面这段代码为什么还是输出test呢?classProgram{staticvoidMain(string[]args){stringa="test";stringb=a;b="";Console.WriteLine(a);}} 解决方案 解决方案二:http://www.21cnvip.net/TopicView/list5748512.html解决方案三:修改其中一个字符串,这会创建一个全新的string对象,而另一个字

C#基础知识 全面解析可空类型_C#教程

引言: C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪些内容(最近一直都在思考如何来分享这篇文章的,因为刚开始觉得可空类型使用过程中比较简单,觉得没有讲的必要,但是考虑到这个系列的完整性,决定还是唠叨下吧,希望对一些不熟悉的人有帮助). 一.为什么会有可空类型   如果朋友们看了我之前的分享,对于这一部分都不会陌生,因为我一般介绍C#特性经常会以这样的方式开头的, 因为每个特性都是有它出现的原因的(有一

引用类型和值类型,装箱与拆箱,对象的相等与同一

引用类型与值类型 在FCL里面的大多数类型是引用类型,引用类型从托管堆上分配内存,值类型分配在线程栈里.new运算符返回对象的内存地址--指向对象的二进制位,使用引用类型时需要清楚下面几点: 1.从托管堆上分配内存     2.每一个堆上的对象都有额外的成员需要初始化     3.在对象里的其他字节通常置为0    4.从堆分配的对象会导致GC的出现 值类型有装箱和拆箱两种呈现形式,引用类型始终是装箱的形式.值类型从System.ValueType派生,这个类型提供了跟System.Object

请从内存的角度 来解释一下 引用类型和值类型的区别

问题描述 另外声明一个对象比如class1跟class1=newclass1():这两个从内存的角度又有什么区别 解决方案 解决方案二:你搞清楚堆和堆栈的概念就明白了...看书去吧...解决方案三:看不明白撒解决方案四:有new好像在内存堆中开辟了空间解决方案五:引用类型只是将指针指向内存中得存储单元,但值类型是将内存单元复制到自己内存副本中,也就说引用类型内存中存储值只有1个,但值类型不是当一个值类型变量声明之后,就会在栈的内存中分配一块值类型的大小内存给这个变量存放值类型自身的值如果是引用类

C# 7.0 新特性1之基于Tuple的“多”返回值方法_C#教程

原文链接:http://www.cnblogs.com/ylvict/p/5573094.html 回顾  首先,提出一个问题,C#中,如何使一个方法可返回"多个"返回值?  我们先来回顾一下C#6.0 及更早版本的做法.   在C#中,通常我们有以下4种方式使一个方法返回多条数据.•使用 KeyValue 组合 • static void Main(string[] args) { int int1 = 15; int int2 = 25; var result = Add_Mult

C#判断一个String是否为数字类型_C#教程

方案一:Try...Catch(执行效率不高) 复制代码 代码如下: private bool IsNumberic(string oText) {     try     {         int var1=Convert.ToInt32 (oText);         return true;     }     catch     {         return false;     } } 方案二:正则表达式(推荐) a) 复制代码 代码如下: public static bool

通过C#调用cmd来修改服务启动类型_C#教程

可以使用System.ServiceProcess.ServiceController这个类允许连接到正在运行或者已停止的服务.对其进行操作或获取有关它的信息.ServiceController 提供了开始和停止服务的方法(Start, Stop). 但是这个类并没有提供修改服务启动类型的方法,可以通过C#调用cmd来修改 参考网上的这个方法: //设置服务的启动类型 //sServiceName服务名称 //iStartType要设置的启动类型 2:自动,3:手动,4:禁用 //返回成功状态