簡體   English   中英

什么是 C# 中的內部密封類?

[英]What is an internal sealed class in C#?

我正在瀏覽一些 C# 代碼,用於在 VS2010 中擴展語言支持(好的例子)。 我看到了一些叫做internal sealed class

這些有什么作用? 一個人會使用它們嗎?

這是一個類:

  • internal :只能從它定義的程序集(或朋友程序集) internal訪問。
  • sealed :不能繼承。

將類標記為internal類是一種防止程序集的外部用戶使用它們的方法。 這確實是一種設計封裝形式,恕我直言,將不屬於預期公共 API\\object 模型的類型標記為internal是一種很好的做法。 從長遠來看,這可以防止您的庫的用戶將自己耦合到您不希望他們使用的類型。 這種意外的耦合會損害您更改和改進庫實現方式的能力,因為您無法在不破壞客戶的情況下更改它們。 使用internal有助於將圖書館的公共和可用表面積保持在預期范圍內。

將類標記為sealed可防止這些類被繼承。 這是一個非常激烈的設計意圖,如果一個類已經非常專業,以至於不應該通過繼承直接或通過覆蓋其行為向它添加其他功能是明智的,那么有時這很有用。

internalsealed修改類型以完全不同的方式,但它們可以一起使用。

注意您可以對internal進行一些進一步的范圍控制,因為您可以將一組其他程序集定義為“朋友”。 這些友元程序集可以訪問您的internal類型。 這對於定義協作組件集(例如生產和測試組件)非常有用。 通常希望測試程序集可以看到它正在測試的程序集中的所有類型。

  • internal:只能在同一個程序集中訪問的類。

    程序集1.dll:

     namespace test { internal class InternalClass { } public class PublicClass { } }

    程序集2.dll:

     using test; ... InternalClass c1; // Error PublicClass c2; // OK
  • 密封:不能派生自的類

    sealed class SealedClass { ... } class ChildClass : SealedClass {} //ERROR

內部意味着該成員可被同一程序集中定義的其他類型訪問。 Sealed 類是抽象的對立面。 它可以被實例化,但不能作為基類。 密封類的主要原因是為了防止您的用戶擺弄它並破壞它。 密封類也允許某些非密封類無法實現的編譯器優化。

internal sealed類是這樣的:

internal - 只能從同一程序集中訪問
sealed - 不能被子類化

換句話說,您無法直接使用它。

內部意味着它只能在同一個程序集中使用,

internal 關鍵字是類型和類型成員的訪問修飾符。 內部類型或成員只能在同一程序集中的文件中訪問

無法繼承的密封

密封類不能被繼承。 使用密封類作為基類是錯誤的。 在類聲明中使用sealed 修飾符來防止類的繼承。

內部

內部類型或成員只能在同一程序集中的文件中訪問。

示例

// Assembly1.cs  
// Compile with: /target:library  
internal class BaseClass   
{  
   public static int intM = 0;  
} 
// Assembly1_a.cs  
// Compile with: /reference:Assembly1.dll  
class TestAccess   
{  
   static void Main()   
   {  
      var myBase = new BaseClass();   // compile error 
   }  
} 

密封

首先,讓我們從定義開始; Sealed 是一個修飾符,如果應用於類,則使其不可繼承,如果應用於虛擬方法或屬性,則使其不可超越

public sealed class A { ... }
public class B 
{
    ...
    public sealed string Property { get; set; }
    public sealed void Method() { ... }
}

其用法的一個示例是特殊的類/方法或屬性,其中潛在的更改可以使它們按預期停止工作(例如,System.Drawing 命名空間的 Pens 類)。

...
namespace System.Drawing
{
    //
    // Summary:
    //     Pens for all the standard colors. This class cannot be inherited.
    public sealed class Pens
    {
        public static Pen Transparent { get; }
        public static Pen Orchid { get; }
        public static Pen OrangeRed { get; }
        ...
    }
}

因為密封類不能被繼承,它不能用作基類,因此抽象類不能使用密封修飾符 同樣重要的是要提到結構是隱式密封的

示例

public class BaseClass {
    public virtual string ShowMessage()
    {
        return "Hello world";
    }
    public virtual int MathematicalOperation(int x, int y)
    {
        return x + y;
    }
}
public class DerivedClass : BaseClass {
    public override int MathematicalOperation(int x, int y) 
    {
        // since BaseClass has a method marked as virtual, DerivedClass can override it's behavior
        return x - y;
    }
    public override sealed string ShowMessage()
    {
        // since BaseClass has a method marked as virtual, DerivedClass can override it's behavior but because it's sealed prevent classes that derive from it to override the method
        return "Hello world sealed";
    }
}
public class DerivedDerivedClass : DerivedClass
{
    public override int MathematicalOperation(int x, int y)
    {
        // since BaseClass has a method marked as virtual, DerivedClass can override it's behavior
        return x * y;
    }
    public override  string ShowMessage() { ... } // compile error
}
public sealed class SealedClass: BaseClass {
    public override int MathematicalOperation(int x, int y)
    {
        // since BaseClass has a method marked as virtual, DerivedClass can override it's behavior
        return x * y;
    }
    public override string ShowMessage()
    {
        // since BaseClass has a method marked as virtual, DerivedClass can override it's behavior but because it's sealed prevent classes that derive from it to override the method
        return "Hello world";
    }
}
public class DerivedSealedClass : SealedClass
{
    // compile error
}

微軟文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM