伙计们,我刚学习构造函数。我想知道为什么MS允许类中的私有和公共构造函数。如果我同时拥有公共和私有构造函数,它显然无法实现私有构造函数的目的,它允许在外部创建类的实例。我觉得很奇怪。我期望的是,如果私有和公共构造函数都存在于类中,则应该是编译时错误。
有人可以通过示例和原因解释用法。
答案 0 :(得分:3)
拥有公共和私有构造函数没有任何问题。下面是一个例子。
可能是三个不同的公共构造函数共享大部分初始化逻辑。不是重复相同的逻辑三次,有一个私有构造函数执行公共部分,然后让公共构造函数委托给公共部分的私有构造函数。
这不是唯一的用例,但它应该足以说服你,我希望。
答案 1 :(得分:1)
首先,它使用公共构造函数初始化,而私有没有用。编译器只查找公共构造函数,以便可以在类外部进行初始化。 private构造函数被视为普通方法,或者我们可以说构造函数的另一个版本,构造函数签名也必须有一些区别。
答案 2 :(得分:1)
没有人给你一个带有公共和私有构造函数的类的例子,所以这里有一个简单的例子,你可以在哪里看到它。
您可能会看到的一种情况是具有公共构造函数和静态方法的类,这些类创建了需要在构造函数中设置特殊内容的类的实例。
这是一个示例类,字段_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);
}
}
答案 3 :(得分:0)
最短的相当直接的答案是
公共和私人建筑师都以自己的方式工作
怎么样 ??看
你有公共构造函数来从类外部实例化
但现在让我们假设只有在同一个类中调用构造函数时,您可能想要做的事情很少。
因此,根据要求,这两者都不会混淆同时以自己的方式工作。