Kid*_*per 5 c# clr object private-constructor static-class
今天,我一直在阅读静态类和私有构造函数.
静态类 - 我们无法在静态类上创建实例.我们不能继承静态类.仅生成单个实例.
私有构造函数 - 我们无法创建实例.我们不能继承.(我不知道生成了多少个实例.)
我创建了两个控制台应用程序,一个用于静态类,一个用于私有构造函数.
静态类代码
我理解生成的单个对象作为构造函数被调用一次.
私有构造函数代码
现在,我不明白是否生成了任何对象.
我有两个问题.
问题1.我没有发现Private构造函数和Static类之间有任何特别的区别.你能告诉我在哪种情况下我应该使用Private Constructor,我应该在哪里使用Static类,因为我可以使用它们.
问题2.如果我使用私有构造函数,会生成多少个对象?
谢谢.
编辑:
我认为人们不理解我的问题.我知道静态构造函数总是在第一个引用上调用一次.静态构造函数用于初始化类的静态成员.
问题1.我有一种情况:我需要创建一个无法实例化的类.我可以通过静态类或私有构造函数来完成.所以我的问题是"两者之间有什么区别吗?我应该使用哪一个?"
问题2.如果我使用私有构造函数,创建了多少个对象?如果answer为0,则私有构造函数的内存分配在CLR中如何工作.如果我使用私有构造函数,则没有内存分配.
您正在调用static方法的两个示例两者之间的区别在于第一个方法是在static无法实例化的类中调用的。第二个类可以实例化,但是您没有选择。
第一个示例中的构造函数static在需要时在运行时自动运行,一般只运行一次。
构造函数private永远不会运行,因为您从未实例化testPrivateConstructor对象。不是因为它是private。
编辑:
Q1:如果您需要一个无法实例化的类,请使用static类。如果需要初始化静态成员(或单例模式),则仅使用private构造函数而不是类。static
Q2:如果使用private构造函数,则可以在类本身中实例化类的实例,因此创建的对象数量取决于实例化新对象的次数。
在非静态类中,不会调用私有或公共构造函数。静态成员不会由私有或公共构造函数初始化。
请参阅下面的示例
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)