What is an internal sealed class in C#?

后端 未结 6 443
长情又很酷
长情又很酷 2021-01-31 13:31

I was looking through some C# code for extending language support in VS2010 (Ook example). I saw some classes called internal sealed class

What do these do?

相关标签:
6条回答
  • 2021-01-31 13:53
    • internal: A class which can only be accessed inside the same assembly.

      Assembly1.dll:

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

      Assembly2.dll:

      using test;
      ...
      InternalClass c1; // Error
      PublicClass c2; // OK
      
    • sealed: A class which cannot be derived from

      sealed class SealedClass { ... }
      
      class ChildClass : SealedClass {} //ERROR
      
    0 讨论(0)
  • 2021-01-31 13:55

    An internal sealed class is one that is:

    internal - Only accessible from within the same assembly
    sealed - Cannot be subclassed

    In other words, there's no way for you to use it directly.

    0 讨论(0)
  • 2021-01-31 14:02

    It is a class that:

    • internal: Can only be accessed from within the assembly it is defined (or friend assemblies).
    • sealed: Cannot be inherited.

    Marking classes as internal is a way of preventing outside users of an assembly from using them. It's really a form of design encapsulation and IMHO it is good practice to mark types that are not part of the intended public API\object models as internal. In the long term this prevents users of your library from coupling themselves to types which you did not intend them to. This sort of unintended coupling harms your ability to change and evolve the way your libraries are implemented as you cannot change them without breaking your clients. Using internal helps to keep the public and usable surface area of a library down to what is intended.

    Marking classes as sealed prevents these classes from being inherited. This is a pretty drastic design intent which is sometimes useful if a class is already so specialized that it is sensible that no other functionality should be added to it via inheritance either directly or via overriding its behaviour.

    internal and sealed modify types in quite different ways, but they can be used together.

    NB You have some further scoping control of internal as you can define a set of other assemblies as 'friends'. These friend assemblies may access your internal types. This can be useful for defining sets of co-operating assemblies such as production and test assemblies. It is often desirable that a test assembly can see all the types in the assembly it is testing.

    0 讨论(0)
  • 2021-01-31 14:04

    Internal means the member is accessible to other types that are defined in the same assembly. A Sealed class is sort of the oppositie of abstract. It can be instantiated but cannot serve as a base class. The primary reason to seal a class is to prevent your users from fiddling around with it and breaking it. It’s also the case that sealing a class permits certain compiler optimizations that are not possible with non-sealed classes.

    0 讨论(0)
  • 2021-01-31 14:09

    Internal means it can be used only in same assembly,

    The internal keyword is an access modifier for types and type members. Internal types or members are accessible only within files in the same assembly

    sealed that can't be inherited

    A sealed class cannot be inherited. It is an error to use a sealed class as a base class. Use the sealed modifier in a class declaration to prevent inheritance of the class.

    0 讨论(0)
  • 2021-01-31 14:12

    INTERNAL

    Internal types or members are accessible only within files in the same assembly.

    Example

    // 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

    First of all, let's start with a definition; sealed is a modifier which if applied to a class make it non-inheritable and if applied to virtual methods or properties makes them non-ovveridable.

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

    An example of its usage is specialized class/method or property in which potential alterations can make them stop working as expected (for example, the Pens class of the System.Drawing namespace).

    ...
    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; }
            ...
        }
    }
    

    Because a sealed class cannot be inherited, it cannot be used as base class and by consequence, an abstract class cannot use the sealed modifier. It's also important to mention that structs are implicitly sealed.

    Example

    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
    }
    

    Microsoft documentation

    • Sealed: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/sealed
    • Internal: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/internal
    0 讨论(0)
提交回复
热议问题