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

在C#中同时具有私有和公共构造函数的类可以实例化-奇怪,c#,.net,constructor,access-modifiers,C#,.net,Constructor,Access Modifiers,各位,我只是在学习构造器。我想知道为什么MS在类中同时允许私有构造函数和公共构造函数。如果我同时拥有公共构造函数和私有构造函数,它显然不符合私有构造函数的目的,因为它允许在外部创建类的实例。我觉得很奇怪。我所期望的是,如果类中同时存在私有构造函数和公共构造函数,则应该是编译时错误 有人能举例说明一下它的用法和原因吗。有公共构造函数和私有构造函数都没有错。下面是一个例子 可能是三个不同的公共构造函数共享了大部分初始化逻辑。与其将相同的逻辑重复三次,不如让一个执行公共部分的私有构造函数,然后让公共构

各位,我只是在学习构造器。我想知道为什么MS在类中同时允许私有构造函数和公共构造函数。如果我同时拥有公共构造函数和私有构造函数,它显然不符合私有构造函数的目的,因为它允许在外部创建类的实例。我觉得很奇怪。我所期望的是,如果类中同时存在私有构造函数和公共构造函数,则应该是编译时错误


有人能举例说明一下它的用法和原因吗。

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

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


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

首先它使用公共构造函数初始化,而私有构造函数没有任何用处。编译器只查找公共构造函数,以便可以在类外部对其进行初始化。私有构造函数被视为普通的方法,或者我们可以说是构造函数的另一个版本,而且构造函数的签名也一定有一些不同。

最简单最直接的答案是
公共和私人施工人员都有自己的工作方式。
怎样??看
您需要从类外部实例化公共构造函数。
但是现在让我们假设只有在调用同一类中的构造函数时,才需要执行一些操作。

因此,在这方面没有任何混淆,根据需求,两者将以各自的方式同时工作。

没有人给过您一个同时包含公共和私有构造函数的类的示例,因此下面是一个简单的示例,您可以在其中看到一个

您可能看到的一种情况是,类既有公共构造函数,也有静态方法,它们创建了需要在构造函数中设置特殊内容的类实例

下面是一个示例类,字段
\u timeStamp
是,这意味着它只能在构造函数中设置。当用户构造类时,他被迫使用当前时间作为时间戳,方法
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);
    }
}

不,我当然不同意这种风格,最重要的原因是,它如何允许类之外的实例化,这与特殊私有的概念是背道而驰的constructor@Divine我不明白你的问题。私有构造函数不能从类外调用。那为什么这是反对封装的呢?我的问题是Class A{public A(){};private A(){};}类B:A{A A=new A();}.我说当我们只有私有cons时,这是不可能的,但是当我有public和private时,为什么可能?为什么优先于public cons?这违背了私有构造函数的目的,即我不希望像你说的那样在类之外实例化类。@siven我相信代码会给你一个编译器错误,因为e
A
的两个构造函数具有相同的签名。标记为private的特定构造函数只意味着不能从类外部调用该特定构造函数。它不涉及该类的其他构造函数。