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