C#11 file關鍵字

2022-11-12 09:01:11

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仍然是避免型別名稱衝突的首選方法。