C# 我们可以使用私有构造函数创建多个实例吗?

C# 我们可以使用私有构造函数创建多个实例吗?,c#,private-constructor,C#,Private Constructor,我们都知道,我们不能创建具有私有构造函数的类的对象。因此,问题是这个类可以创建多少个实例 public class Test { public int val ; private Test(int sent) { val=val +sent; } public static void Callme(int GetVal) { Test obj=new Test(GetVal); Console.Wr

我们都知道,我们不能创建具有私有构造函数的类的对象。因此,问题是这个类可以创建多少个实例

public class Test
{
    public int val ;
    private Test(int sent)
    {
        val=val +sent;
    }
    public static void Callme(int  GetVal)
    {
        Test obj=new Test(GetVal);
        Console.WriteLine(obj.val);
    }
}
public class Program
{
    public static void Main()
    {       
        Test.Callme(10);
        //Console.WriteLine(Test.val);
        Test.Callme(20);
        //Console.WriteLine(Test.val);
    }
}
据我所知,它应该创建类的2个对象。我需要帮助理解这一点

我们都知道,我们不能创建具有私有构造函数的类的对象

嗯,那不准确。您可以使用一个类的静态成员创建一个只有私有构造函数的类的对象(实例),就像问题中的代码一样。
您不能做的是从代码中的任何其他地方创建该类的实例

可以创建多少个此类实例

在您的代码示例中,有两个类
Test
的实例


我想可能会让你困惑的是,你希望第二个
控制台。WriteLine
打印
30
,但它打印
20
。这是因为
public int val是实例成员。如果它是一个静态成员,那么它将打印
30

Callme
方法是一个静态方法。静态方法不需要调用对象实例。它们没有this(关键字)引用,可以直接在类上调用。在您的情况下,
Test.CallMe(someValue)
。请注意,这里没有涉及对象实例。 如果
CallMe
不是静态方法,则需要一个实例/对象来调用它。比如说

Test ob = new Test();
ob.CallMe(someValue);
您的示例说明的是私有字段/方法的使用。 当构造函数或字段之类的方法标记为private关键字时,只能从声明类中调用/访问该方法/字段

这意味着
CallMe
可以访问构造函数,因为
CallMe
是类的成员,而构造函数是类的成员,因此它们可以相互访问

当一个类只有一个构造函数并且该构造函数是私有的时,这实际上意味着只能从类内部创建该类的实例

因此,在当前示例中,
CallMe
在每次调用该类时创建该类的实例。
如果您调用
CallMe
2次,您将创建该类的2个实例。

因为方法CallMe是静态的,所以它在使用之前由系统在某个点实例化,然后保留在内存中以备将来调用。无论创建了多少个类实例,一个类的静态成员只有一个副本。

也许您正在寻找这样的东西:

public static Test Callme(int GetVal)
{
    Test obj = new Test(GetVal);
    Console.WriteLine(obj.val);
    return obj;
}
然后创建新实例,如:

Test test1 = Test.Callme(10);
Test test2 = Test.Callme(20);

通过这种方式,您可以轻松访问每个实例的成员。例如,test1.val

尽管构造函数是私有的,但方法
Callme
充当静态工厂(尽管不返回实例)。因此,您可以通过工厂创建任意数量的实例。构造函数的访问修饰符与您可以创建多少实例无关
private
此处仅表示只有
Test
的成员才能访问构造函数(并创建实例)。是的,在您的示例中创建了两个不同的实例。