一个类怎么没有构造函数?

时间:2008-10-28 13:30:24

标签: c# .net constructor clr

前段时间我问过实例化一个HttpContext对象。现在我已经学会了我不知道的东西,让我困惑的是你不能说HttpContext ctx = new HttpContext();因为该对象没有构造函数。

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

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

我错过了什么?

9 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分: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);

有关详细信息,请参阅this link

无论如何,有些类没有公共构造函数 - 例如,考虑singleton类,构造函数是私有的(并且可以调用静态getInstance方法来获取当前实例,如果它为null则可以创建它)。

干杯

答案 2 :(得分:3)

例如,单身人士没有构造者,或者至少没有公共构造者。所以如果你的班级是一个单身人士,而不是写作

MyClass c = new MyClass();

你会改为写

MyClass c = MyClass.getInstance();

答案 3 :(得分:3)

你有3个问题......

<强> HttpContext的;它实际上有两个公共构造函数 - 但实际上你并不期望使用它们。更一般地说,您可以使用非默认构造函数,如:MyType foo = new MyType("abc");

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

<强> ToBoolean 在场景中,这将完成道德等同于bool.Parse("Hello"),它只检查已知的字符串 - 特别是“真”和“假”(使用OrdinalIgnoreCase,处理了null /修剪/等)。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

总之:static

否则,可以在内部或私人(工厂或单身)

实例化一个类

Signleton:

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

private A()
{
}

}

答案 6 :(得分:1)

答案 7 :(得分:0)

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

答案 8 :(得分:-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类的上述构造函数时,不会出现错误,因为编译器会创建默认构造函数(不带参数的构造函数)。