2008-10-28 6 views
12

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

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

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

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

ответ

24

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

+5

Или внутренний; или защищенный внутренний – 2008-10-28 14:00:36

1

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

+0

На самом деле, есть 2 общедоступных объекта для HttpContext – 2008-10-28 14:02:36

+0

- они берут SimpleWorkerRequest или HttpRequest, HttpResponse – JohnIdol 2008-10-28 14:06:46

1

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

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

Signleton:

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

private A() 
{ 
} 

} 
0

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

3

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

MyClass c = new MyClass(); 

Вы бы написать вместо

MyClass c = MyClass.getInstance(); 
+0

Конструкторы одиночных одиночек должны быть закрытыми – DanJ 2008-10-28 13:38:37

7

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

В качестве примера, вам необходимо пройти в экземпляре SimpleWorkerRequest, чтобы instatiate экземпляр 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); 

См this link подробности.

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

Cheers

3

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

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

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

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

-1

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