目录
2.引用类型定义为 class、record、delegate、数组或 interface 的类型。
C#数据类型系统
C# 是一种强类型语言。 每个变量和常量都有一个类型,表达式也是如此, 每个方法声明都为每个输入参数和返回值指定名称、类型和种类(值、引用或输出)。当在程序中声明变量或常量时,必须指定其类型或使用 var关键字让编译器推断类型。
内置类型
C# 提供了一组标准的内置类型。 这些类型表示整数、浮点值、布尔表达式、文本字符、十进制值和其他数据类型。 还有内置的 string
和 object
类型。 这些类型可供在任何 C# 程序中使用。 有关内置类型的完整列表。
自定义类型
可以使用 struct、class、interface、enum 和 record 构造来创建自己的自定义类型。 .NET 类库本身是一组自定义类型,以供你在自己的应用程序中使用。 默认情况下,类库中最常用的类型在任何 C# 程序中均可用。 其他类型只有在显式添加对定义这些类型的程序集的项目引用时才可用。 编译器引用程序集之后,你可以声明在源代码的此程序集中声明的类型的变量(和常量)。 有关详细信息。
通用类型系统
对于 .NET 中的类型系统,请务必了解以下两个基本要点:
它支持继承原则。 类型可以派生自其他类型(称为基类型)。 派生类型继承(有一些限制)基类型的方法、属性和其他成员。 基类型可以继而从某种其他类型派生,在这种情况下,派生类型继承其继承层次结构中的两种基类型的成员。 所有类型(包括 System.Int32 (C# keyword: int
) 等内置数值类型)最终都派生自单个基类型,即 System.Object (C# keyword: object)。 这样的统一类型层次结构称为通用类型系统 (CTS)。 若要详细了解 C# 中的继承,请参阅继承。
CTS 中的每种类型被定义为值类型或引用类型。 这些类型包括 .NET 类库中的所有自定义类型以及你自己的用户定义类型。 使用 struct
关键字定义的类型是值类型;所有内置数值类型都是 structs
。 使用 class
或 record
关键字定义的类型是引用类型。 引用类型和值类型遵循不同的编译时规则和运行时行为。
类和结构是 .NET 通用类型系统的两种基本构造。 C# 9 添加记录,记录是一种类。 每种本质上都是一种数据结构,其中封装了同属一个逻辑单元的一组数据和行为。 数据和行为是类、结构或记录的成员。 这些行为包括方法、属性和事件等。
(1)类是引用类型。 创建类型的对象后,向其分配对象的变量仅保留对相应内存的引用。 将对象引用分配给新变量后,新变量会引用原始对象。 通过一个变量所做的更改将反映在另一个变量中,因为它们引用相同的数据。
(2)结构是值类型。 创建结构时,向其分配结构的变量保留结构的实际数据。 将结构分配给新变量时,会复制结构。 因此,新变量和原始变量包含相同数据的副本(共两个)。 对一个副本所做的更改不会影响另一个副本。
(3)记录类型可以是引用类型 (record class
) 或值类型 (record struct
)。
数据类型:值类型、引用类型、指针类型
1.值类型分为:struct
和enum
内置的数值类型是结构,值类型变量直接包含其值,可以直接分配给一个值,eg. int 、char、float、long等,如下所示
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
bool | 布尔值 | True 或 False | False |
byte | 8 位无符号整数 | 0 到 255 | 0 |
char | 16 位 Unicode 字符 | U +0000 到 U +ffff | '\0' |
decimal | 128 位精确的十进制值,28-29 有效位数 | (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 | 0.0M |
double | 64 位双精度浮点型 | (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 | 0.0D |
float | 32 位单精度浮点型 | -3.4 x 1038 到 + 3.4 x 1038 | 0.0F |
int | 32 位有符号整数类型 | -2,147,483,648 到 2,147,483,647 | 0 |
long | 64 位有符号整数类型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L |
sbyte | 8 位有符号整数类型 | -128 到 127 | 0 |
short | 16 位有符号整数类型 | -32,768 到 32,767 | 0 |
uint | 32 位无符号整数类型 | 0 到 4,294,967,295 | 0 |
ulong | 64 位无符号整数类型 | 0 到 18,446,744,073,709,551,615 | 0 |
ushort | 16 位无符号整数类型 | 0 到 65,535 | 0 |
using System;
namespace DataTypeApplication
{
class Program
{
static void Main(string[] args)
{
//获取类型长度sizeof(type)
Console.WriteLine("Size of int: {0}", sizeof(int));
Console.ReadLine();
}
}
}
//输出Size of int:4
//结构类型struct
public struct Coords
{
public int x, y;
public Coords(int p1, int p2)
{
x = p1;
y = p2;
}
}
//enum枚举类型
public enum FileMode
{
CreateNew = 1,
Create = 2,
Open = 3,
OpenOrCreate = 4,
Truncate = 5,
Append = 6,
}
2.引用类型定义为 class
、record
、delegate、数组或 interface 的类型。
指没有直接指向具体的数据,而是指向数据变量的内存地址,object、dynamic 和 string。
object是所有类型的基类,他可以被分配任何类型(值类型、引用类型、自定义类型)分配前需要进行转换;
值类型转换为引用类型为装箱;引用类型装换为值类型为拆箱;
dynamic :动态类型可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。
String:字符串类型,通过两种形式进行分配:引号和 @引号;C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待。
用户自定义引用类型有:class、interface 或 delegate
数组:数组定义静态初始化,动态初始化
//引用类型创建
MyClass myClass = new MyClass();
MyClass myClass2 = myClass;
//指定长度,动态初始化分配,数组都是引用类型,系统会根据长度分配初始值
//1.指定数据的长度和类型
string[] name = new string[3];
name[0] = "张三";
name[1] = "李四";
name[2] = "王五";
//2.指定长度,直接赋值
string[] name1 = new string[3]{"张三","李四","王五"};
//静态初始化
//3.不指定长度,直接赋值
string[] type= new string[]{"01","02","03"};
//4.简写赋值
string[] course = {"语文","数学","生物"};
创建对象时,会在托管堆上分配内存。 变量只保留对对象位置的引用。 对于托管堆上的类型,在分配内存和回收内存时都会产生开销
(1).ArrayList数组:
ArrayList是一个可变长的数组类型,可在数组定义后增加数组的长度,有序的集合;存放不同类型的object对象,取值后需要进行数据类型转换。
(2).hashTable数组:
hashTable是一个存储key-value的数组,是无序的集合,可通过key取值
(3).泛型集合:List<type>
限定list的类型,避免了类型不确定的问题
(4).Dictionary<object,object>
3)指针类型:指针类型变量存储另一种类型的内存地址