c# - 数据类型 - 值类型

c#支持两种基本数据类型:值类型引用类型

  • 值类型的变量的值存储到Stack(桟)上
  • 引用类型的变量包含的是一个引用,引用本身存储在stack(桟)上,但此引用指向heap(堆)上的一个对象。
  • c#支持两种值类型:枚举enum)和结构struct

Enum

  • 使用?修饰符可以新建一个可空的数据枚举变量,eg:
enum Season { Spring, Summer, Fall, Winter}
Season? currentSeason = null; 
  • eunm中每一个文字常量都有一个整数索引值(默认是int类型)与其对应,且默认是ZeroIndex(从0递增),但可以通过给一个文字常量赋一个整数,更改其索引值enum Season { Spring, Summer = 2, Fall, Winter}。可以对一个枚举常量做基本的整数运算,++,--,+,-等。若计算后的整数值有其对应的文字常量,则输出文字常量;否则输出整数值
  • enum Season : long { Spring, Summer, Fall, Winter} 则会把整数索引值的类型更改为Long类型,其他支持的类型包括:byte, sbyte, short, ushort, int, uint, long, ulong共8种。
  • enum Season { Spring, Summer, Fall = Autumn, Winter} 则会把Autumn和Fall的索引值设为一样。

Struct

  • c#中有大量大结构体:
关键字 等价类型 类型
bool system.Boolean 结构体
byte system.Byte 结构体
string system.String
object system.Object

同样,decimal,double,float,int,long,short,ushort,uint,ulong都是结构体。

  • 可以为自己定义的结构体声明构造函数,但构造函数中必须初始化所有的字段。结构体和类的主要区别如下图:
    c# - 数据类型 - 值类型_第1张图片
    class VS struct.jpg
  • 结构体和类的默认构造函数会把其中的字段初始化为0,false或null
  • 可以重载自己写的结构体的ToString方法,用合适的字符串进行输出
  • 可以把已赋值的结构体A 赋值给同类型的结构体变量B,内存中的存储是在桟上给A,B分配了各自的存储空间。**类 **则是在堆(heap)上分配了存储空间,在桟上存储了A,B指针指向堆上类的实例——即对象,如果A改变了对象的值,B也将随之改变。

你可能感兴趣的:(c# - 数据类型 - 值类型)