Что такое внутренний запечатанный класс в C#?

Я искал код C# для расширения языковой поддержки в VS2010 (пример Ook). Я видел несколько классов под названием internal sealed class

Что они делают? Можно ли их использовать?

Спасибо

5 ответов

Решение

Это класс, который:

  • internal Доступ к нему возможен только из той сборки, для которой она определена (или из дружественных сборок).
  • sealed Не может быть унаследовано.

Маркировка классов как internal это способ предотвратить использование их внешними пользователями сборки. Это действительно форма инкапсуляции проекта, и IMHO, это хорошая практика, чтобы помечать типы, которые не являются частью предполагаемых общедоступных API\ объектных моделей, как internal, В долгосрочной перспективе это препятствует тому, чтобы пользователи вашей библиотеки связывали себя с типами, к которым вы их не предназначали. Такое непреднамеренное связывание наносит вред вашей способности изменять и развивать способы реализации ваших библиотек, поскольку вы не можете изменить их, не нарушая своих клиентов. С помощью internal помогает сохранить публичную и полезную площадь библиотеки на том уровне, который предназначен.

Маркировка классов как sealed предотвращает наследование этих классов. Это довольно радикальное намерение разработки, которое иногда полезно, если класс уже настолько специализирован, что разумно, чтобы никакие другие функциональные возможности не добавлялись к нему через наследование либо напрямую, либо через переопределение его поведения.

internal а также sealed модифицировать типы совершенно по-разному, но их можно использовать вместе.

NB. У вас есть дополнительный контроль internal как вы можете определить набор других сборок как "друзья". Эти собрания друзей могут получить доступ к вашему internal типы. Это может быть полезно для определения наборов взаимодействующих сборок, таких как сборочные и испытательные сборки. Часто желательно, чтобы тестовая сборка могла видеть все типы в тестируемой сборке.

  • internal: класс, доступ к которому возможен только внутри одной сборки.

    Assembly1.dll:

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

    Assembly2.dll:

    using test;
    ...
    InternalClass c1; // Error
    PublicClass c2; // OK
    
  • запечатанный: класс, который не может быть получен из

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

Внутренний означает, что элемент доступен для других типов, определенных в той же сборке. Запечатанный класс является своего рода противоположностью абстрактного. Он может быть создан, но не может служить базовым классом. Основная причина запечатать класс - не дать своим пользователям возиться с ним и ломать его. Это также тот случай, когда запечатывание класса допускает определенные оптимизации компилятора, которые невозможны для неопечатанных классов.

internal sealed класс это то, что:

internal - Доступно только из одной сборки
sealed - Не может быть подклассом

Другими словами, вы не можете использовать его напрямую.

Внутренние средства могут использоваться только в одной сборке,

Внутреннее ключевое слово является модификатором доступа для типов и членов типов. Внутренние типы или элементы доступны только внутри файлов в одной сборке

запечатанный, который не может быть унаследован

Запечатанный класс не может быть унаследован. Использование закрытого класса в качестве базового класса является ошибкой. Используйте модификатор 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() { ... }
}

Примером его использования является специализированный класс / метод или свойство, в котором потенциальные изменения могут заставить их перестать работать должным образом (например, класс Pens пространства имен System.Drawing).

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

Поскольку класс sealed не может быть унаследован, его нельзя использовать в качестве базового класса, и, как следствие, абстрактный класс не может использовать модификатор sealed. Также важно отметить, что структуры неявно запечатаны.

пример

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

Другие вопросы по тегам