Мне нужно знать, как предотвратить создание класса в .net?Лучший способ предотвратить запуск класса?
Я знаю несколько методов, таких как создание класса Abstract и Static.
Есть ли еще способ достичь этого?
Мне нужно знать, как предотвратить создание класса в .net?Лучший способ предотвратить запуск класса?
Я знаю несколько методов, таких как создание класса Abstract и Static.
Есть ли еще способ достичь этого?
Маркировка конструктора private
. Конечно, это не мешает классу создавать себя через метод static
, например ...
Более практично, в чем цель запрещения создания экземпляра класса. Если у вас есть singleton, тогда нужен конструктор private
. Если это необходимо для принудительного подкласса, то лучше сделать класс abstract
; если это класс с полезными методами, что делает его static
одним способом (тогда у вас могут быть только методы static
).
Я сделал это, но не работал, но я могу создать объект. –
@RomeshSomani Это зависит от того, где вы пытаетесь создать экземпляр. Вам нужно полностью отрицать это, сделать его абстрактным. Извините, я имел в виду статичность. – asawyer
Нет, аннотация имеет другую цель. Сделайте его статическим. –
Марк конструктор (s) private
, protected
или если используется из другой сборки, internal
I need to know how to prevent a class from being Instantiated in .net?
Ваш вопрос не ясен.
Вы имеете в виду экземпляр в runtime? Сделайте класс abstract
или static
.
Вы имеете в виду, что конструктор недоступен в коде? Сделайте конструктор private
. Но обратите внимание, что кто-то все еще может использовать отражение, чтобы захватить дескриптор конструктора и создать экземпляр экземпляра во время выполнения.
Итак, что вы имеете в виду?
Создание класса статический - лучший подход, если вы абсолютно не хотите никаких экземпляров. Это останавливает кого-то от создания экземпляров. Класс будет запечатан и аннотация, и не будет любых конструкторов.
Кроме того, язык будет замечен, что это статический класс и не позволяет использовать его в разных местах, которые включают экземпляров, например. аргументы и переменные типа. Это указывает на намерение более четко, чем просто наличие частного конструктора, что может означать, что есть экземпляры, созданные в этом классе (например, для реализации singleton).
О, и что делает класс статический остановит вас от введения каких-либо бесполезные члены экземпляра в классе тоже :)
Смотрите MSDN для получения дополнительной информации о статических классов.
Интересно, что касается статических классов, они вообще не выглядят (вообще-то вроде классов) (http://codecrafter.blogspot.ca/2009/09/c-static-classes-are-not-real-classes.html); они больше похожи на модули ... –
Если вопрос:
How can you make your class not be instanced without having your class be
static
orabstract
?
Тогда ответ на это осуществить singleton pattern, который в.NET 4+ это легко сделать с:
public sealed class myClass
{
private static readonly Lazy<myClass> lazyInstance =
new Lazy<myClass>(() => new myClass());
public static Instance
{
get
{
return lazyInstance.Value;
}
}
private myClass()
{
// constructor logic here
}
}
Паттерн синглтон позволяет передавать свой класс вокруг в качестве ссылки на методы, в то же время гарантируя, что у вас есть только один экземпляр вашего класса. Это также упрощает тестирование, так как вы можете использовать экземпляр ImyClass
, который реализует myClass
, это очень полезно при создании макетных объектов.
Без .NET4 вы можете реализовать одноплодной шаблон, например:
private static readonly myClass instance = new myClass();
public static Instance
{
get
{
return instance;
}
}
// rest of code remains the same
Который не отложили загрузку до тех пор, пока не называется, есть много других способов, как хорошо (я думаю о 6 различных способов), но два из них являются наиболее распространенными.
Таким образом, вопрос, скорее всего, задает вопрос, знаете ли вы шаблон singleton, и если вы признаете его важность для статических классов для модульных тестов и макетных объектов.
Как уже указывали другие, поля static
, даже те, что обозначены readonly
, могут быть установлены с отражением, кроме того, можно использовать конструктор private
с использованием отражения. Если вам нужно предотвратить это, вам нужно сделать код вызова запущенным в менее надежном пространстве приложения, или вам нужно будет реализовать свой класс как static
.
Как правило, люди не беспокоятся о таких уровнях рефлексии, чтобы обойти свои ограничения, если они «действительно не нужны», например, написав неявные/экстремальные случайные модульные тесты.
Почему не абстрактно – Trikaldarshi
«Невозможность создания экземпляра» - это точное определение 'static class'. Зачем вам что-то еще? –