C# 11新特性之file关键字

打印 上一主题 下一主题

主题 618|帖子 618|积分 1854

C#11 添加了文件作用域类型功能:一个新的 file 修饰符,可以应用于任何类型定义以限制其只能在当前文件中使用。这样,我们可以在一个项目中拥有多个同名的类。

目录

示例

新建一个控制台程序,添加两个类,分别为File1.cs和File2.cs
  1. //File1.cs
  2. namespace ConsoleApp
  3. {
  4.     file static class FileWidget
  5.     {
  6.         public static string Widget() => "File1";
  7.     }
  8.     static class GetFileWidget1
  9.     {
  10.         internal static string GetString()=> FileWidget.Widget();
  11.     }
  12. }
复制代码
  1. //File2.cs
  2. namespace ConsoleApp
  3. {
  4.     file static class FileWidget
  5.     {
  6.         public static string Widget() => "File2";
  7.     }
  8.     static class GetFileWidget2
  9.     {
  10.         internal static string GetString() => FileWidget.Widget();
  11.     }
  12. }
复制代码
两个文件中,定义了相同的FileWidget类。但它们只在自己的文件中有效。
这时,我们调用两个文件对应的方法,可以正常输出!
  1. using ConsoleApp;
  2. Console.WriteLine(GetFileWidget1.GetString());
  3. Console.WriteLine(GetFileWidget2.GetString());
复制代码

file不可以与其他修饰符一起使用

需要注意的是:从C# 11开始,file关键字是类型修饰符,这也意味着它不能与其他修饰符一起使用,比如public、internal、private 等。
file可以修饰的类型

file可以在以下类型中使用。

  • class
  • struct
  • interface
  • enum
  • delegate
  • record
  • record struct
file 不可修饰的类型

file修饰符不适用于嵌套在父类型中的类型。它也不适用于方法属性、事件和字段,但语言设计说明解释说:“为非类型文件范围的成员留出设计空间,以便以后出现。”
例如:
  1. file interface IFileWidget
  2.     {
  3.         file void Widget();
  4.     }
复制代码
这时会有报错:

file 可以有一个或多个同名类

在一个项目中,可以有一个internal级别类,同时可以拥有一个或多个file级别的同名类。 唯一的缺点是文件类不能在公共类中使用。
例如,我们修改一下File1.cs
  1. namespace ConsoleApp
  2. {
  3.     file static partial class FileWidget
  4.     {
  5.         public static string Widget() => "File1";
  6.     }
  7.     file static partial class FileWidget
  8.     {
  9.         public static string GetWidget() => "File";
  10.     }
  11.     static class GetFileWidget1
  12.     {
  13.         internal static string GetString()=> FileWidget.Widget();
  14.         internal static string GetString2()=> FileWidget.GetWidget();
  15.     }
  16. }
复制代码
控制台输出一下:
  1. using ConsoleApp;
  2. Console.WriteLine(GetFileWidget1.GetString());
  3. Console.WriteLine(GetFileWidget1.GetString2());
  4. Console.WriteLine(GetFileWidget2.GetString());
复制代码

没有任何问题!
总结

namespace仍然是避免类型名称冲突的首选方法。
欢迎大家关注我的微信公众号,一起进步,一起成长
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表