C#基础知识2
C#中的通用类型系统和类型断定
1. 理解通用类型系统 (CTS) 及公共语言规范 (CLS)
通用类型系统 (CTS)
通用类型系统 (CTS) 是 Microsoft .NET Framework 的核心组成部分,它定义了在 .NET Framework 中如何声明、使用和管理类型。CTS 为所有 .NET 语言提供了统一的类型模型,这使得不同语言编写的代码可以相互协作。
CTS 的主要特点包括:
- 类型安全: CTS 确保类型之间进行安全的操作,并防止无效的类型转换。
- 面向对象: CTS 支持面向对象的编程范式,包括类、对象、继承和多态性。
- 值类型和引用类型: CTS 区分值类型和引用类型。值类型存储在堆栈或寄存器中,并且可以独立于其创建者进行复制和传递。引用类型存储在堆中,并且指向存储在堆中的对象。
- 泛型: CTS 支持泛型类型,这使得代码可以以类型参数化的形式编写,并可以在运行时应用于不同的具体类型。
公共语言规范 (CLS)
公共语言规范 (CLS) 是 .NET 语言之间互操作性的规范。CLS 规定了哪些类型和功能是所有 .NET 语言都必须支持的。这使得不同语言编写的代码可以相互调用并共享数据。
CLS 的主要特点包括:
- 定义了公共类型: CLS 定义了一组公共类型,例如
int
、string
、bool
等,这些类型必须由所有 .NET 语言支持。 - 定义了公共基类库: CLS 定义了一组公共基类库,例如
System
、System.Collections
等,这些库必须由所有 .NET 语言支持。 - 定义了互操作性规则: CLS 定义了不同语言之间互操作的规则,例如如何调用方法、如何传递参数和返回值等。
2. 学会类型的断定
类型断定
类型断定是指确定变量或表达式的类型。在 C# 中,可以使用以下几种方式进行类型断定:
- 显式类型转换: 使用
typeof
运算符可以显式地将一个表达式的类型转换为另一个类型。例如,以下代码将字符串 "123" 转换为整型:
int number = (int)typeof(string).Parse("123");
- 隐式类型转换: C# 支持隐式类型转换,这意味着编译器可以自动将一个表达式的类型转换为另一个类型。例如,以下代码将字符串 "123" 隐式转换为整型:
int number = "123";
- is 运算符:
is
运算符用于判断一个表达式是否属于某个类型。例如,以下代码判断变量number
是否属于整型:
bool isInt = number is int;
- as 运算符:
as
运算符用于将一个表达式转换为指定类型的引用。如果转换成功,则返回该类型的引用;如果转换失败,则返回 null。例如,以下代码将变量number
转换为整型引用:
int? nullableNumber = number as int?;
- GetType() 方法:
GetType()
方法用于获取对象的类型。例如,以下代码获取变量number
所表示的对象的类型:
Type type = number.GetType();
C# 中的命名空间、装箱和拆箱
1. 命名空间
概述
命名空间是 C# 中用于组织代码的一种机制。它可以帮助您避免代码冲突并使代码更易于理解和维护。
在 C# 中,每个类、接口和枚举都属于一个命名空间。默认情况下,所有代码都属于名为 global
的默认命名空间。但是,您通常会使用其他命名空间来组织您的代码。
定义命名空间
要定义命名空间,可以使用 namespace
关键字。例如,以下代码定义了一个名为 MyCompany
的命名空间:
namespace MyCompany
{
// ... 类、接口、枚举等
}
在命名空间中定义的类、接口和枚举可以使用前缀引用。例如,以下代码引用 MyCompany
命名空间中的 Person
类:
MyCompany.Person person = new MyCompany.Person();
使用命名空间别名
如果您经常使用某个命名空间,可以使用命名空间别名来简化代码。例如,以下代码为 MyCompany
命名空间创建了一个别名为 MC
:
using MC = MyCompany;
MC.Person person = new MC.Person();
现在,您可以使用 MC
前缀来引用 MyCompany
命名空间中的类、接口和枚举。
导入其他命名空间
您可以使用 using
关键字导入其他命名空间。例如,以下代码导入 System
命名空间:
using System;
Console.WriteLine("Hello, World!");
导入命名空间后,您无需使用前缀即可引用该命名空间中的类、接口和枚举。
2. 装箱和拆箱
概述
装箱和拆箱是 C# 中用于在值类型和引用类型之间进行转换的操作。
- 装箱 将值类型转换为引用类型。
- 拆箱 将引用类型转换为值类型。
装箱
当您需要将值类型存储在引用类型变量中时,或需要将值类型传递给接受引用类型参数的方法时,就需要进行装箱。
例如,以下代码将值类型 int
装箱为引用类型 object
:
int i = 10;
object obj = i;
在装箱操作中,C# 会创建一个新的引用类型对象并将其分配给 obj
变量。该对象包含值类型 int
的值。
拆箱
当您需要从引用类型变量中获取值类型值时,或需要将引用类型值传递给需要值类型参数的方法时,就需要进行拆箱。
例如,以下代码将引用类型 object
拆箱为值类型 int
:
object obj = 10;
int i = (int)obj;
在拆箱操作中,C# 会从引用类型对象中提取值类型值并将其分配给 i
变量。
显式装箱和隐式装箱
C# 支持显式装箱和隐式装箱。
- 显式装箱 使用
(type)
运算符进行。例如,(int)i
将值类型int
i
显式装箱为引用类型object
。 - 隐式装箱 发生在以下情况下:
- 将值类型赋值给引用类型变量。例如,
object obj = i;
将值类型int
i
隐式装箱为引用类型object
。 - 将值类型传递给接受引用类型参数的方法。例如,
Console.WriteLine(i);
将值类型int
i
隐式装箱为引用类型object
并传递给Console.WriteLine()
方法。
- 将值类型赋值给引用类型变量。例如,
拆箱
拆箱操作总是显式的,使用 (type)
运算符进行。例如,(int)obj
将引用类型 object
obj
拆箱为值类型 int
。
C#中异常
C# 中的异常类
概述
异常是程序执行过程中出现的问题。C# 使用异常处理机制来处理意外情况。异常类是用于表示异常的类,它们继承自 System.Exception
类。
异常处理机制
C# 的异常处理机制由以下四个关键字组成:
try
:try
块标识了一个将被激活的特定的异常的代码块。catch
:程序通过异常处理程序捕获异常。catch
关键字表示异常的捕获。finally
:finally
块用于执行给定的语句,不管异常是否被抛出都会执行。throw
:当问题出现时,程序抛出一个异常。
异常类
异常类通常包含以下属性和方法:
Message
:获取异常消息的属性。InnerException
:获取导致当前异常的内部异常的属性。StackTrace
:获取异常堆栈跟踪的属性。ToString()
:返回异常信息的字符串表示形式的方法。
异常内容的输出
可以使用以下方法输出异常内容:
Console.WriteLine(e.Message)
:输出异常消息。Console.WriteLine(e.StackTrace)
:输出异常堆栈跟踪。Console.WriteLine(e)
:输出异常的字符串表示形式。
自定义异常编写
要自定义异常,需要创建一个类并继承自 System.Exception
类。例如,以下代码定义了一个名为 MyException
的自定义异常类:
class MyException : Exception
{
public MyException(string message) : base(message)
{
}
}
在自定义异常类中,可以添加自定义属性和方法来提供更多信息和功能。例如,以下代码添加了一个 ErrorCode
属性来存储错误代码:
class MyException : Exception
{
public int ErrorCode { get; private set; }
public MyException(string message, int errorCode) : base(message)
{
ErrorCode = errorCode;
}
}
要抛出一个自定义异常,可以使用 throw
关键字。例如,以下代码抛出一个 MyException
异常:
try
{
// ... 代码
}
catch (Exception e)
{
if (e is MyException myException)
{
Console.WriteLine("MyException: {0} (Error Code: {1})", myException.Message, myException.ErrorCode);
}
else
{
Console.WriteLine("Exception: {0}", e.Message);
}
}
标签:知识点,C#,装箱,int,引用,类型,异常
From: https://www.cnblogs.com/AndreaDO/p/18263377