优秀的编程知识分享平台

网站首页 > 技术文章 正文

C#之值类型(c#值类型的简单类型包括)

nanyue 2024-08-11 20:33:16 技术文章 9 ℃

包括两个成员:结构体和枚举类型。一般字面上的数值都是值类型,例如int、double、bool等,实际上整数小数布尔值等都是结构体。

值类型默认值一般为0,例如整数小数,枚举类型默认值也为0。

基元类型

.NET语言都是运行在CTS上的,CTS提供了基本的类型,我们一般称为基元类型。虽然.NET下的各种语言使用的关键字不同,但最终映射的IL类型是同一个的,这样的类型就叫做基元类型,由CTS定义,编译器和BCL支持,是属于BCL而不是某一个具体的语言。基元类型包括几乎所有的值类型(当然除了开发者自定义的结构体和枚举),以及字符串,object和dynamic。

有了基元类型,.NET下的语言就更容易互操作。例如C#中int对应的基元类型为Int32,而VB.NET中int的关键字为Integer,它对应的类型依旧是Int32。

值类型的构造函数

对于值类型,构造函数必须为所有成员赋值,不支持无参构造函数。例如DateTime类型,是一个结构体,成员有年、月、日、时、分、秒、DayOfWeek等,有很多个构造函数,每个都有一个或多个输入。

何时考虑使用值类型

设置值类型的目的是为了提高程序的性能。

以下情况适合使用结构体:

  1. 对象的所有属性都需要在创建时赋值
  2. 对象的所有属性都是值类型。如果存在引用类型,就会牵扯到内存分配到堆上的问题。
  3. 当对象不需要被继承时。

例子:二维坐标系(包含两个double)、长方形(长、宽、面积等一些double)适合使用结构体。

值类型是密封的

值类型一定是密封的,不支持继承。如果值类型可以被其他类型继承,比如引用类型,那么它的创建就会牵扯到堆上的内存分配,违反了值类型的设计初衷。

值类型和引用类型的区别和联系

区别主要有:

1. 所有值类型隐式派生System.ValueType。这个类确保值类型所有成员全部分配到栈上,有例外:

  • 结构体含有引用类型时
  • 静态类型,一个变量是静态的,无论什么类型都会分配在加载堆上
  • 所以“值类型都分配在栈上,引用类型都分配在堆上”的说法是不准确的。

    2. 引用类型初值为null,值类型为0

    3. 引用类型栈中有一个变量名和变量类型,指向堆中的对象实例的地址。值类型仅有栈上的变量名和类型,不包括指向实例的指针。

    4. 值类型不能被继承, 引用类型可以。

    5. 值类型的生命周期是其定义域,值类型离开定义域就会立刻销毁,引用类型则会进入垃圾回收,至于何时销毁我们并不知道。

    6. 值类型的构造函数必须为所有成员赋值。

    7. 可以重写引用类型的析构函数,值类型不需要析构函数,因为析构函数只会被垃圾收集器调用

    联系主要有:

    1. 值类型和引用类型可以通过装箱和拆箱相互转化

    2. 类和结构都可以实现接口,结构体实现接口的例子:int、DateTime等都实现了IComparable接口,使得他们可以比较大小。

    最近发表
    标签列表