Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net如何创建没有构造函数的非静态类?_.net_Class_Constructor_Default Constructor - Fatal编程技术网

.net如何创建没有构造函数的非静态类?

.net如何创建没有构造函数的非静态类?,.net,class,constructor,default-constructor,.net,Class,Constructor,Default Constructor,在.net中,存在诸如RegistryKey之类的非静态类,例如: RegistryKey RK=Registry.LocalMachine; 上面的类不是静态的(据我所知),但它没有构造函数 RegistryKey RK=new RegistryKey(); 无效(注册表项类未定义构造函数) 我在网上搜索了一下,但还是找不到任何信息 当我写下 class MyClass2 { protected MyClass2(int x) { } } 我得到MyClass2。

在.net中,存在诸如RegistryKey之类的非静态类,例如:

RegistryKey RK=Registry.LocalMachine;
上面的类不是静态的(据我所知),但它没有构造函数

RegistryKey RK=new RegistryKey();
无效(注册表项类未定义构造函数)

我在网上搜索了一下,但还是找不到任何信息

当我写下

class MyClass2
{
    protected MyClass2(int x)
    {
    }
}
我得到MyClass2。MyClass2由于其保护级别而不可访问


我真正想知道的是,如果除了使构造函数私有化之外没有其他方法,那么像RegisteryKey和MyClass2这样的类怎么会有不同的消息呢?

RegistryKey
有两个带参数的私有构造函数。错误消息可能是因为没有默认构造函数
RegistryKey()
,因为如果使用参数定义构造函数,则不会生成隐式无参数构造函数。作为他们的私人,你看不到他们


从技术上讲,即使是抽象类也不能用
new
构建。然后,您可以创建一个私有派生类(或内部派生类)。

下面的类都不是静态的或抽象的,您仍然无法创建ClassA的实例,因为构造函数是内部的(在本例中)。ClassB当然可以创建ClassA的实例,因为这两个类都是同一程序集的一部分,并且可以将其返回给调用方

public class ClassA 
{
   internal ClassA()
   {
       // Internal default constructor.
   }

   public void GetDateTime()
   {
       Console.WriteLine(DateTime.Now.ToString());
   }

}

public  class ClassB
{
    public ClassA GetClassA()
    {
        ClassA obj = new ClassA();
        return obj;
    }


}
可以通过ClassB访问ClassA实例

        ClassB objB = new ClassB();
        ClassA objA = objB.GetClassA();
        objA.GetDateTime();

@ψεδή到底是什么?关于
Registry.LocalMachine
是如何实现的?@ψενΔή我会做得更好。。。我会教你怎么去钓鱼。当你有一个类似的问题时,你可以选择一个或多个类似的程序,然后查看.NET内部。在这种情况下,它非常简单:
Registry.LocalMachine
是一个
静态只读
字段,通过使用
RegistryKey.GetBaseKey
进行初始化(一种
RegistryKey
内部静态
方法)它可以使用
RegistryKey
private
构造函数之一来创建
RegistryKey
(它可以使用它,因为它在同一个类中)。@ψεΔή
Registry
RegistryKey
在同一个程序集中(
mscorlib
),因此
注册表
可以使用
注册表项
内部
方法。