Ответ 1
Конструктор может быть закрытым или защищенным.
Также вы не можете создать экземпляр абстрактного класса, даже если этот класс имеет открытый конструктор.
А назад я спросил о создании экземпляра объекта HttpContext. Теперь, когда я узнал, чего не знал, меня смущает то, что вы не можете сказать HttpContext ctx = new HttpContext(); потому что объект не имеет конструктора.
Но не каждый класс нуждается в конструкторе? В С#, если вы его не предоставили, компилятор автоматически предоставит вам cstr по умолчанию.
Кроме того, если у меня есть строка (пример: "Hello There!" ), и я говорю Convert.ToBoolean( "Hello" ) или любую строку, как это работает? Что происходит за кулисами? Думаю, в этом случае будет удобна книга типа CLR Via С#.
Что мне не хватает?
Конструктор может быть закрытым или защищенным.
Также вы не можете создать экземпляр абстрактного класса, даже если этот класс имеет открытый конструктор.
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);
Подробнее см. эту ссылку.
В любом случае некоторые классы не имеют общих конструкторов - например, для singleton, конструктор является закрытым (и вы можете вызовите статический метод getInstance для получения текущего экземпляра или создания его, если он равен null).
Приветствия
Синглтоны, например, не имеют конструкторов или, по крайней мере, нет публичных конструкторов. Поэтому, если ваш класс является одиночным, вместо написания
MyClass c = new MyClass();
Вместо этого вы пишете
MyClass c = MyClass.getInstance();
У вас есть 3 вопроса...
HttpContext; у него фактически есть два общественных конструктора, но на самом деле вы не собираетесь их использовать. В более общих терминах вы можете использовать конструкторы, не относящиеся к умолчанию, например: MyType foo = new MyType("abc");
.
Отсутствующий конструктор
Довольно хорошо охвачены уже, но нет: abstract
/static
являются простейшими, но также нет необходимости иметь публичный конструктор.
ToBoolean
Если вы видите сцены, это будет означать моральный эквивалент bool.Parse("Hello")
, который просто проверяет известные строки - в частности, "True" и "False" (используя OrdinalIgnoreCase, имея дело с нулевым/обрезкой/etc).
Я считаю, что конструктор HttpContext был помечен как частный. Это означает, что вы не можете создать экземпляр самостоятельно. Структура .net создает для вас за кулисами...
Одним словом: static.
В противном случае класс может быть создан как внутри, так и в частном порядке (Factory или Singleton)
Signleton:
Class A{
public static readonly A Instance = new A();
private A()
{
}
}
Взгляните на шаблон дизайна Singleton.
Если вы сделаете конструктор закрытым, вы не можете extarnaly установить класс. Но внутри класса это возможно. Таким образом, вы можете предоставить статический метод, возвращающий экземпляр класса. На этом основан шаблон singleton.
Компилятор не создает по умолчанию конструктор класса, пока класс не имеет конструктора с аргументами. В классе 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, ошибки не будет, поскольку компилятор создает конструктор по умолчанию (конструктор без аргументов).