C#中值类型和引用类型的差别浅记
C#中值类型和引用类型的差别浅记
int x = 2;
值类型变量x。在内存中的某处直接存储了它自身的值:2。
引用类型的变量存储的是对其对象的引用。更进一步说,就是引用类型变量在内存中直接存储了一个指向它处的引用。而引用所指的对象则保存在引用类型变量所指的内存中。如代码所看到的。
public class Thing
{
int x;
}
Thing x = newThing();
引用类型变量x,在对它进行声明时。会在内存中的某处分配一块空间存储它自身的内容,而我们所使用的变量x,实际上则是一个指向了它自身内容的引用。
注意。稍后我们会说到,引用类型的变量,它自身的内容总是保存在堆中。而值类型的变量,它自身的值总是分配在声明它的地方(可能在栈中,也可能在堆中)。
那么。C#中的值类型与引用类型,都有哪些差别呢,让我们来列举一下。
1、由于值类型变量存储的就是它自身的值。所以它总是包括一个值。不能为空。而引用类型变量存储的是一个指向它处的引用,所以能够为空(null),表示不包括值,即没有指向内存中的不论什么地方。
2、引用类型直接继承自System.Object类,与此不同。值类型直接继承自System.ValueType类,而System.ValueType类直接继承自System.Object类。作为全部类型的基类,System.Object类提供了一组方法,这些方法在全部类型中都能找到,如ToString方法等。System.ValueType类继承了System.Object类,它并没有加入不论什么新成员,而仅仅是覆盖了所继承的一些方法。使其更适合于值类型。注意,我们能够使用Type.IsValueType属性来推断一个类型是否为值类型,如代码所看到的
Thing x = new Thing();
if( x.GetType().IsValueType ) {
// Todo Something
}
3、引用类型对象和值类型对象。它们在内存中的存储分配规则不同。
引用类型对象总是分配在堆中;而值类型对象总是分配在它被声明的地方:若值类型对象作为字段被声明。那么它将尾随其所属的对象被分配;若值类型对象作为局部变量被声明,那么它将存储在栈上。如代码所看到的。
public class Thing
{
int x; // x作为字段,x为值类型,尾随引用类型的对象被分配,位于堆上
}
Thing x = new Thing();
int x = 2;// x作为局部变量,x为值类型,位于栈上
4、全部的值类型都是密封的(seal)。无法派生出新类型,而引用类型则能够继续派生。这也是值类型更适合于数据存储,而引用类型更适合于定义行为的原因。
最后。把C#中值类型与引用类型的划分所有列举一下:
作为值类型的数据类型 |
bool byte char decimal double float int long short sbyte uint ulong ushort enum struct |
作为引用类型的数据类型 |
class object string interface delegate |
好了,关于C#中值类型与引用类型的差别临时就记录这么多。兴许若有补充还会继续完好。
C#中值类型和引用类型的差别浅记的更多相关文章
- JavaScript中值类型和引用类型的区别
JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...
- JAVA中值类型和引用类型的不同(面试常考)
转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...
- C#中值类型和引用类型图解
举几个值类型和引用类型的内存配置: 值类型存储在栈中,引用类型堆里: 1,数组 数组是引用类型,但是数组的元素可以是值类型或引用类型 2. 结构 结构是值类型,简略的看个例子 struct sampl ...
- C#中值类型和引用类型
本文将介绍C#类型系统中的值类型和引用类型,以及两者之间的一些区别.同时,还会介绍一下装箱和拆箱操作. 值类型和引用类型 首先,我们看看在C#中哪些类型是值类型,哪些类型是引用类型. 值类型: 基础数 ...
- java中值类型和引用类型的区别
[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...
- JavaScript中值类型与引用类型
JavaScript中的变量类型有哪些? 值类型:字符串(string).数值(number).布尔值(boolean).null.undefined 引用类型:对象(Object).数组(Array ...
- .net中值类型、引用类型理解的c#代码示例
下面是以前在公司的时候给别人讲解值类型.引用类型时创建的c#代码示例,从实际使用时的角度出发,对于初学者还是很有帮助的.这里并没有深入讲解值类型包含引用类型成员时(如struct)在内存中的存放情况等 ...
- JS中值类型和引用类型
一.值类型 例子: var a=10; var b=a; a=20; console.log(b); 例子中,将a的值赋给了b,b=10,然后改变a的值不会影响b的值,a和b是独立的两份,互不影响. ...
- C#中值类型与引用类型通俗理解
关于值类型和引用类型已经有很多人写了很多文章,但是很多人也只是停留在字面上的理解,如果采用一种通俗的方法来解释,想必很多人都会理解.我们都知道值类型存储在栈上,引用类型存储在堆上,引用类型都是xxx类 ...
随机推荐
- syslog命令
更多请关注 Linux命令大全 syslog 介绍 syslog是Linux系统默认的日志守护进程.默认的syslog配置文件是/etc/syslog.conf文件.程序,守护进程和内核提供了访问系统 ...
- CSS3-transform-style
transform-style属性 transform-style属性是3D空间一个重要属性,指定嵌套元素如何在3D空间中呈现.他主要有两个属性值:flat和preserve-3d. transfor ...
- read content in a text file in python
** read text file in pythoncapability: reading =text= from a text file 1. open the IDLE text editor ...
- 基础训练 Sine之舞
Sine之舞 #include<iostream> #include<vector> #include<string.h> using namespace std; ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph
"Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a ...
- PHP 微信分享(及二次分享)
js部分: <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> &l ...
- 1. Go的安装和第一行代码
Go 语言环境安装 Go 语言支持以下系统: Linux FreeBSD Mac OS X(也称为 Darwin) Windows 安装包下载地址为:https://golang.org/dl/. 如 ...
- 七丶人生苦短,我用python【第七篇】
模块 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个 ...
- 【死磕 Spring】
[死磕 Spring]----- IOC 之深入理解 Spring IoC-------https://www.cnblogs.com/chenssy/p/9576769.html 1.Resourc ...
- windows和ubuntu14.04双系统设置默认启动项
首先开机或者重启,在启动项选择菜单处记住win7对应的序号,从上至下的序号从0开始计数,我的win7系统选项处于第5个,那么序号就应该是4,记住后,打开ubuntu系统. 2 按下Ctrl+alt+T ...