浅析C#类的创建与初始化

作者:MA2安全团队 分类: 编程 发布于:2018-3-26 20:00 ė491次浏览 60条评论
 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#中值类型与引用类型的区别暂时就记录这么多,后续若有补充还会继续完善。

本文出自 MA2安全网,转载时请注明出处及相应链接。

发表评论

电子邮件地址不会被公开。必填项已用*标注


Ɣ回顶部