C# 10个常用特性汇总

C# 10个常用特性汇总

在本文中,我们将介绍 C# 中的10个常用特性及其用例,包括:

  1. 可空引用类型(Nullable reference types)
  2. 模式匹配(Pattern matching)
  3. 捕获块(Catch block)
  4. 局部函数(Local functions)
  5. 海象运算符(Null coalescing assignment operator)
  6. 设计时验证(Design-time validation)
  7. 命名参数(Named arguments)
  8. 函数式编程模式(Functional programming pattern)
  9. 数字分隔符(Digit separators)
  10. Lambda 表达式多行(Multi-line lambda expressions)

1. 可空引用类型

在 C# 8.0 中,引入了可空引用类型特性,它可以防止出现空引用异常。这样一来,我们就可以通过编译器检测空引用,从而避免空引用异常的发生。

示例代码如下:

// 当没有开启可空引用类型特性时
string name = null;
Console.WriteLine(name.Length); // 会抛出 NullReferenceException 异常

// 当开启了可空引用类型特性时
string? nullableName = null;
Console.WriteLine(nullableName.Length); // 会编译报错,提示 nullableName 可能为 null

2. 模式匹配

模式匹配可以根据类型、结构、枚举等进行筛选,可以让代码更加简洁清晰。在 C# 9.0 中,引入了新的语法,可以使用关键字 andor 来进行多个条件的匹配。

示例代码如下:

object obj = "Hello, World!";

if (obj is string s && s.StartsWith("Hello"))
{
    Console.WriteLine("Hello, World!");
}
else if (obj is string t or int i)
{
    Console.WriteLine(t ?? i);
}

如果 obj 是字符串并且以 “Hello” 开头,那么会输出 “Hello, World!”;如果 obj 是字符串或者整数,则会输出 obj 的值。

3. 捕获块

在 C# 6.0 中引入了捕获块特性,它可以让我们在 try-catch 中捕获到特定的异常类型,并赋值给一个变量,从而可以方便的使用该变量。

示例代码如下:

try
{
    // some error
}
catch (Exception ex) when (ex is ArgumentException || ex is NullReferenceException)
{
    Console.WriteLine($"Caught exception: {ex.GetType().Name}");
}

这样,我们就可以捕获 ArgumentException 和 NullReferenceException 两种异常类型,并将异常赋值给 ex 变量。

4. 局部函数

局部函数是在一个函数内部定义的函数,可以方便地在该函数内部使用。局部函数可以访问其所在函数的变量和参数,但是不能被外部调用。

示例代码如下:

static int Add(int a, int b)
{
    return AddInner();

    int AddInner()
    {
        return a + b;
    }
}

在这个例子中,AddInner 是 Add 函数的一个局部函数,它可以访问 a 和 b 变量。

5. 海象运算符

在 C# 9.0 中,引入了一个新的运算符,又称为空合并赋值运算符 ??=。它可以用于检查变量是否为 null,如果为 null,则赋予一个默认值。

示例代码如下:

string name = null;
name ??= "David";

Console.WriteLine(name); // 输出 David

在这个例子中,当 name 为 null 时,默认值 “David” 被赋予给 name。

6. 设计时验证

在开发过程中,有时会出现一些代码写错,但是编译器不会检测到的问题。在 C# 9.0 中,引入了设计时验证特性,可以在开发环境中对代码进行自动检查。

示例代码如下:

[NotNull]
void Buy([NotNull] string itemName, int quantity)
{
    // ...
}

在这个例子中,使用 NotNull 属性进行设计时验证,可以检查 itemName 和 quantity 变量是否为 null,如果是,编译器就会提示错误。

7. 命名参数

在 C# 中,可以使用命名参数对函数的参数进行命名标识,这样可以方便地传递参数,并且代码更加易读。

示例代码如下:

void SendMessage(string text, string from = "Admin", string to = "User")
{
    Console.WriteLine($"[{from}] -> [{to}]: {text}");
}

SendMessage("Hello"); // 输出 [Admin] -> [User]: Hello
SendMessage("Hi", to: "Someone"); // 输出 [Admin] -> [Someone]: Hi

在这个例子中,强制要求传入 text 参数,但是 from 和 to 参数使用了默认值,当不传入参数时,会自动使用默认值。

8. 函数式编程模式

在 C# 8.0 中,引入了一些函数式编程模式,包括:switch 表达式,范型协变和逆变等。这些特性可以让代码更加简洁易读,并且可以支持更加复杂的逻辑。

示例代码如下:

var result = id switch
{
    int i when i < 0 => "negative",
    int i when i >= 0 => "positive",
    _ => "unknown"
};

在这个例子中,使用 switch 表达式将变量 id 进行分支,根据不同的分支条件返回不同的值。使用 switch 表达式可以避免 switch 语句中的冗长重复。

9. 数字分隔符

数字分隔符是一个辅助数值的分组符号,可以提高代码可读性。在 C# 7.0 中,引入了数字分隔符特性,可以使用下划线来分隔大整数的位数。

示例代码如下:

int amount = 1_000_000;

在这个例子中,使用下划线来分隔千位数,可以让代码更加清晰易读。

10. Lambda 表达式多行

在 C# 7.0 中,Lambda 表达式支持多行定义,可以使代码更加直观。

示例代码如下:

Func<int, int> factorial = x =>
{
    int result = 1;
    for (int i = 1; i <= x; i++)
    {
        result *= i;
    }
    return result;
};

在这个例子中,使用 Lambda 表达式定义了一个阶乘函数,使用多行定义可以方便地写出更加复杂的函数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 10个常用特性汇总 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • asp.net 文章内容分页显示的代码

    为了实现文章内容的分页显示,我们可以使用 ASP.NET 内置的分页控件(Paging Control)或者自己手动实现分页功能。这里我将简单介绍一下自己手动实现分页功能的方法。 步骤一:确定需要分页的数据源 首先,我们需要确定需要分页显示的数据源,比如是从数据库、XML 文件或者其他来源获取的数据。为了演示方便,我们这里以从数组中获取数据为例。 strin…

    C# 2023年5月31日
    00
  • .Net设计模式之单例模式(Singleton)

    .Net设计模式之单例模式(Singleton) 什么是单例模式? 在软件系统中,有些类只需要存在唯一的一个实例对象,比如系统中的窗口管理器、文件系统、计时器等,这些对象在系统中只允许存在一个实例。单例模式就是为了满足这类需求而生的一种设计模式。 单例模式是指在整个应用程序中只能有一个实例对象的类。通常情况下,单例模式是指全局社区共享的一个唯一对象实例,比如…

    C# 2023年5月31日
    00
  • C# 读取ttf字体文件里的Unicode实现

    下面是详细讲解“C# 读取ttf字体文件里的Unicode实现”的完整攻略。 1. 背景知识 在进行C#读取ttf字体文件里的Unicode实现前,需要掌握以下几个背景知识: 什么是ttf字体文件 什么是Unicode编码 C#中的编码相关类 2. 实现方法 2.1 读取ttf字体文件 使用C#读取ttf字体文件可以使用.NET Framework自带的字体…

    C# 2023年5月31日
    00
  • C#中如何利用正则表达式判断字符

    下面是关于 C# 中利用正则表达式判断字符的攻略: 判断单个字符是否匹配正则表达式 在 C# 中,可以利用 Regex.IsMatch() 函数来判断一个字符串是否匹配某个正则表达式。如果需要判断单个字符是否符合正则表达式,需要先将该字符转换为字符串,然后再调用 Regex.IsMatch() 进行判断。示例如下: char c = ‘A’; // 需要判断…

    C# 2023年6月6日
    00
  • 使用C#的aforge类库识别验证码实例

    作为网站作者,我可以为大家讲解一下使用C#的AForge类库识别验证码的完整攻略。 安装AForge类库 首先,我们需要在项目中安装AForge类库,可以通过NuGet进行安装。 打开Visual Studio,在项目面板上右键,点击“管理NuGet程序包”。在搜索框中输入“AForge”,找到“AForge.Imaging”和“AForge.Math”库并…

    C# 2023年6月3日
    00
  • winform实现可拖动的自定义Label控件

    下面是实现winform可拖动自定义Label控件的攻略。 准备工作 新建winform项目,打开Visual Studio。 添加一个类库项目,用于编写自定义控件。 在类库项目中添加Winform命名空间,引用该命名空间中的控件。 编写自定义控件 在类库项目中新建一个类,继承自Label控件。 重写OnMouseDown、OnMouseMove、OnMou…

    C# 2023年6月1日
    00
  • C# Path.GetFileName()方法: 获取指定路径的文件名

    C#中Path.GetFileName()的作用与使用方法 在C#编程中,Path.GetFileName()用于从指定的路径中获取文件名和扩展名。 使用方法 方法的语法如下: public static string GetFileName (string path); 其中,参数path表示需要获取文件名的路径。 实例说明 例1:获取路径中的文件名 以下…

    C# 2023年4月19日
    00
  • .NET CORE中使用AutoMapper进行对象映射的方法

    介绍 AutoMapper 是一款快速、简单、灵活、可自定义的对象映射库,它支持在 .NET Core 中使用。通过使用 AutoMapper,可以从一个对象把数据映射到另一个对象。 在本文中,我们将详细介绍 .NET Core 中使用 AutoMapper 进行对象映射的方法以及包含两个示例说明。 安装 为了安装 AutoMapper,我们需要使用 NuG…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部