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类 ...
随机推荐
- 初涉期望dp/概率dp【在更】
大致可以分为两种:爆精度:小数取模.
- vim的卸载以及环境的配置小记
一.背景 由于之前配置错误,导致我的YouCompleteMe这个插件不能用了,一直提示: ERROR:Required vim compiled with +python. YouCompleteM ...
- 【DB_MySQL】MySQL重要知识点
MySQL中的select语句 各子句的执行顺序 SELECT语句的处理过程 1. FROM 组装数据来源 2. WHERE筛选元组 3. GROUP BY 将满足条件的元组进行分组 4. HAVIN ...
- python安装numpy模块
1.打开网址https://pypi.python.org/pypi/numpy,找到安装的python版本对应的numpy版本. 我的python版本是 下载的对应numpy版本是 2.将numpy ...
- python--MySQl单表查询
一. 关键字的执行优先级(重点) from where group by having # 使用是要放在group by 后面而且前面必须有group by select distinct # 去重 ...
- Web自动化Selenium2环境配置中Selenium IDE的安装
下载的firefox32.0的版本,但是在附件组件中只有selenuim IDE button,本以为这个就是selenium IDE插件,自以为是的后果就是把自己坑了.并且像一些selenium I ...
- Selenium启动项参数设置
再Selenium中使用不同的Webdriver可能会有不一样的方法,有些相同的操作会得到不同的结果, 本文主要介绍的是Chrome()的使用方法. 其他的Webdriver可以参考官方文档 Chro ...
- TOJ 3134: 渊子赛马修改版
3134: 渊子赛马修改版 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 458 ...
- HDU1007 TLE代码和AC代码对比
这题卡了一天,上午开始看算法导论,然后实现了,一开始是wa,后来TLE,由于我开始的实现方式比较笨,而且在递归调用的时候很是混乱,用了好多数组.导致我的代码不断的出问题.具体是算法导论33-4. 后来 ...
- ER模型图工具:PowerDesigner
导读:开始是想一个阶段一个阶段的写文档,再写了可行性分析报告之后,发现这种方法整体性不强,写出来的文档也总是有考虑不周的地方.后来,就看完了全部的软工视频再写.现在该写项目开发总结报告了.在写文档的过 ...