C#11新特性之file关键字的用法教程
作者:gmval
C#11 添加了文件作用域类型功能:一个新的 file 修饰符,可以应用于任何类型定义以限制其只能在当前文件中使用。这样,我们可以在一个项目中拥有多个同名的类。
示例
新建一个控制台程序,添加两个类,分别为File1.cs和File2.cs
//File1.cs namespace ConsoleApp { file static class FileWidget { public static string Widget() => "File1"; } static class GetFileWidget1 { internal static string GetString()=> FileWidget.Widget(); } }
//File2.cs namespace ConsoleApp { file static class FileWidget { public static string Widget() => "File2"; } static class GetFileWidget2 { internal static string GetString() => FileWidget.Widget(); } }
两个文件中,定义了相同的FileWidget类。但它们只在自己的文件中有效。
这时,我们调用两个文件对应的方法,可以正常输出!
using ConsoleApp; Console.WriteLine(GetFileWidget1.GetString()); Console.WriteLine(GetFileWidget2.GetString());
file不可以与其他修饰符一起使用
需要注意的是:从C# 11开始,file
关键字是类型修饰符,这也意味着它不能与其他修饰符一起使用,比如public
、internal
、private
等。
file可以修饰的类型
file
可以在以下类型中使用。
- class
- struct
- interface
- enum
- delegate
- record
- record struct
file 不可修饰的类型
file修饰符不适用于嵌套在父类型中的类型。它也不适用于方法属性、事件和字段,但语言设计说明解释说:“为非类型文件范围的成员留出设计空间,以便以后出现。”
例如:
file interface IFileWidget { file void Widget(); }
这时会有报错:
file 可以有一个或多个同名类
在一个项目中,可以有一个internal级别类,同时可以拥有一个或多个file级别的同名类。 唯一的缺点是文件类不能在公共类中使用。
例如,我们修改一下File1.cs
namespace ConsoleApp { file static partial class FileWidget { public static string Widget() => "File1"; } file static partial class FileWidget { public static string GetWidget() => "File"; } static class GetFileWidget1 { internal static string GetString()=> FileWidget.Widget(); internal static string GetString2()=> FileWidget.GetWidget(); } }
控制台输出一下:
using ConsoleApp;
Console.WriteLine(GetFileWidget1.GetString());
Console.WriteLine(GetFileWidget1.GetString2());
Console.WriteLine(GetFileWidget2.GetString());
没有任何问题!
总结
namespace仍然是避免类型名称冲突的首选方法。
到此这篇关于C#11新特性之file关键字的用法教程的文章就介绍到这了,更多相关C#11 file关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!