C# 10 新特性 —— 命名空间的变化

C# 10 新特性 —— 命名空间的变化

Intro

C# 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

新的项目模板中模板文件会有一个 <ImplictUsings>enable</ImplictUsings>,这一属性就是配置隐式命名空间功能,默认是禁用的,需要显式配置开启,对于多个项目的大项目,可以结合我们之前介绍的 Directory.Build.props 来进行项目全局配置 使用 Directory.Build 来消除项目文件中的重复配置

默认引用的命名空间和项目引用的 Sdk 有关,默认的 Microsoft.NET.Sdk 引用了下面这些命名空间

  • System

  • System.Collections.Generic

  • System.IO

  • System.Linq

  • System.Net.Http

  • System.Threading

  • System.Threading.Tasks

Microsoft.NET.Sdk.Web 在上面的基础上添加 ASP.NET Core 的一些常用的命名空间引用

  • System.Net.Http.Json

  • Microsoft.AspNetCore.Builder

  • Microsoft.AspNetCore.Hosting

  • Microsoft.AspNetCore.Http

  • Microsoft.AspNetCore.Routing

  • Microsoft.Extensions.Configuration

  • Microsoft.Extensions.DependencyInjection

  • Microsoft.Extensions.Hosting

  • Microsoft.Extensions.Logging

其他项目类型可以参考微软的文档

除此之外,我们可以手动的在项目文件中配置自己想要添加的命名空间引用或者移除默认的命名空间引用

命名空间也可以使用变量,如下面的 $(RootNamespace) 表示项目默认的命名空间,使用隐式命名空间引用写过好多个小示例了,觉得如果项目命名空间包含在默认的命名空间引用里的话可能会更方便,所以提了一个 issue,不过暂时还没回复,不确定是否会考虑,感兴趣的可以参考 https://github.com/dotnet/sdk/issues/22535,这里我就自己配置一下,通过项目文件也可以配置 using staticusing alias,示例如下

<ItemGroup><Using Include="$(RootNamespace)"/><Using Include="WeihanLi.Common.Helpers"/><Using Include="WeihanLi.Common.Helpers.InvokeHelper" Static="true"/><Using Include="WeihanLi.Common.Logging"/><Using Include="System.IO.File" Alias="MyFile"/><Using Remove="System.Net.Http" />
</ItemGroup>

在项目文件中配置的 Using 最终会生成一个 Global Usings 的文件参与到项目的编译,生成的文件位置在 obj/Debug/net6.0 目录下,文件名称是 项目名+ ".GlobalUsings.g.cs",如下图:

197622bd2c8f55a724f777bb18db8e20.png

Global Usings output

File-scoped namespace

除了引用的命名空间,类型的命名空间也发生了变化,针对类型的声明也做了一些优化,原来我们创建一个类型可能是这样的

namespace Test
{public class Class1{}    
}

在 C# 10 中,我们可以使用一行代码来声明 namespace,声明类型所在的命名空间

namespace Test;
public class Class1
{
}

这样就没有那么多的缩进了,代码看起来更加简单一些,而且对于我来说写一些小示例,拷贝起来更方便了,因为一般文章中不会去写代码的所有内容,拷贝了之后再缩进有时候可能会出现格式的问题,使用这个特性之后就没有那么多的缩进了,有些情况下就可以直接复制粘贴了

File-scoped namespace 使用起来就是这么简单,但也是有限制的

  • 一个文件中只能声明一个 namespace,如果一个文件中想要有两个命名空间不能使用 file-scoped namespace

  • 不能和之前命名空间用法一起使用

从以往的项目来看,这两个限制还是很少会遇到的,绝大多数场景都是可以用的

More

Global usings 能够让我们的代码看起来更加简洁简单,全局的类型别名也成为可能,常规的使用还可以,但不要滥用,在代码里搞出来很多神奇的代码,可能就会有同事想要骂人了,比如说搞很多 A、B、C 等不明其意的别名,代码里全是看不懂类型的代码。。。

还有一个小细节,Global usings 和 Implicit usings 可以结合使用,上面提到的输出一个 GlobalUsings 的只包含项目文件中定义的 global usings,自己写在代码里的不会输出,和自己在代码里的 global usings 可以结合使用

对于 File-scoped namespace,推荐一个小技巧,如果你的项目使用了 Editorconfig(如果没有强烈推荐一下),可以在 editorconfig 中使用 csharp_style_namespace_declarations=file_scoped:suggestion 来配置命名空间的样式使用 file-scoped namespace,这样在 VS 中新建类时就会自动使用 file-scoped namespace 这样的写法,可以参考这个项目 https://github.com/WeihanLi/SparkTodo

References

  • https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/globalusingdirective?WT.mc_id=DT-MVP-5004222

  • https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/file-scoped-namespaces?WT.mc_id=DT-MVP-5004222

  • https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/lambda-improvements?WT.mc_id=DT-MVP-5004222

  • https://docs.microsoft.com/en-us/dotnet/core/compatibility/sdk/6.0/implicit-namespaces-rc1?WT.mc_id=DT-MVP-5004222

  • https://github.com/WeihanLi/SparkTodo

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp10Sample/CSharp10Sample.csproj

  • .NET 6 中的隐式命名空间引用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDOJ 1228 A+B(map水题)

A B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8539 Accepted Submission(s): 4810 Problem Description读入两个小于100的正整数A和B,计算AB.需要注意的是:A和B的每一位数字由对应的英文单词给出.Input测…

工厂模式(简单工厂、工厂方法、抽象工厂)

简单工厂模式 从设计模式的类型上来说&#xff0c;简单工厂模式是属于创建型模式&#xff0c;又叫做静态工厂方法&#xff08;StaticFactory Method&#xff09;模式&#xff0c;但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单…

设置 Xcode 自动生成代码片段

一、什么是代码片段当在Xcode中输入dowhile并回车后&#xff0c;Xcode会出现下图所示的提示代码&#xff1a;这就是代码片段&#xff0c;目的是使程序员以最快的速度输入常用的代码片段&#xff0c;提高编程效率。该功能是从Xcode4开始引入的。在Xcode中的位置如下图所示&#…

C# 10 新特性 —— CallerArgumentExpression

C# 10 新特性 —— CallerArgumentExpressionIntroC# 10 支持使用 CallerArgumentExpression 来自动地获取调用方的信息&#xff0c;这可以简化我们现在的一些代码&#xff0c;让代码更加简洁&#xff0c;一起看下面的示例吧Caller InfoC# 在 5.0 的时候开始支持 Caller Info 自…

一款不错的编程字体Source Code Pro

我以前一直是用的MS自家的是Consolas的字体&#xff0c;这个字体基本上具有编程字体所需的所有要素&#xff1a;等宽、支持ClearType、中文字体大小合适&#xff0c;l和1&#xff0c;o和0很容易区分。非要挑刺的话就是字体比较小&#xff0c;9号和10号字区别不大&#xff0c;长…

当代年轻人熬夜晚睡的原因找到了!

全世界只有3.14 % 的人关注了爆炸吧知识有人熬夜为了离梦想更近有人熬夜为了给自家爱豆做数据有人熬夜只是因为深夜才有点自己的时间还有人是因为“沉迷”这些优质视频号忘记要睡在过去一段时间里&#xff0c;视频号可能是微信迭代最多&#xff0c;变化最多&#xff0c;也受到最…

怎么安装SharePoint2013 preview 在SQL2012 和 Windows Server 2008 R2 SP1

微软上周发布了其支柱产品Office2013 和SharePoint2013 preview. 对于以SharePoint 吃饭的人当然是很兴奋。今天我在这里演示一下怎么安装SharePoint2013 preview 在SQL2012 和 Windows Server 2008 R2 SP1 。 1.需要在你的Active Directory&#xff08;AD)里建一个用户 ,我把它…

Mac 登陆 去掉 其他用户

2019独角兽企业重金招聘Python工程师标准>>> 打开 终端 sudo defaults write /Library/Preferences/com.apple.loginwindow SHOWOTHERUSERS_MANAGED -bool FALSE 转载于:https://my.oschina.net/liuchuanfeng/blog/617387

使用 Windbg 分析一个 异步操作 引发的 Crash 异常

上周我们收到了一个客户的紧急求助&#xff0c;他们的一个 iis应用程序池 经历了频繁重启&#xff0c;即使从错误日志中也不得到任何有用的信息&#xff0c;异常信息如下&#xff1a;System.NullReferenceException : Object reference not set to an instance of an object. S…

wxGlade的图标,原来是来自蒙德里安的名画!

一直用wxGlade做GUI的&#xff0c;今天突然发现它的图标和一副油画很像。 wxGlade的图标&#xff0c;图标的文件名竟然就叫做mondrian.ico 蒙德里安创造了很多这种纯粹的基本要素的作品&#xff0c;下面是其中之一&#xff0c;《构图》&#xff08;Composition 1929 - Piet Mon…

SAP HANA解读-2012 SAP商业同略会分享

7月26日和27日&#xff0c;我受邀参加了SAP在国家会议中心举办的“蕴韬略促转变共发展”为主题的中国商业同略会&#xff0c;下面就参会的一些感想和大家分享一下。 SAP中国商业同略会是第二次在北京举办&#xff0c;此次大会汇聚国内外知名商业领袖、企业高层、行业权威、专家…

java日期加减秒_Java日期——年、月、日、时、分、秒、周加减计算

Java日期——年、月、日、时、分、秒、周加减计算Java日期——年、月、日、时、分、秒、周加减计算1.Pom依赖joda-timejoda-time2.9.92.示例代码package com.example.demo.controller;import org.joda.time.DateTime;import java.text.SimpleDateFormat;import java.util.Date;…

不可思议!这篇全篇脏话的文章竟然发表了

全世界只有3.14 % 的人关注了爆炸吧知识一教授为了抗议三流科学杂志发送垃圾邮件&#xff0c;回复了一篇全文只重复七个脏话字眼的论文&#xff0c;竟被出版&#xff01;这是十几年前&#xff0c;麻省理工大学的一个教授埃迪科勒&#xff0c;发表的一篇名为 Get me off Your Fu…

设置圆角、定向设置圆角-按钮等控件

为什么80%的码农都做不了架构师&#xff1f;>>> //定向设置圆角UIBezierPath *maskPath [UIBezierPath bezierPathWithRoundedRect:whiteView.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)];CASha…

C# 10 新特性 —— Lambda 优化

C# 10 新特性 —— Lambda 优化IntroC# 10 对于 Lambda 做了很多的优化&#xff0c;我们可以在 C# 中更加方便地使用委托和 Lambda 了&#xff0c;下面就来看一些示例Lambda EnhancementsNatural types for lambdasC# 10 可以更好做类型推断&#xff0c;很多时候编译器可以自动…

40个最好的Tumblr主题

如果安装了一款较好的Tumblr主题&#xff0c;你的Tumblr空间将焕然一新。然而找到一款合适的主题并不是一件容易的事&#xff0c;这正是本文中我整理那么多优质的Tumblr模板作为灵感的原因。其中有一些免费的Tumblr主题&#xff0c;另外的一些付费的Tumblr主题也确实很棒&#…

现代女性都有哪些烦恼?

1 医生&#xff0c;咱可以先拔下来么&#xff01;▼2 靓仔&#xff0c;我笑得停不下来&#xff01;&#xff08;via.豆瓣哈组&#xff09;▼3 边做饭边把锅给洗了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 令人无路可退的辞职方式&#xff01;&#xff1f;&…

c++11新特性(4) lambda捕捉块

lambda表达式中的方括号成为捕捉块,能够在这里指定怎样从所在的作用域中捕捉变量. 捕捉的意思是指能够在该lambda中使用该变量.即能够捕获外部变量在lambda表达式内使用. 能够使用两种方式来捕捉所在的作用域中的全部变量. []:通过值捕捉全部变量 [&]:通过引用捕捉全部变量…

别不承认!搞懂那些数理原理,才发现它们和枯燥根本不沾边!

▲ 点击查看数理化的学习对于很多孩子&#xff0c;包括家长都是一个大难题。比如&#xff0c;我们要教孩子认识动物&#xff0c;一般是要给孩子看动物的图片或实体&#xff0c;孩子自然就对这个动物有个认知。要教孩子数字&#xff0c;就会用一件玩具、两个苹果这种和现实有关联…

WPF实现数据拾取器

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织由于在WPF中没有现成的数据拾取器控件&#xff0c;所以我们自己实现一个。PS&#xff1a;有更好的方式欢迎推荐。01—代码如下一、创建 RoundPicker.cs 继承 Control代码如下。RoundPicker.cs实现…