C#11 file關鍵字

C#11添加了文件作用域類型功能:一個新的file修飾符,可以應用於任何類型定義以限制其只能在當前文件中使用。

這樣,我們可以在一個項目中擁有多個同名的類。
通過下面的項目顯示,該項目包含兩個名為Answer的類。
 
文件File1.cs中
namespace ConsoleApp11
{
    file static class Answer
    {
        internal static string GetFileScopeScret() => "File1.cs";
    }

    static class InternalClassFromFile1
    {
        internal static string GetString() => Answer.GetFileScopeScret();
    }
}
 
文件File2.cs中
namespace ConsoleApp11
{
    file static class Answer
    {
        internal static string GetFileScopeScret() => "File2.cs";
    }

    static class InternalClassFromFile2
    {
        internal static string GetString() => Answer.GetFileScopeScret();
    }
}
調用這兩個方法,可以正常輸出
        static void Main(string[] args)
        {
            Console.WriteLine(InternalClassFromFile1.GetString());
            Console.WriteLine(InternalClassFromFile2.GetString());
        }
 
這裡有幾點說明:
  • 可以在其源文件之外間接訪問帶有file修飾符的類型。在上面的程式中,我們依賴這些類,並從 InternalClassFromFile1 與 InternalClassFromFile2中訪問。
  • file類也可以介面在其源文件之外間接使用,演示如下

 

修改File.cs中程式碼
namespace ConsoleApp11
{
    file class Answer : IAnswer
    {
        public string GetFileScopeSecret() => "File1.cs";
    }
    internal interface IAnswer
    {
        string GetFileScopeSecret();
    }
    static class InternalClassFromFile1
    {
        internal static IAnswer GetAnswer() => new Answer();
    }
}
調用方法,即可正常輸出
        static void Main(string[] args)
        {
            Console.WriteLine(InternalClassFromFile1.GetAnswer().GetFileScopeSecret());
        }
  • 任何類型的類型都可以用file修飾符標記:class,  interface ,  record ,  struct,  enum,  delegate.
  • file不能與其他修飾符(如internal or  public)一起使用。
  • 只要所有類型定義屬於同一個文件,就可以使用分部類,如下所示:

 

namespace ConsoleApp1 {
   file static partial class Answer {
      internal static string GetFileScopeSecret()
         => "Answer from File1.cs";
   }
   file static partial class Answer {
      internal static string AnotherGetFileScopeSecret()
         => "Another Answer from File1.cs";
   }
}
  • 該 file修飾符不適用於嵌套在父類型中的類型。它也不適用於方法屬性、事件和欄位,但語言設計說明解釋說:「為非類型文件範圍的成員留出設計空間,以便以後出現。」
  • 在一個項目中,可以有一個internal級別類,同時可以用友一個或多個file級別的同名類。唯一的缺點是文件類不能在公共類中使用。
 
讓我們強調一下,namespace仍然是避免類型名稱衝突的首選方法。
 
Tags: