静态类VS私有构造函数

Kid*_*per 5 c# clr object private-constructor static-class

今天,我一直在阅读静态类和私有构造函数.

静态类 - 我们无法在静态类上创建实例.我们不能继承静态类.仅生成单个实例.

私有构造函数 - 我们无法创建实例.我们不能继承.(我不知道生成了多少个实例.)

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

静态类代码

在此输入图像描述

我理解生成的单个对象作为构造函数被调用一次.

私有构造函数代码

在此输入图像描述

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

我有两个问题.

问题1.我没有发现Private构造函数和Static类之间有任何特别的区别.你能告诉我在哪种情况下我应该使用Private Constructor,我应该在哪里使用Static类,因为我可以使用它们.

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

谢谢.

编辑:

我认为人们不理解我的问题.我知道静态构造函数总是在第一个引用上调用一次.静态构造函数用于初始化类的静态成员.

问题1.我有一种情况:我需要创建一个无法实例化的类.我可以通过静态类或私有构造函数来完成.所以我的问题是"两者之间有什么区别吗?我应该使用哪一个?"

问题2.如果我使用私有构造函数,创建了多少个对象?如果answer为0,则私有构造函数的内存分配在CLR中如何工作.如果我使用私有构造函数,则没有内存分配.

Rya*_*rle 6

您正在调用static方法的两个示例两者之间的区别在于第一个方法是在static无法实例化的类中调用的。第二个类可以实例化,但是您没有选择。

第一个示例中的构造函数static在需要时在运行时自动运行,一般只运行一次。

构造函数private永远不会运行,因为您从未实例化testPrivateConstructor对象。不是因为它是private

编辑:

Q1:如果您需要一个无法实例化的类,请使用static类。如果需要初始化静态成员(或单例模式),则仅使用private构造函数而不是类。static

Q2:如果使用private构造函数,则可以在类本身中实例化类的实例,因此创建的对象数量取决于实例化新对象的次数。

  • 抱歉,您觉得我没有回答您的问题,您的第一个问题很难回答,因为我不同意“我没有发现私有构造函数和静态类之间有任何特殊区别”的前提 - 它们甚至不相似在函数中(我试图解释原因)第二个问题相当于问:“一段字符串有多长” - 构造函数没有定义创建多少个对象。 (2认同)

Mid*_*dan 1

  • 静态构造函数将在类被引用时第一次被调用。静态构造函数用于初始化类的静态成员。
  • 在非静态类中,不会调用私有或公共构造函数。静态成员不会由私有或公共构造函数初始化。

    请参阅下面的示例

        class Program
        {
            static void Main(string[] args)
            {
                OnlyOne.SetMyName("I m the only one."); //static constructor will be called first time when the class will be referenced.
                Console.WriteLine(OnlyOne.GetMyName());
    
                NoInstance.SetMyName("I have private constructor"); //No constructor will be called when the class will be referenced.
                Console.WriteLine(NoInstance.GetMyName());
    
                Console.Read();
            }
        }
    
        static class OnlyOne
        {
            static string name;
            /// <summary>
            /// This will be called first time when even the class will be referenced.
            /// </summary>
            static OnlyOne()
            {
                name = string.Empty;
                Console.WriteLine("Static constructor is called");
            }
    
            public static string GetMyName()
            {
                return name;
            }
    
            public static void SetMyName(string newName)
            {
                name = newName;
            }
        }
    
        public class NoInstance
        {
            static string name;
            private NoInstance()
            {
                name = string.Empty;
                Console.WriteLine("No instance private constructor is called");
            }
    
            public static string GetMyName()
            {
                return name;
            }
    
            public static void SetMyName(string newName)
            {
                name = newName;
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)