一个类怎么可能没有构造函数

本文关键字:怎么可能 构造函数 一个 | 更新日期: 2023-09-27 17:47:24

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

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

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

我错过了什么?

一个类怎么可能没有构造函数

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

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类,构造函数是私有的(如果它为null,您可以调用静态getInstance方法来获取当前实例或创建它)。

干杯

例如,

Singleton没有构造函数,或者至少没有公共构造函数。因此,如果您的类是单例,而不是编写

MyClass c = new MyClass();

你会写

MyClass c = MyClass.getInstance();

您有3个问题。。。

HttpContext;它实际上有两个公共构造函数,但实际上不希望使用它们。在更通用的术语中,您可以使用非默认构造函数,如:MyType foo = new MyType("abc");

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

ToBoolean在场景中,这将在道义上等效于bool.Parse("Hello"),它只是检查已知的字符串,特别是"True"answers"False"(使用OrdinalIgnoreCase,处理了null/training/etc)。

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

看看Singleton设计模式。

用一个词来说:静态。

否则,类可能会在内部或私下实例化(Factory或Singleton)

Signleton:

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

如果将构造函数设为私有,则无法从外部初始化类。但在班里,这是可能的。因此,您可以提供一个返回类实例的静态方法。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类的上述构造函数时,不会出现错误,因为编译器会创建默认构造函数(没有参数的构造函数)。