【问题标题】:.net how to make a non static class without a constructor?.net 如何在没有构造函数的情况下制作非静态类?
【发布时间】:2013-08-12 02:43:09
【问题描述】:

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

RegistryKey RK=Registry.LocalMachine;

上面的类不是静态的(据我所知)但它没有构造函数,例如

RegistryKey RK=new RegistryKey();

无效(注册表项类没有定义构造函数)

我在网上搜索过,但我找不到任何信息

当我写以下内容时

class MyClass2
{
    protected MyClass2(int x)
    {
    }
}

MyClass2.MyClass2 由于其保护级别而无法访问

我真正想知道的是,除了将构造函数设为私有之外,还有其他方法吗?如何为 RegisteryKey 和 MyClass2 等类提供不同的消息?

【问题讨论】:

    标签: .net class constructor default-constructor


    【解决方案1】:

    RegistryKey 有两个带参数的私有构造函数。错误信息可能是因为没有默认构造函数RegistryKey(),因为如果定义带参数的构造函数,则不会生成隐式无参数构造函数。将它们设为私有,您不会看到它们。

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

    【讨论】:

    • @ψευδή 究竟是什么? Registry.LocalMachine 怎么可能?
    • @ψευδή 我会做得更好...我会教你如何去钓鱼。当您有类似的问题时,您可以使用 IlSpy 或类似的程序并查看 .NET 内部。在这种情况下,它非常简单:Registry.LocalMachine 是一个 static readonly 字段,通过使用 RegistryKey.GetBaseKeyRegistryKeyinternal static 方法)进行初始化,该字段能够使用 private 的构造函数之一RegistryKey 创建一个RegistryKey (可以使用它,因为它在同一个类中)。
    • @ψευδή RegistryRegistryKey 在同一个程序集中 (mscorlib),所以 Registry 可以使用 internalRegistryKey 方法。
    【解决方案2】:

    下面的类都不是静态的或抽象的,您仍然不能创建 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;
        }
    
    
    }
    

    ClassA 实例可通过 ClassB 访问。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多