伙计们,我只是在学习构造函数。我想知道为什么 MS 在一个类中允许私有和公共构造函数。如果我同时有公共和私有构造函数,它显然无法达到私有构造函数的目的,它允许在外部创建类的实例。我觉得很奇怪。我期望的是,如果私有和公共构造函数都存在于一个类中,它应该是一个编译时错误。
有人可以用例子和原因解释一下用法吗?
伙计们,我只是在学习构造函数。我想知道为什么 MS 在一个类中允许私有和公共构造函数。如果我同时有公共和私有构造函数,它显然无法达到私有构造函数的目的,它允许在外部创建类的实例。我觉得很奇怪。我期望的是,如果私有和公共构造函数都存在于一个类中,它应该是一个编译时错误。
有人可以用例子和原因解释一下用法吗?
拥有公共和私有构造函数并没有错。下面是一个例子。
可能是三个不同的公共构造函数共享大部分初始化逻辑。与其重复三遍相同的逻辑,不如让一个私有构造函数执行公共部分,然后让公共构造函数委托给公共部分的私有构造函数。
这不是唯一的用例,但我希望它应该足以说服你。
起初它用公共构造函数初始化,而私有没有用。编译器只寻找公共构造函数,以便它可以在类外初始化。private Constructor 被视为普通方法,或者我们可以说构造函数的另一个版本,构造函数签名也必须有一些差异。
从来没有人给过你一个包含公共和私有构造函数的类的例子,所以这里是一个你可以看到的简单例子。
您可能会看到的一种情况是具有公共构造函数和静态方法的类,这些方法创建需要在构造函数中设置特殊内容的类的实例。
这是一个示例类,该字段_timeStamp
是readonly
意味着它只能在构造函数中设置。当用户构造类时,他被迫使用当前时间作为时间戳,该方法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);
}
}
最短的非常直接的答案是
公共和私有构造函数都以自己的方式工作。
如何 ??看看
你有公共构造函数可以从类外部实例化。
但是现在让我们假设只有当您在同一个类中调用构造函数时,您可能只想做一些事情。
因此,这两者都不会混淆,它们会根据需要以自己的方式同时工作。