首页 > 编程语言 >C#知识点2

C#知识点2

时间:2024-06-23 20:09:55浏览次数:3  
标签:知识点 C# 装箱 int 引用 类型 异常

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 定义了一组公共类型,例如 intstringbool 等,这些类型必须由所有 .NET 语言支持。
  • 定义了公共基类库: CLS 定义了一组公共基类库,例如 SystemSystem.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# 的异常处理机制由以下四个关键字组成:

  • trytry 块标识了一个将被激活的特定的异常的代码块。
  • catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
  • finallyfinally 块用于执行给定的语句,不管异常是否被抛出都会执行。
  • 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

相关文章

  • AtCoder Beginner Contest 359
    AtCoderBeginnerContest359(3/6)A-CountTakahashiProblemStatementYouaregivenNNNstrings.Thei......
  • [MdOI R5] Many Minimizations & [ARC164F] Many Increasing Problems 题解
    讲下一个思路比较自然的基于自然数幂和的\(O(n\logn)\)且复杂度与\(m\)几乎无关的做法。不难发现让我们计数的问题是保序回归\(L_1\)中一条链的情况。这个情况有一个简单的slope-trick做法:用堆维护斜率,每次push进去两个当前的数,然后pop出一个最大值。最终所有数的和......
  • Linux开发讲课12--- /proc 目录
    /proc 目录在Linux系统中是一个虚拟文件系统,它不是存储在硬盘上的常规文件系统,而是由内核在内存中动态生成的。这个目录主要用于提供系统和进程的运行时信息,它有非常多的用途,但大部分人却不懂使用。本文我将详细介绍 /proc 目录的一些主要用途。一.系统信息1.CPU信息......
  • JavaScript与Go后端服务连接方法
    1.概述本文档描述了如何使用JavaScript(在浏览器或Node.js环境中)与使用Go语言编写的后端服务进行通信。我们将通过HTTP请求来实现前后端的数据交互。2.前提条件后端服务已经部署并运行在指定的URL上。JavaScript环境已经配置好,如果是Node.js,需要安装axios或fetch库。3.Go......
  • java使用@Controller注解跳转到thmyleaf页面时候报错
     报错如下######当我使用RestController时候接口可以得到返回的对象↓但是查看RestController和Controller的区别之后:也就是说@RestController返回的是一个对象,@Controller默认情况下,方法的返回值会被解析为一个视图名称,并寻找与该名称匹配的视图进行渲染。这意味着返回......
  • 【C++高阶】高效搜索的秘密:深入解析搜索二叉树
    ......
  • Structured Steaming结构化流详解:大案例解析(第12天)
    系列文章目录一、结构化流介绍(了解)二、结构化流的编程模型(掌握)三、Spark和Kafka整合,流处理,批处理演示(掌握)四、物联网数据分析案例(熟悉)文章目录系列文章目录前言StructuredSteaming一、结构化流介绍(了解)1、有界和无界数据2、基本介绍3、使用三大步骤(掌握)4、回......
  • Centos下安装ffmpeg
    源安装第一种方式:首先需要安装yum源:这个源安装的ffmpeg版本是3.4yuminstallepel-releaseyuminstall-yhttps://mirrors.ustc.edu.cn/rpmfusion/free/el/rpmfusion-free-release-7.noarch.rpm然后可以安装ffmpegyuminstall-yffmpegffmpeg-devel第二种方式:换一个......
  • [MdOI R5] Many Minimizations & [ARC164F] Many Increasing Problems 题解
    讲下一个思路比较自然的基于自然数幂和的\(O(n\logn)\)且复杂度与\(m\)几乎无关的做法。不难发现让我们计数的问题是保序回归\(L_1\)中一条链的情况。这个情况有一个简单的slope-trick做法:用堆维护斜率,每次push进去两个当前的数,然后pop出一个最大值。最终所有数的和......
  • huggingface官网下载并处理ImageNet2012数据集
    文章目录一、下载imagenet2012数据集二、转换imagenet数据集格式ImageNet数据集可以直接从ImageNet官方网站获取数据,但通常需要注册并遵守使用协议。另外,由于数据集较大,往往下载需要花费大量的时间空间,而通过huggingface下载数据集的方法不仅速度相对较快,而且能够直......