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

问题描述 投票:2回答:4

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

有人可以用例子和原因来解释用法。

c# .net constructor access-modifiers
4个回答
3
投票

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

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

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


1
投票

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


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);
    }
}

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.