目录
  • 3、more usage
  • 4、more

前言:

之前写过一篇隐式命名空间引用的大概介绍,在一些小的测试项目中也有在用,一直没作为示例给大家分享,主要原因在于之前看到了一个关于隐式命名空间引用的 github issue 提到会有一些破坏性的变更,现在 .net 6 rc 1 版本已经发布,rc 版本的发布也就意味着新功能的开发已经基本结束,正式版发布之前会专注于各种测试和 bug 修复。

1、历史变化

.net 6 preview 7 时微软已经开始引入隐式命名空间引用的功能,可以参考之前的文章 .net 6 即将到来的新特性  隐式命名空间引用

preview 7 的时候这个功能默认是启用的,如果需要禁用需要配置 disableimplicitnamespaceimports 来禁用,而在 .net 6 rc 1 版本中默认是禁用的,需要显式的通过 implicitusings 来启用,微软的 asp.net core rc 1 的博客文章中有所提及,但是很简略,一带而过了。

在 preview 7 中如果想要使用新加一个 namespace 引用,可以在项目文件中配置 <import inclde="microsoft.extensions.logging"/> 来增加一个全局的命名空间,在 rc1 中将变成 <using include=”microsoft.extensions.logging”/>

类似地,如果要移除某一个命名空间的引用,之前是 <import remove="microsoft.extensions.logging"/> 而现在是 <using remove="microsoft.extensions.logging"/>

2、新版本介绍

使用 .net 6 rc 1 sdk 创建应用之后,项目文件是这样的

<project sdk="microsoft.net.sdk">

  <propertygroup>
    <outputtype>exe</outputtype>
    <targetframework>net6.0</targetframework>
    <implicitusings>enable</implicitusings>
    <nullable>enable</nullable>
  </propertygroup>

</project>

相比 .net 6 preview 7 多了一个 implicitusings 的属性,这个就是前面提到的用于启用隐式命名空间引用的配置属性,可以配置为 enable 或者 true 来启用这个特性

3、more usage

来看下面的这个示例:

myfile.exists("");

writeline("hello, world!");

invokehelper.tryinvoke(() => writeline("implicitusingsample"));

项目文件中自定义的命名空间引用

<itemgroup>
    <using include="system.console" static="true" /> <!-- global using static -->
    <using include="weihanli.common.helpers" /> <!-- global using -->
    <using include="system.io.file" alias="myfile" /> <!-- global using alias -->
    <using remove="system" /> <!-- remove namespace using -->
</itemgroup>

自动生成的 global using 文件内容如下(自动生成文件位置在 obj/debug/$(targetframework)/*.globalusings.g.cs ):

// <auto-generated/>
global using global::system.collections.generic;
global using global::system.io;
global using global::system.linq;
global using global::system.net.http;
global using global::system.threading;
global using global::system.threading.tasks;
global using global::weihanli.common.helpers;
global using myfile = global::system.io.file;
global using static global::system.console;

默认的命名空间引用和所使用的 sdk 有关系,目前确定的如下:

4、more

个人觉得这是一个好的变更,如果默认启用的话,有很多项目在升级的时候可能就会有冲突导致无法正常的编译,而默认禁用,升级的时候就能避免这种 breaking change,升级可以更加平滑,只是对于 preview 7 升级过来的用户来说可能会有些难受,不过因为还是 preview 的功能有一些破坏性的变更也是可以接受的。

有了 global using 之后,之前很多做不到的事情,现在就变得可能,比如使用类型别名

使用起来可能会发现有一些 bug ==,发现 bug 在 github 上提 issue 就好了

如果没有体验过 .net 6 的 preview 版本,非常推荐尝试一下 .net 6 rc 1,新功能已经基本确定了,进行更多的测试来努力让 .net 6 成为一个高质量的 release

到此这篇关于.net 6 中的隐式命名空间引用的文章就介绍到这了,更多相关.net 6 中的隐式命名空间引用内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!