Некоторое время назад я спросил о создании экземпляра объекта HttpContext. Теперь, когда я узнал то, чего не знал, меня смущает то, что вы не можете сказать HttpContext ctx = new HttpContext (); потому что у объекта нет конструктора.
Но разве не каждому классу нужен конструктор? В C#, если вы его не предоставите, компилятор автоматически предоставит вам cstr по умолчанию.
Кроме того, если у меня есть строка (пример: «Привет!») И я говорю Convert.ToBoolean («Привет») или любую строку, как это работает? Что происходит за кулисами? Думаю, в этом случае пригодилась бы книга вроде CLR Via C#.
Что мне не хватает?





Конструктор может быть частным или защищенным. Также вы не можете создать экземпляр абстрактного класса, даже если у этого класса есть общедоступный конструктор.
Я считаю, что конструктор HttpContext отмечен как частный. Это означает, что вы не можете создать его самостоятельно. Фреймворк .net создает его за кулисами ...
На самом деле для HttpContext есть 2 публичных объекта.
конечно - они берут SimpleWorkerRequest или HttpRequest, HttpResponse
Одним словом: статический.
В противном случае экземпляр класса может быть создан внутри или в частном порядке (Factory или Singleton).
Signleton:
Class A{
public static readonly A Instance = new A();
private A()
{
}
}
Если вы сделаете конструктор закрытым, вы не сможете создать класс внешне. Но в классе это возможно. Таким образом, вы можете предоставить статический метод, который возвращает экземпляр класса. На этом основан шаблон singleton.
У синглтонов, например, нет конструкторов или, по крайней мере, нет общедоступных конструкторов. Итак, если ваш класс одноэлементный, вместо того, чтобы писать
MyClass c = new MyClass();
Вы бы вместо этого написали
MyClass c = MyClass.getInstance();
одиночные конструкторы должны быть частными
У синглтонов есть конструкторы, но их следует вызывать только один раз.
они не только должны быть частными, они должны быть частными, иначе им больше не будет гарантировано функционировать должным образом как одиночные.
Взгляните на Шаблон проектирования Singleton.
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
Вы никак не ответили на вопрос. Просто посмотрите документацию, чтобы узнать, какие конструкторы есть в HttpClient.
Или внутренний; или защищенный внутренний