2

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

有人可以用例子和原因解释一下用法吗?

4

4 回答 4

3

拥有公共和私有构造函数并没有错。下面是一个例子。

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

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

于 2013-11-08T05:03:29.950 回答
1

起初它用公共构造函数初始化,而私有没有用。编译器只寻找公共构造函数,以便它可以在类外初始化。private Constructor 被视为普通方法,或者我们可以说构造函数的另一个版本,构造函数签名也必须有一些差异。

于 2013-11-08T05:04:25.080 回答
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);
    }
}
于 2013-11-08T07:47:44.857 回答
0

最短的非常直接的答案是
公共和私有构造函数都以自己的方式工作。
如何 ??看看
你有公共构造函数可以从类外部实例化。
但是现在让我们假设只有当您在同一个类中调用构造函数时,您可能只想做一些事情。
因此,这两者都不会混淆,它们会根据需要以自己的方式同时工作。

于 2013-11-08T06:51:35.417 回答