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());
需要注意的是:從C# 11開始,file
關鍵字是型別修飾符,這也意味著它不能與其他修飾符一起使用,比如public
、internal
、private
等。
file
可以在以下型別中使用。
file修飾符不適用於巢狀在父類別型中的型別。它也不適用於方法屬性、事件和欄位,但語言設計說明解釋說:「為非型別檔案範圍的成員留出設計空間,以便以後出現。」
例如:
file interface IFileWidget
{
file void Widget();
}
這時會有報錯:
在一個專案中,可以有一個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仍然是避免型別名稱衝突的首選方法。