网站建设音乐插件怎么弄,陕西城乡建设部网站首页,官方网站开发多少钱,南昌淘宝网站制作公司C# 10 新特性 —— 命名空间的变化IntroC# 10 针对命名空间做了一些改变#xff0c;主要是 Global Usings 和 File-scoped Namespace#xff0c;我们前面分享的示例其实也是用到了这些变化#xff0c;之前也写过一篇文章介绍 .NET 6 的隐式命名空间引用 .NET 6 中的隐式命名… C# 10 新特性 —— 命名空间的变化IntroC# 10 针对命名空间做了一些改变主要是 Global Usings 和 File-scoped Namespace我们前面分享的示例其实也是用到了这些变化之前也写过一篇文章介绍 .NET 6 的隐式命名空间引用 .NET 6 中的隐式命名空间引用下面我们结合示例着重介绍一下 C# 特性吧Global Using有尝试过 .NET 6 的小伙伴应该都知道了新的项目模板非常的简洁Console 项目模板中 Program.cs 只有一行代码没有 Main 方法没有命名空间引用 Console.WriteLine(Hello world)WebApi 项目也同样的没有 Main 方法没有命名空间引用这得益于 C# 的新特性C# 9 的顶级应用程序使得我们可以消除 Main而基于 C# 10 中 Global Usings 的隐式命名空间引用使得我们可以不需要声明部分命名空间Global using 支持 using 的各种形式使用示例global using System;
global using static System.Console; // static using
global using MyFile System.IO.File; // alias我们可以在任意一个文件中进行声明声明之后 这个项目 其他文件里用到这里定义的命名空间就可以不需要使用 using 了新的项目模板中模板文件会有一个 ImplictUsingsenable/ImplictUsings这一属性就是配置隐式命名空间功能默认是禁用的需要显式配置开启对于多个项目的大项目可以结合我们之前介绍的 Directory.Build.props 来进行项目全局配置 使用 Directory.Build 来消除项目文件中的重复配置默认引用的命名空间和项目引用的 Sdk 有关默认的 Microsoft.NET.Sdk 引用了下面这些命名空间SystemSystem.Collections.GenericSystem.IOSystem.LinqSystem.Net.HttpSystem.ThreadingSystem.Threading.TasksMicrosoft.NET.Sdk.Web 在上面的基础上添加 ASP.NET Core 的一些常用的命名空间引用System.Net.Http.JsonMicrosoft.AspNetCore.BuilderMicrosoft.AspNetCore.HostingMicrosoft.AspNetCore.HttpMicrosoft.AspNetCore.RoutingMicrosoft.Extensions.ConfigurationMicrosoft.Extensions.DependencyInjectionMicrosoft.Extensions.HostingMicrosoft.Extensions.Logging其他项目类型可以参考微软的文档除此之外我们可以手动的在项目文件中配置自己想要添加的命名空间引用或者移除默认的命名空间引用命名空间也可以使用变量如下面的 $(RootNamespace) 表示项目默认的命名空间使用隐式命名空间引用写过好多个小示例了觉得如果项目命名空间包含在默认的命名空间引用里的话可能会更方便所以提了一个 issue不过暂时还没回复不确定是否会考虑感兴趣的可以参考 https://github.com/dotnet/sdk/issues/22535这里我就自己配置一下通过项目文件也可以配置 using static 和 using alias示例如下ItemGroupUsing Include$(RootNamespace)/Using IncludeWeihanLi.Common.Helpers/Using IncludeWeihanLi.Common.Helpers.InvokeHelper Statictrue/Using IncludeWeihanLi.Common.Logging/Using IncludeSystem.IO.File AliasMyFile/Using RemoveSystem.Net.Http /
/ItemGroup在项目文件中配置的 Using 最终会生成一个 Global Usings 的文件参与到项目的编译生成的文件位置在 obj/Debug/net6.0 目录下文件名称是 项目名 .GlobalUsings.g.cs如下图Global Usings outputFile-scoped namespace除了引用的命名空间类型的命名空间也发生了变化针对类型的声明也做了一些优化原来我们创建一个类型可能是这样的namespace Test
{public class Class1{}
}在 C# 10 中我们可以使用一行代码来声明 namespace声明类型所在的命名空间namespace Test;
public class Class1
{
}这样就没有那么多的缩进了代码看起来更加简单一些而且对于我来说写一些小示例拷贝起来更方便了因为一般文章中不会去写代码的所有内容拷贝了之后再缩进有时候可能会出现格式的问题使用这个特性之后就没有那么多的缩进了有些情况下就可以直接复制粘贴了File-scoped namespace 使用起来就是这么简单但也是有限制的一个文件中只能声明一个 namespace如果一个文件中想要有两个命名空间不能使用 file-scoped namespace不能和之前命名空间用法一起使用从以往的项目来看这两个限制还是很少会遇到的绝大多数场景都是可以用的MoreGlobal usings 能够让我们的代码看起来更加简洁简单全局的类型别名也成为可能常规的使用还可以但不要滥用在代码里搞出来很多神奇的代码可能就会有同事想要骂人了比如说搞很多 A、B、C 等不明其意的别名代码里全是看不懂类型的代码。。。还有一个小细节Global usings 和 Implicit usings 可以结合使用上面提到的输出一个 GlobalUsings 的只包含项目文件中定义的 global usings自己写在代码里的不会输出和自己在代码里的 global usings 可以结合使用对于 File-scoped namespace推荐一个小技巧如果你的项目使用了 Editorconfig如果没有强烈推荐一下可以在 editorconfig 中使用 csharp_style_namespace_declarationsfile_scoped:suggestion 来配置命名空间的样式使用 file-scoped namespace这样在 VS 中新建类时就会自动使用 file-scoped namespace 这样的写法可以参考这个项目 https://github.com/WeihanLi/SparkTodoReferenceshttps://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/globalusingdirective?WT.mc_idDT-MVP-5004222https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/file-scoped-namespaces?WT.mc_idDT-MVP-5004222https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/lambda-improvements?WT.mc_idDT-MVP-5004222https://docs.microsoft.com/en-us/dotnet/core/compatibility/sdk/6.0/implicit-namespaces-rc1?WT.mc_idDT-MVP-5004222https://github.com/WeihanLi/SparkTodohttps://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp10Sample/CSharp10Sample.csproj.NET 6 中的隐式命名空间引用