C# switch类型模式

switch的模式中有一种叫类型模式,可以根据switch的类型来执行对应的case,这点在代码中用到的比较频繁,特别是在对应同类型对象的操作中。本例是把一组数据,转成一种格式,就是很简单的使用switch类型模式实现,具体见代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace SwitchDemo;


public class ClassOne
{
    public void Run()
    {
        var entity = new YamlFormatCreater();
        var data = new Data();
        Console.WriteLine(GetData(entity, data));
    }
    public string GetDataFormat(IFormatCreater entity, Data data) => entity switch
    {
        CSVFormatCreater csvFormatCreater => csvFormatCreater.ToCSV(data),
        JsonFormatCreater jsonFormatCreater => jsonFormatCreater.ToJson(data),
        XMLFormatCreater xmlFormatCreater => xmlFormatCreater.ToXML(data),
        YamlFormatCreater yamlFormatCreater => yamlFormatCreater.ToYAML(data),
        _ => "this format is not adapted"
    };
}


public class Data
{
    public int ID { get; set; }
    public string? Name { get; set; }
    public string? Model { get; set; }
}
public interface IFormatCreater
{ }


public class CSVFormatCreater : IFormatCreater
{
    public string ToCSV(Data data)
    {
        return "To CSV";
    }
}
public class JsonFormatCreater : IFormatCreater
{
    public string ToJson(Data data)
    {
        return "To JSON";
    }
}
public class XMLFormatCreater : IFormatCreater
{
    public string ToXML(Data data)
    {
        return "To XML";
    }
}
public class YamlFormatCreater : IFormatCreater
{
    public string ToYAML(Data data)
    {
        return "To YAML";
    }
}

技术群:希望进技术群学习交流的请添加小编微信,切记备注:加群!

小编微信:mm1552923

公众号:dotNet编程大全

<think>好的,我现在需要帮助用户了解C#模式匹配与switch语句的用法及区别。首先,我应该回忆一下C#中传统的switch语句是什么样的,以及模式匹配在较新版本中的引入。根据用户提供的引用,特别是引用[1]提到从C# 7.0开始支持模式匹配,这可能是一个关键点。 传统switch语句主要用于基于离散值的选择,比如数字、枚举或字符串。比如用户示例中的case 1对应星期一,case 2对应星期二。这时候的switch只能处理具体的值,不能处理范围或其他复杂条件。比如用户提到的“速度大于60公里”这种条件,传统的switch是无法直接处理的。 接下来,模式匹配在C# 7.0及更高版本中扩展了switch的功能。这时候,case后面可以不仅仅是常量,还可以是类型模式、条件表达式等。例如,可以检查对象的类型,或者使用when子句添加额外条件。比如,处理不同形状的面积计算,或者根据对象的属性进行分支判断。 用户可能想知道两者的主要区别在哪里。传统switch基于值匹配,而模式匹配允许更复杂的条件,包括类型和属性条件。此外,模式匹配的switch表达式可以返回值,这使得代码更简洁。比如,使用switch表达式直接返回结果,而不是在每个case里写break和赋值。 需要注意语法上的不同。传统switch需要每个case后面有break,而模式匹配的switch表达式使用箭头语法,并且可以更紧凑。另外,模式匹配支持递归模式,可以解构对象并匹配内部属性,这在处理复杂数据结构时非常有用。 用户可能还想知道实际应用中的例子,比如如何处理不同类型的数据或者进行范围判断。例如,使用when关键字来判断数值范围,或者匹配特定类型并提取属性。这些例子能帮助用户理解模式匹配的强大之处。 同时,需要指出模式匹配的适用场景,比如处理多态对象、简化条件逻辑等。而传统switch仍然适用于简单的离散值匹配,特别是当性能考虑较为重要时,因为模式匹配可能引入一些运行时开销。 最后,用户可能希望了解如何选择两者。根据代码的复杂度和需求,模式匹配在需要处理复杂条件时更合适,而传统switch在简单情况下更直观。此外,需要提到版本兼容性,C# 7.0及以上才能使用模式匹配功能。 总结起来,回答应该结构清晰,分点说明两者的用法、差异,并通过示例代码展示不同之处,同时引用提供的资料来支持观点。</think>### C#模式匹配与Switch语句的对比解析 #### 一、传统Switch语句的特性 1. **基于离散值匹配** 只能处理具体值(整数、枚举、字符串等),如: ```csharp switch (dayOfWeek) { case 1: Console.WriteLine("星期一"); break; case 2: Console.WriteLine("星期二"); break; } ``` 无法直接处理范围判断(如$x > 100$)或复杂逻辑[^1]。 2. **语法限制** - 每个`case`必须使用`break`或`return`终止 - `default`分支为兜底处理 - 无法直接返回值,需通过变量赋值实现 #### 二、模式匹配的增强特性(C# 7.0+) 1. **支持类型模式** 可直接匹配对象类型并提取属性: ```csharp switch (shape) { case Circle c: Console.WriteLine($"半径={c.Radius}"); break; case Rectangle r when r.Width == r.Height: Console.WriteLine("正方形"); break; } ``` 2. **条件表达式** 使用`when`子句添加附加条件: ```csharp switch (temperature) { case int t when t > 40: Console.WriteLine("高温"); break; case int t when t < 0: Console.WriteLine("低温"); break; } ``` 3. **Switch表达式(C# 8.0+)** 支持表达式形式直接返回值: ```csharp var description = dayOfWeek switch { 1 => "星期一", 2 => "星期二", _ => "无效输入" }; ``` #### 三、核心差异对比表 | 特性 | 传统Switch | 模式匹配Switch | |---------------------|--------------------|-----------------------| | 匹配目标 | 离散值 | 类型/值/条件组合 | | 返回值能力 | 无 | 支持表达式返回值 | | 条件扩展 | 不支持 | `when`子句扩展逻辑 | | 解构能力 | 无 | 支持属性解构 | | 空值处理 | 需手动判断 | 支持`null`直接匹配 | #### 四、典型应用场景 1. **传统Switch适用场景** - 菜单选项处理 - 状态机简单跳转 ```csharp switch (userChoice) { case "A": ProcessOptionA(); break; case "B": ProcessOptionB(); break; } ``` 2. **模式匹配适用场景** - 多态数据处理(如不同图形类型计算面积) - 复杂条件分支(如物流系统中的运费计算规则) ```csharp double discount = customer switch { { IsVIP: true, Age: >= 60 } => 0.3, // VIP且年龄≥60 { IsVIP: true } => 0.2, { Age: < 18 } => 0.1, _ => 0 }; ``` #### 五、选择建议 - 优先使用模式匹配的场景: - 需要处理类型继承关系 - 存在多层嵌套的`if-else`结构 - 需要解构对象属性 - 保留传统Switch的场景: - 处理简单枚举值 - 兼容旧版本C#编译器(<7.0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值