C# 10个常用特性汇总

yizhihongxing

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日

相关文章

  • win10下ASP.NET Core部署环境搭建步骤

    win10下ASP.NET Core部署环境搭建步骤 ASP.NET Core是一个跨平台的开源Web框架,可以在Windows、Linux和macOS等操作系统上运行。在本攻略中,我们将介绍如何在Windows 10操作系统上搭建ASP.NET Core部署环境,并提供两个示例说明。 1. 安装.NET Core SDK 在Windows 10操作系统上搭…

    C# 2023年5月16日
    00
  • C#生成EMF矢量图形文件示例详解

    下面我会详细讲解一下“C#生成EMF矢量图形文件示例详解”的完整攻略。 EMF矢量图形文件 EMF是”Enhanced Metafile”的缩写,它是一种Windows图形文件格式,可以存储矢量图形信息。EMF文件可以使用Windows内置的画图工具或其他第三方软件打开和编辑,其中包含的矢量图形信息可以在不失真地进行无限放大或缩小。 C#生成EMF矢量图形文…

    C# 2023年5月14日
    00
  • C#实现文件与字符串互转的方法详解

    C#实现文件与字符串互转的方法详解 简介 在实际开发中,我们经常需要将文件内容读取到字符串中,或者将字符串写入文件中,本文将详细介绍C#中实现文件和字符串互转的方法。 将文件内容读入字符串 我们可以使用File类的ReadAllText方法将文件中的内容读取为字符串。 string filePath = "example.txt"; st…

    C# 2023年5月31日
    00
  • ASP.NET Core MVC 从入门到精通之布局

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年4月22日
    00
  • SimpleAdmin手摸手教学之:插件管理

    一、前言 在2.0的架构设计中,引入了插件的概念,目的就是为了解决代码臃肿问题,随着系统功能越来越多,System层的代码也越来越多,之前是以文件夹的方式区分功能模块,这样的话代码就过于集中,想找到某一个功能模块的代码就要翻好几个文件夹,不利于以后的开发和维护。所以在新的架构中,我将部分功能模块通过插件的方式提取出来,封装成类库形式的插件,这样System层…

    C# 2023年4月18日
    00
  • 干货来袭! C# 7.0 新特性(VS2017可用)

    干货来袭!C#7.0新特性(VS2017可用)的完整攻略 介绍 C# 7.0 是微软于2017年推出的一项新技术,它具有以下一些新特性: Tuples(元组) Deconstruction(解构) Out Var(输出变量) Local function(本地函数) Ref return and Ref locals(引用返回和引用本地变量) Pattern…

    C# 2023年5月15日
    00
  • C#异步的世界(下)

    当异步操作越来越普及,开发者在C#异步编程中应该如何实现呢?本文将继续讲解C#异步的世界(下),从Task和async/await的用法及实现机制,以及TPL的使用等方面进行详细介绍,帮助读者更好地掌握异步编程。 Task和async/await Task的定义和用法 Task是.NET Framework 4.0中新增的一种类型,用于表示尚未完成的操作。通…

    C# 2023年5月14日
    00
  • 详解ASP.NET Core中配置监听URLs的五种方式

    详解ASP.NET Core中配置监听URLs的五种方式 在ASP.NET Core应用程序中,可以通过配置监听URLs来指定应用程序监听的URL地址。本攻略将详细介绍ASP.NET Core中配置监听URLs的五种方式。 方式一:通过appsettings.json文件配置 可以通过在appsettings.json文件中添加以下代码来配置监听URLs: …

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