Подтвердить что ты не робот

Как класс не имеет конструктора?

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

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

Кроме того, если у меня есть строка (пример: "Hello There!" ), и я говорю Convert.ToBoolean( "Hello" ) или любую строку, как это работает? Что происходит за кулисами? Думаю, в этом случае будет удобна книга типа CLR Via С#.

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

4b9b3361

Ответ 1

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

Ответ 2

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).

Приветствия

Ответ 3

Синглтоны, например, не имеют конструкторов или, по крайней мере, нет публичных конструкторов. Поэтому, если ваш класс является одиночным, вместо написания

MyClass c = new MyClass();

Вместо этого вы пишете

MyClass c = MyClass.getInstance();

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

Одним словом: static.

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

Signleton:

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

private A()
{
}

}

Ответ 8

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

Ответ 9

Компилятор не создает по умолчанию конструктор класса, пока класс не имеет конструктора с аргументами. В классе 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, ошибки не будет, поскольку компилятор создает конструктор по умолчанию (конструктор без аргументов).