Как в классе может не быть конструктора?

Некоторое время назад я спросил о создании экземпляра объекта HttpContext. Теперь, когда я узнал то, чего не знал, меня смущает то, что вы не можете сказать HttpContext ctx = new HttpContext (); потому что у объекта нет конструктора.

Но разве не каждому классу нужен конструктор? В C#, если вы его не предоставите, компилятор автоматически предоставит вам cstr по умолчанию.

Кроме того, если у меня есть строка (пример: «Привет!») И я говорю Convert.ToBoolean («Привет») или любую строку, как это работает? Что происходит за кулисами? Думаю, в этом случае пригодилась бы книга вроде CLR Via C#.

Что мне не хватает?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
10 042
9

Ответы 9

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

Или внутренний; или защищенный внутренний

Marc Gravell 28.10.2008 17:00

Я считаю, что конструктор HttpContext отмечен как частный. Это означает, что вы не можете создать его самостоятельно. Фреймворк .net создает его за кулисами ...

На самом деле для HttpContext есть 2 публичных объекта.

Marc Gravell 28.10.2008 17:02

конечно - они берут SimpleWorkerRequest или HttpRequest, HttpResponse

JohnIdol 28.10.2008 17:06

Одним словом: статический.

В противном случае экземпляр класса может быть создан внутри или в частном порядке (Factory или Singleton).

Signleton:

Class A{
public static readonly A Instance = new A();

private A()
{
}

}

Если вы сделаете конструктор закрытым, вы не сможете создать класс внешне. Но в классе это возможно. Таким образом, вы можете предоставить статический метод, который возвращает экземпляр класса. На этом основан шаблон singleton.

У синглтонов, например, нет конструкторов или, по крайней мере, нет общедоступных конструкторов. Итак, если ваш класс одноэлементный, вместо того, чтобы писать

MyClass c = new MyClass();

Вы бы вместо этого написали

MyClass c = MyClass.getInstance();

одиночные конструкторы должны быть частными

DanJ 28.10.2008 16:38

У синглтонов есть конструкторы, но их следует вызывать только один раз.

Steve g 28.10.2008 16:49

они не только должны быть частными, они должны быть частными, иначе им больше не будет гарантировано функционировать должным образом как одиночные.

Elie 28.10.2008 16:49

HttpContext имеет общедоступный конструктор с двумя перегрузками, но не по умолчанию (без параметров).

В качестве примера вам необходимо передать экземпляр SimpleWorkerRequest, чтобы создать экземпляр HttpContext и назначить его HttpContext.Current:

//Initialize this stuff with some crap
string appVirtualDir = "/"; 
string appPhysicalDir = @"C:\Documents and Settings\"; 
string page = @"localhost"; 
string query = string.Empty; 
TextWriter output = null;    
//Create a SimpleWorkerRequest object passing down the crap
SimpleWorkerRequest workerRequest = new SimpleWorkerRequest(appVirtualDir, appPhysicalDir, page, query, output);
//Create your fake HttpContext instance 
HttpContext.Current = new HttpContext(workerRequest);

Подробнее см. эта ссылка.

В любом случае некоторые классы не имеют общедоступных конструкторов - подумайте о классе одиночка, например, конструктор является частным (и вы можете вызвать статический метод getInstance, чтобы получить текущий экземпляр или создать его, если он равен нулю).

Ваше здоровье

У вас есть 3 вопроса ...

HttpContext; на самом деле у него есть два общедоступных конструктора, но на самом деле от вас не ожидается их использования. В более общем плане вы можете использовать конструкторы, отличные от конструкторов по умолчанию, например: MyType foo = new MyType("abc");.

Отсутствует конструктор Уже достаточно хорошо освещены, но нет: abstract / static - самые простые, но также не обязательно иметь конструктор общественный.

ToBoolean Помимо сцен, это будет моральным эквивалентом bool.Parse("Hello"), который просто проверяет известные строки - в частности, «True» и «False» (используя OrdinalIgnoreCase, имея дело с null / обрезкой и т. д.).

Компилятор не создает конструктор класса по умолчанию до тех пор, пока в классе не появится конструктор с аргументами. В классе HttpContext у него есть 2 конструктора с аргументами. Итак, ошибка отображается, когда вы выполняете HttpContext obj = new HttpContext ().

public class Sample
{
    int x;
    public Sample (int x)
    {
        x = 2;
    }
}
public class Program
    {
        static void Main(string[] args)
        {
            Sample s = new Sample();//error is shown
        }
    }

Когда вы удалите вышеуказанный конструктор класса Sample, ошибки не возникнет, поскольку компилятор создает конструктор по умолчанию (конструктор без аргументов).

HttpContext не имеет приемлемого конструктора Любые с любыми аргументами, а не только конструктора без параметров.
Servy 02.08.2017 17:56

Вы не устранили проблемы со своим ответом.

Servy 02.08.2017 19:17

Хорошо, но логически ли мои ответы верны или я неправильно истолковал? @Servy

Namrata Ajmeri 02.08.2017 19:37

Вы никак не ответили на вопрос. Просто посмотрите документацию, чтобы узнать, какие конструкторы есть в HttpClient.

Servy 02.08.2017 20:00

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