淡若轻风

博客园 首页 新随笔 联系 订阅 管理
  52 随笔 :: 0 文章 :: 0 评论 :: 6460 阅读

C# 7.0 随着 Visual Studio 2017 和 .NET Framework 4.6.2(以及 .NET Core 1.x/2.0)的发布而推出,带来了多项旨在提升代码简洁性、可读性和性能的新特性。

以下是 C# 7.0 的主要新增特性及示例:

 

1️⃣ 元组(Tuples)与解构(Deconstruction)

  • 元组(Tuples)
    C# 7.0 引入了值元组(ValueTuple),使得方法可以返回多个值而不必定义专门的类型。
  • 解构(Deconstruction)
    可以将元组中的元素直接拆解到单独的变量中。

示例:

复制代码
// 返回一个值元组
public (int Sum, int Product) Calculate(int a, int b)
{
    return (a + b, a * b);
}

// 使用元组返回值
var result = Calculate(3, 4);
Console.WriteLine($"Sum: {result.Sum}, Product: {result.Product}");

// 解构元组
(int sum, int product) = Calculate(3, 4);
Console.WriteLine($"Sum: {sum}, Product: {product}");
复制代码

 

2️⃣ 模式匹配(Pattern Matching)

  • is 表达式增强
    可以在 is 运算符中直接声明变量,并对其进行类型判断。

  • switch 语句增强
    支持在 switch 中使用模式匹配和条件表达式,使得根据类型或值分支变得更加灵活。

示例:

复制代码
object obj = 123;
if (obj is int number)
{
    Console.WriteLine($"Number: {number}");
}

object data = "Hello, World!";
switch (data)
{
    case int n:
        Console.WriteLine($"Integer: {n}");
        break;
    case string s when s.Length > 0:
        Console.WriteLine($"Non-empty string: {s}");
        break;
    default:
        Console.WriteLine("Other type");
        break;
}
复制代码

 

3️⃣ 本地函数(Local Functions)

  • 作用:在方法内部定义局部函数,使辅助逻辑只在方法内部可见,从而改善代码组织并减少不必要的成员暴露。

示例:

复制代码
public int Factorial(int n)
{
    if (n < 0) throw new ArgumentException("n must be non-negative");

    // 定义本地函数
    int LocalFactorial(int x) => x <= 1 ? 1 : x * LocalFactorial(x - 1);

    return LocalFactorial(n);
}
复制代码

 

4️⃣ 内联 out 变量声明

  • 作用:允许在方法调用中直接声明 out 参数,减少代码冗余并提升可读性。

示例:

复制代码
// 旧写法:事先声明变量
int result;
if (int.TryParse("123", out result))
{
    Console.WriteLine(result);
}

// 新写法:内联声明
if (int.TryParse("123", out int parsedNumber))
{
    Console.WriteLine(parsedNumber);
}
复制代码

 

5️⃣ Ref 返回和局部变量(Ref Returns and Locals)

  • 作用:允许方法返回变量的引用而不是拷贝值,从而使调用者可以直接修改返回的变量,适用于需要高性能处理大型数据结构的场景。

示例:

复制代码
// 定义返回数组元素引用的方法
public ref int Find(int[] array, Func<int, bool> predicate)
{
    for (int i = 0; i < array.Length; i++)
    {
        if (predicate(array[i]))
            return ref array[i];
    }
    throw new InvalidOperationException("Not found");
}

int[] numbers = { 1, 2, 3, 4 };
ref int foundItem = ref Find(numbers, x => x == 3);
foundItem = 100;  // 修改原数组中的值
Console.WriteLine(string.Join(", ", numbers));  // 输出:1, 2, 100, 4
复制代码

 

6️⃣ Discards(丢弃符号)

  • 作用:使用下划线 _ 作为占位符,忽略不需要的输出或 out 参数,提高代码简洁性。

示例:

复制代码
// 忽略不需要的 out 参数
if (int.TryParse("456", out _))
{
    Console.WriteLine("Parsing succeeded, value is discarded.");
}

// 在元组解构中丢弃部分值
var (x, _) = (10, 20);
Console.WriteLine(x);  // 输出:10
复制代码

 

7️⃣ 数字字面量的新写法

  • 二进制字面量
    支持使用 0b0B 前缀来表示二进制数字。

  • 数字分隔符
    可以在数字中使用下划线 _ 分隔以提高可读性。

示例:

int binaryNumber = 0b1010;   // 二进制表示的数字 10
int largeNumber = 1_000_000; // 更易读的大数字表示

 

总结

C# 7.0 的这些新特性在多方面增强了语言的表达力和代码简洁性:

  • 元组和解构 使得方法可以轻松返回多个值并简化变量拆解。
  • 模式匹配 为条件判断和类型检查提供了更多灵活性。
  • 本地函数 帮助将辅助逻辑限定在局部范围内,提升代码组织结构。
  • 内联 out 变量、ref 返回 以及 Discards 则使代码更加紧凑和直观。
  • 数字字面量的新写法 则改善了数字常量的可读性。

这些改进不仅简化了日常编码任务,还为后续版本(如 C# 8.0、9.0 等)的进一步特性扩展奠定了基础。

如果你在整理 C# 各版本的演进,这部分内容可以作为重点之一,展示 C# 如何逐步增强语言表达力和开发体验。

 

posted on   淡若轻风  阅读(16)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示