C# 11新特性之file關鍵字

2022-12-13 21:00:31

C#11 新增了檔案作用域型別功能:一個新的 file 修飾符,可以應用於任何型別定義以限制其只能在當前檔案中使用。這樣,我們可以在一個專案中擁有多個同名的類。

範例

新建一個控制檯程式,新增兩個類,分別為File1.cs和File2.cs

//File1.cs
namespace ConsoleApp
{
    file static class FileWidget
    {
        public static string Widget() => "File1";
    }
    static class GetFileWidget1
    {
        internal static string GetString()=> FileWidget.Widget();
    }
}
//File2.cs
namespace ConsoleApp
{
    file static class FileWidget
    {
        public static string Widget() => "File2";
    }
    static class GetFileWidget2
    {
        internal static string GetString() => FileWidget.Widget();
    }
}

兩個檔案中,定義了相同的FileWidget類。但它們只在自己的檔案中有效。
這時,我們呼叫兩個檔案對應的方法,可以正常輸出!

using ConsoleApp;

Console.WriteLine(GetFileWidget1.GetString());
Console.WriteLine(GetFileWidget2.GetString());

file不可以與其他修飾符一起使用

需要注意的是:從C# 11開始,file關鍵字是型別修飾符,這也意味著它不能與其他修飾符一起使用,比如publicinternalprivate 等。

file可以修飾的型別

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

  • class
  • struct
  • interface
  • enum
  • delegate
  • record
  • record struct

file 不可修飾的型別

file修飾符不適用於巢狀在父類別型中的型別。它也不適用於方法屬性、事件和欄位,但語言設計說明解釋說:「為非型別檔案範圍的成員留出設計空間,以便以後出現。」

例如:

file interface IFileWidget
    {
        file void Widget();
    }

這時會有報錯:

file 可以有一個或多個同名類

在一個專案中,可以有一個internal級別類,同時可以擁有一個或多個file級別的同名類。 唯一的缺點是檔案類不能在公共類中使用。

例如,我們修改一下File1.cs

namespace ConsoleApp
{
    file static partial class FileWidget
    {
        public static string Widget() => "File1";
    }
    file static partial class FileWidget
    {
        public static string GetWidget() => "File";
    }
    static class GetFileWidget1
    {
        internal static string GetString()=> FileWidget.Widget();
        internal static string GetString2()=> FileWidget.GetWidget();
    }
}

控制檯輸出一下:

using ConsoleApp;

Console.WriteLine(GetFileWidget1.GetString());
Console.WriteLine(GetFileWidget1.GetString2());
Console.WriteLine(GetFileWidget2.GetString());

沒有任何問題!

總結

namespace仍然是避免型別名稱衝突的首選方法。


歡迎大家關注我的微信公眾號,一起進步,一起成長