首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >静态类与私有构造器

静态类与私有构造器
EN

Stack Overflow用户
提问于 2016-06-23 11:10:02
回答 5查看 14.6K关注 0票数 11

今天,我一直在阅读关于静态类和私有构造函数的文章。

静态类-我们不能在静态类上创建一个实例。我们不能继承静态类。只生成单个实例。

私有构造器-我们不能创建一个实例。我们不能继承。(我不知道生成了多少个实例。)

我创建了两个控制台应用程序,一个用于静态类,一个用于私有构造函数。

静态类代码

我理解生成的单个对象,因为构造函数只调用一次。

私有构造器代码

现在,我不明白是否生成了任何对象。

我有两个问题。

问题1.我没有发现私有构造函数和静态类之间有什么特别的区别。请您建议我在哪种场景中使用私有构造函数,以及在哪里使用静态类,因为我可以同时使用它们。

问题2.如果我使用私有构造函数,会生成多少个对象?

谢谢。

编辑:

我想人们不明白我的问题。我知道静态构造函数总是在第一个引用上调用一次。静态构造函数用于初始化类的静态成员。

问题1.我有一个情况:我需要创建一个不能被实例化的类,我可以通过静态类或私有构造函数来实现这一点。所以我的问题是,“两者之间有什么区别吗?我应该使用哪一种?”

问题2.如果我使用私有构造函数,会创建多少个对象?如果答案是0,那么私有构造函数的内存分配在CLR中是如何工作的。如果我使用私有构造函数,则没有内存分配。

EN

Stack Overflow用户

发布于 2016-06-23 12:13:12

你在这里混合了一些不同的东西

静态类public static class MyClass只能包含静态元素,永远不能初始化。

构造函数(无论是公共的还是私有的)总是在类的实例中创建公共的或私有的,只表示构造函数的可见性。

这通常在实现单例设计时使用。

代码语言:javascript
复制
private MyClass()
{
}
private static MyClass _Singleton;
public static MyClass Singleton
{
    get
    {
        if(_Singleton==null) _Singleton = new MyClass();
        return _Singleton
    }
}

}

另一个是类初始化器,这有点混乱,因为它的语法非常类似于公开添加静态关键字和缺少参数的构造函数。

代码语言:javascript
复制
static MyClass()
{
    //configure static variables on first us only
    b = //read value from file or other resource not avalable at compile time
    a = b.Lenth; //can't be be done in class body as b would not have been initialised yet
}
private static int a;
private static string b;

因此,如果您的类不能被实例化,那么您只能声明是静态的

如果调用私有构造函数,则每个调用都会创建一个实例。

类初始化器不能在第一次使用类时自动调用它,也不能创建实例。

编辑:这是您测试程序的修订版。

代码语言:javascript
复制
public static class StaticClassExample
{
    public static void ClassFunction()
    {
        Console.WriteList("This is a class function")
    }
}
public static class InitialisedStaticClassExample
{
    static InitialisedStaticClassExample()
    {
        Console.WriteList("This class has been initialised")
    }
    public static void ClassFunction()
    {
        Console.WriteList("This is a class function")
    }
}
public class PrivateConstuctorClassExample
{
    static PrivateConstuctorClassExample()
    {
        Console.WriteList("This class has been initialised")
    }
    private PrivateConstuctorClassExample()
    {
        Console.WriteList("This class has been Instantiated")
    }
    public static void ClassFunction()
    {
        Console.WriteList("This is a class function");
        var instance = new PrivateConstuctorClassExample();
        instance.InstanceFunction();
    }
    public void InstanceFunction()
    {
        Console.WriteList("This is a instance function")
    }
}
票数 2
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37989927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档