在C#中具有私有和公共构造函数的类可以实例化 - 奇怪

时间:2013-11-08 04:59:52

标签: c# .net constructor access-modifiers

伙计们,我刚学习构造函数。我想知道为什么MS允许类中的私有和公共构造函数。如果我同时拥有公共和私有构造函数,它显然无法实现私有构造函数的目的,它允许在外部创建类的实例。我觉得很奇怪。我期望的是,如果私有和公共构造函数都存在于类中,则应该是编译时错误。

有人可以通过示例和原因解释用法。

4 个答案:

答案 0 :(得分:3)

拥有公共和私有构造函数没有任何问题。下面是一个例子。

可能是三个不同的公共构造函数共享大部分初始化逻辑。不是重复相同的逻辑三次,有​​一个私有构造函数执行公共部分,然后让公共构造函数委托给公共部分的私有构造函数。

这不是唯一的用例,但它应该足以说服你,我希望。

答案 1 :(得分:1)

首先,它使用公共构造函数初始化,而私有没有用。编译器只查找公共构造函数,以便可以在类外部进行初始化。 private构造函数被视为普通方法,或者我们可以说构造函数的另一个版本,构造函数签名也必须有一些区别。

答案 2 :(得分:1)

没有人给你一个带有公共和私有构造函数的类的例子,所以这里有一个简单的例子,你可以在哪里看到它。

您可能会看到的一种情况是具有公共构造函数和静态方法的类,这些类创建了需要在构造函数中设置特殊内容的类的实例。

这是一个示例类,字段_timeStampreadonly,这意味着它只能在构造函数中设置。当用户构造类时,他被迫使用当前时间作为时间戳,方法GetMessageFromFile(使用一个特殊的私有构造函数,只有它(和函数内的其他方法)可以调用才能传入时间戳的值。

public class TimeStampedMessage
{
    public TimeStampedMessage(string message)
    {
        Message = message;
        _timeStamp = DateTime.Now;
    }

    private TimeStampedMessage(string message, DateTime timeStamp)
    {
        Message = message;
        _timeStamp = timeStamp;
    }

    public string TimeStampedMessage { get; private set; }

    //Because this field is marked readonly it must be set inside a constructor.
    private readonly DateTime _timeStamp;
    public DateTime TimeStamp {get { return _timeStamp; } }

    public static TimeStampedMessage GetMessageFromFile(string path)
    {
        var fileText = File.ReadAllText(path);
        var fileTimeStamp = File.GetCreationTime(path);

        //this constructor can not be used by a end user because it is marked private, but it can be used here inside the function.
        return new Foo(fileText, fileTimeStamp);
    }
}

答案 3 :(得分:0)

最短的相当直接的答案是 公共和私人建筑师都以自己的方式工作 怎么样 ??看 你有公共构造函数来从类外部实例化 但现在让我们假设只有在同一个类中调用构造函数时,您可能想要做的事情很少。
因此,根据要求,这两者都不会混淆同时以自己的方式工作。