概述 為什麼要用到深拷貝呢?比如我們建了某個類Person,並且實例化出一個對象,然後,突然需要把這個對象複製一遍,並且複製出來的對象要跟之前的一模一樣,來看下我們一般會怎麼做。 方法一(利用反射實現) public static T DeepCopy<T>(T obj) { //如果是字元串或值類 ...
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
關鍵字是類型修飾符,這也意味著它不能與其他修飾符一起使用,比如public
、internal
、private
等。
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仍然是避免類型名稱衝突的首選方法。
歡迎大家關註我的微信公眾號,一起進步,一起成長
