ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 内置引用类型 ## 对象(Object)类型 对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。 当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。 ``` object obj; obj = 100; // 这是装箱 ``` ## 动态(Dynamic)类型 您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。 **声明动态类型的语法:** >[info]dynamic  = value; 例如: ``` dynamic d = 20; ``` >[danger]动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。 ## 字符串(String)类型 字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。 字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。 ``` String str = "w3cschool.cc"; //或者 @"w3cschool.cc"; ``` C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\\)当作普通字符对待,比如: ``` string str = @"C:\\Windows"; //等价于: string str = "C:\\\\Windows"; ``` @ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。 ``` string str = @"<script type=""text/javascript"">     var a=1;     "; ``` 定义相等运算符`==`和`!=`是为了比较`string`对象(而不是引用)的值 ``` string a = "hello"; string b = "h"; // Append to contents of 'b' b += "ello"; Console.WriteLine(a == b);//a和b都是string类型所以返回true Console.WriteLine(object.ReferenceEquals(a, b));//false ``` # **声明自定义引用类型** 用户自定义引用类型有:class、interface 或 delegate,record。 * [class](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/class) * [interface](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/interface) * [delegate](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/reference-types#the-delegate-type) * [record](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/record)