在 C# 中,您可以使類密封。那么您就不能將該類用作另一個類的基類。https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/sealed
“中間語言運行時”(不確定如何稱呼它)是否強制執行此操作?
如果沒有,有人可以手動生成從密封類派生的中間語言代碼嗎?
uj5u.com熱心網友回復:
在 C# 中,您可以創建一個類
sealed。那么您就不能將該類用作另一個類的基類。
正確的。
但是,請謹慎使用sealed關鍵字。不要在沒有正當sealed理由的情況下搶先添加到所有型別。
“中間語言運行時”(不確定如何稱呼它)是否強制執行此操作?
它由單獨的組件在多個點強制執行。我現在可以想到 2 個場景:
如果您
class在擴展sealed類的 C# 專案中定義 a (在同一專案中或在參考的程式集中),那么您將收到編譯時錯誤:CS0509 “密封類不能充當基類。” .
如果您
class在 C# 專案中定義了一個在參考程式集中擴展非密封class的專案,然后構建/編譯您的專案,然后將參考的程式集替換為類現在所在的更新程式集,sealed那么您將收到運行時錯誤當 CLR 嘗試加載您的派生類時(因為型別通常是按需加載的:在它們第一次使用時,這也是static呼叫建構式和型別初始值設定項的時間):未處理的例外。
System.TypeLoadException: 無法從程式集“ConsoleApp1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”加載型別“ConsoleApp1.Derived”,因為父型別已密封。在 ConsoleApp1.Program.Main(String[] args)- 在
TypeLoadException此,在其中一種型別的加載點,這是不確定的被拋出。這就是為什么在生產中替換程式集/二進制檔案而不從源頭重建消耗專案以預先捕獲這些問題的原因是一個壞主意。
- 在
示例專案:
ConsoleProject1.csproj Program.cs:
namespace ConsoleApp1
{
public class Derived : ClassLibrary1.SomeClass
{
public Derived()
{
}
}
public static class Program
{
static void Main( string[] args )
{
ClassLibrary1.SomeClass foo = new Derived();
Console.WriteLine( "Hello World!" );
Console.WriteLine( foo.ToString() );
}
}
}
LibraryProject.csproj Class1.cs:
namespace ClassLibrary1
{
public /*sealed*/ class SomeClass // <-- Rebuild this twice, uncommenting the `sealed` keyword for the second build.
{
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389190.html
