C#11 file关键字

打印 上一主题 下一主题

主题 922|帖子 922|积分 2766

C#11添加了文件作用域类型功能:一个新的file修饰符,可以应用于任何类型定义以限制其只能在当前文件中使用。
这样,我们可以在一个项目中拥有多个同名的类。通过下面的项目显示,该项目包含两个名为Answer的类。 文件File1.cs中
  1. namespace ConsoleApp11
  2. {
  3.     file static class Answer
  4.     {
  5.         internal static string GetFileScopeScret() => "File1.cs";
  6.     }
  7.     static class InternalClassFromFile1
  8.     {
  9.         internal static string GetString() => Answer.GetFileScopeScret();
  10.     }
  11. }
复制代码
 文件File2.cs中
  1. namespace ConsoleApp11
  2. {
  3.     file static class Answer
  4.     {
  5.         internal static string GetFileScopeScret() => "File2.cs";
  6.     }
  7.     static class InternalClassFromFile2
  8.     {
  9.         internal static string GetString() => Answer.GetFileScopeScret();
  10.     }
  11. }
复制代码
调用这两个方法,可以正常输出
  1.         static void Main(string[] args)
  2.         {
  3.             Console.WriteLine(InternalClassFromFile1.GetString());
  4.             Console.WriteLine(InternalClassFromFile2.GetString());
  5.         }
复制代码
 这里有几点说明:

  • 可以在其源文件之外间接访问带有file修饰符的类型。在上面的程序中,我们依赖这些类,并从 InternalClassFromFile1 与 InternalClassFromFile2中访问。
  • file类也可以接口在其源文件之外间接使用,演示如下
 
修改File.cs中代码
  1. namespace ConsoleApp11
  2. {
  3.     file class Answer : IAnswer
  4.     {
  5.         public string GetFileScopeSecret() => "File1.cs";
  6.     }
  7.     internal interface IAnswer
  8.     {
  9.         string GetFileScopeSecret();
  10.     }
  11.     static class InternalClassFromFile1
  12.     {
  13.         internal static IAnswer GetAnswer() => new Answer();
  14.     }
  15. }
复制代码
调用方法,即可正常输出
  1.         static void Main(string[] args)
  2.         {
  3.             Console.WriteLine(InternalClassFromFile1.GetAnswer().GetFileScopeSecret());
  4.         }
复制代码

  • 任何类型的类型都可以用file修饰符标记:class,  interface ,  record ,  struct,  enum,  delegate.
  • file不能与其他修饰符(如internal or  public)一起使用。
  • 只要所有类型定义属于同一个文件,就可以使用分部类,如下所示:
 
  1. namespace ConsoleApp1 {
  2.    file static partial class Answer {
  3.       internal static string GetFileScopeSecret()
  4.          => "Answer from File1.cs";
  5.    }
  6.    file static partial class Answer {
  7.       internal static string AnotherGetFileScopeSecret()
  8.          => "Another Answer from File1.cs";
  9.    }
  10. }
复制代码

  • 该 file修饰符不适用于嵌套在父类型中的类型。它也不适用于方法属性、事件和字段,但语言设计说明解释说:“为非类型文件范围的成员留出设计空间,以便以后出现。”
  • 在一个项目中,可以有一个internal级别类,同时可以用友一个或多个file级别的同名类。唯一的缺点是文件类不能在公共类中使用。
 让我们强调一下,namespace仍然是避免类型名称冲突的首选方法。 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表