【问题标题】:Can we create more than 1 instance using Private Constructor?我们可以使用 Private Constructor 创建超过 1 个实例吗?
【发布时间】:2019-04-03 11:35:10
【问题描述】:

我们都知道我们不能创建具有私有构造函数的类的对象。所以问题是这个类可以创建多少个实例。请在下面找到示例代码。

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 个类的对象。需要帮助理解这一点。

【问题讨论】:

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

标签: c# private-constructor


【解决方案1】:

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

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

这个类可以创建多少个实例

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

我认为您可能会感到困惑的是,您希望第二个 Console.WriteLine 打印 30,但它打印了 20。那是因为public int val ; 是一个实例成员。如果它是静态成员,那么它会打印30

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

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

      Test ob = new Test();
      ob.CallMe(someValue);
      

      您的示例说明了私有字段/方法的使用。 当构造函数或字段等方法使用 private 关键字标记时,该方法/字段只能从声明类中调用/访问。

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-04-22
          • 2014-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多