12

不久前,我询问了有关实例化 HttpContext 对象的问题。现在我学到了我不知道的东西,让我困惑的是你不能说 HttpContext ctx = new HttpContext(); 因为该对象没有构造函数。

但是不是每个类都需要构造函数吗?在 C# 中,如果您不提供,编译器会自动为您提供默认的 cstr。

另外,如果我有一个字符串(例如:“Hello There!”)并且我说 Convert.ToBoolean("Hello") 或任何字符串,它是如何工作的?幕后会发生什么?我想在这种情况下,像 CLR Via C# 这样的书会很方便。

我错过了什么?

4

9 回答 9

24

构造函数可以是私有的或受保护的。
即使该类具有公共构造函数,您也不能创建抽象类的实例。

于 2008-10-28T13:31:35.023 回答
7

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 方法来获取当前实例,或者如果它为空则创建它)。

干杯

于 2008-10-28T13:59:39.303 回答
3

你有3个问题...

HttpContext ; 它实际上有两个公共构造函数——但实际上你不应该使用它们。更一般地说,您可以使用非默认构造函数,如下所示MyType foo = new MyType("abc");

缺少构造函数 已经很好地覆盖了,但没有:abstract/static是最简单的,但也没有必要拥有一个公共构造函数。

ToBoolean Behing 场景,这将在道德上等同于bool.Parse("Hello"),它只是检查已知字符串 - 特别是“True”和“False”(使用 OrdinalIgnoreCase,已经处理了 null/trimming/等)。

于 2008-10-28T14:07:11.470 回答
3

例如,单例没有构造函数,或者至少没有公共构造函数。因此,如果您的班级是单身人士,而不是写作

MyClass c = new MyClass();

你会改写

MyClass c = MyClass.getInstance();
于 2008-10-28T13:33:25.877 回答
1

我相信 HttpContext 构造函数已被标记为私有。这意味着您不能自己实例化它。.net 框架在幕后为您创建了一个...

于 2008-10-28T13:32:17.033 回答
1

一言以蔽之:静态

否则,一个类可能会在内部或私有实例化(工厂或单例)

西格莱顿:

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

private A()
{
}

}
于 2008-10-28T13:32:56.923 回答
1

看看单例设计模式

于 2008-10-28T13:49:57.247 回答
0

如果您将构造函数设为私有,则无法将类实例化。但在课堂上是可能的。因此,您可以提供一个返回类实例的静态方法。单例模式就是基于此。

于 2008-10-28T13:33:17.763 回答
-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 类的上述构造函数时,不会出现错误,因为编译器会创建默认构造函数(没有参数的构造函数)。

于 2017-08-02T14:40:42.917 回答