在我向你展示另一个 switch 表达式之前,让我们再简单一点。下面的 if 语句演示了一个逻辑模式,是两个使用 is 的类型模式实例。
if (user is Mycroft m && m.CaresAbout is not object) { Console.WriteLine("Mycroft dissapoints us again."); }这里不知道 user 变量的类型,所以测试它是不是 Mycroft 类型,如果是,则分配给 m。同时判断 Mycroft 对象上的一个属性是否是一个 object 类型。这里是为了演示逻辑模式 not 的使用,其实用 is null 是一样的效果。
另一种 switch 表达式则要宽泛得多。
public static bool IsAccessOkOfficial(Person user, Content content, int season) => (user, content, season) switch { // Tuple + property patterns ({Type: Child}, {Type: ChildsPlay}, _) => true, ({Type: Child}, _, _) => false, (_ , {Type: Public}, _) => true, ({Type: Monarch}, {Type: ForHerEyesOnly}, _) => true, // Tuple + type patterns (OpenCaseFile f, {Type: ChildsPlay}, 4) when f.Name == "Sherlock Holmes" => true, // Property and type patterns {Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}} when type == PoorlyDefined && name.Contains("Sherrinford") && season >= 3 => true, // Tuple and type patterns (OpenCaseFile, var c, 4) when c.Name.Contains("Sherrinford") => true, // Tuple, Type, Property and logical patterns (OpenCaseFile {RiskLevel: >50 and <100 }, {Type: StateSecret}, 3) => true, _ => false, };唯一真正有趣的模式是最后一个模式(在弃元-之前),它测试 Risklevel 是否 >50 且 <100。有很多次我都想用这种形式的逻辑模式语法写一个 if 语句,而不需要重复一个变量名。这个逻辑模式也可以用下面的方式来代替,并且会更接近中演示的语法,它们是等价的。
(OpenCaseFile {RiskLevel: var riskLevel}, {Type: StateSecret}, 3) when riskLevel switch { >50 and <100 => true, _ => false }我远不是一个语言专家,Jared Parsons 和 Andy Gocke 在本文这一部分给了我很多帮助,谢谢!我的关键绊脚石是一个元组的 switch。有时,位置模式很不方便,你只想使用元组的一部分。这就是属性模式的作用,你可以在下面的代码中看到。
{Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}} when type == PoorlyDefined && name.Contains("Sherrinford") && season >= 3 => true,这里面有相当多的问题。关键的一点是,这里测试的是元组属性,而不是按位置匹配元组。这种方法提供了更多的灵活性。你可以在一个给定的 switch 表达式中自由地混合这些方法。希望这能帮助一些人,至少对我有帮助。
如果你对这个应用的功能很好奇,我已经把程序的输出保存在 中。你也可以自己运行这个程序。它需要 .NET 5.0 RC2 才能运行。
ClickOnce多年来,ClickOnce 一直是一个流行的 .NET 部署选项。现在它已支持为 .NET Core 3.1 和 .NET 5.0 Windows 应用程序。当我们在 .NET Core 3.0 中添加了 Windows Forms 和 WPF 支持时,我们就知道很多人会希望使用 ClickOnce 来部署应用程序。在过去的一年里,.NET 和 Visual Studio 团队共同合作,在命令行和 Visual Studio 中启用了 ClickOnce 发布。
我们从项目一开始就有两个目标:
在 Visual Studio 中实现熟悉的 ClickOnce 体验。
使用 MSBuild 或 Mage 工具,通过命令行流程为 ClickOnce 发布启用现代 CI/CD。
用图片向你展示体验是最简单的。
我们先从 Visual Studio 的体验开始,它是以项目发布为中心的。
我们目前支持的主要部署模式是框架依赖型应用。很容易采取依赖 .NET 桌面运行时(就是包含 WPF 和 Windows Forms 的那个)。如果需要的话,你的 ClickOnce 安装程序将在用户机器上安装 .NET 运行时。我们还打算支持独立的和单文件的应用程序。
你可能会想知道,你是否还能利用 ClickOnce 的离线和更新功能。是的,你可以。
包括相同的安装位置和清单签署功能。如果你有严格的签名要求,你会喜欢上这个新的体验。
现在,让我们切换到 Mage 的命令行体验。
Mage 最大的变化是,它现在是一个 .NET 工具,发布在 NuGet 上。这意味着你不需要在你的机器上安装任何特殊的东西。你只需要 .NET 5.0 SDK,然后你就可以把 Mage 作为一个 .NET 工具来安装。你也可以用它来发布 .NET 框架的应用程序,不过,SHA1 签名和部分信任支持已经被移除。
Mage 的安装命令如下:
dotnet tool install -g Microsoft.DotNet.Mage用以下命令配置并发布示例应用程序:
下面一条命令将启动ClickOnce应用程序:
然后出现熟悉的 ClickOnce 安装对话框:
安装应用后,会启动应用:
重新构建并重新发布应用程序后,用户将看到一个更新对话框:
更新后的应用程序将被启动。
注意:Mage .NET 工具的名称将从 mage.net 改为 dotnet-mage,NuGet 包名将保持不变。