C# 可以';不能实例化

C# 可以';不能实例化,c#,oop,C#,Oop,我有以下课程: public class Person { public String Name { get; set; } internal Person() { this.Name = "Ian"; } public static Person Initialize() { return new Person(); } } 因为构造函数是内部的,所以当外部程序集尝试实例化Person时,编译器将抛出

我有以下课程:

public class Person
{
    public String Name { get; set; }

    internal Person()
    {
        this.Name = "Ian";
    }

    public static Person Initialize()
    {
        return new Person();
    }
}
因为构造函数是内部的,所以当外部程序集尝试实例化
Person
时,编译器将抛出编译错误“类型Person没有定义构造函数”。这是预期的行为,因为我希望用户通过静态
Initialize
方法实例化类,如下所示:

Person p = Person.Initialize();
但是,IntelliSense仍将
Person
显示为一个可实例化类(在键入
new
关键字后列出)

有没有办法在IntelliSense中“隐藏”构造函数,因为它具有误导性?还是我的设计有问题

编辑: 问题是如何在IntelliSense中“隐藏”构造函数,因为它具有误导性

打开Visual Studio并键入以下内容:

System.IO.TextReader a = new 
如您所见,Intellisense中没有突出显示的
TextReader
。现在试试
Person
Person
“构造函数”将自动突出显示


我想要的是TextReader IntelliSense的“行为”

您正在尝试的是所谓的“单例”

这是这样一个类的基本设计:

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

更多信息:

您正在尝试的是所谓的“单身”

这是这样一个类的基本设计:

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

更多信息:

内部意味着它可以在整个组件中访问。这就是为什么IntelliSense仍然显示构造函数

您需要的是私有的受保护的

private表示只能在类内调用它

protected意味着可以从类内部以及所有派生类中调用它。(如果希望从单例类派生,这是一个很好的选择)


有关可访问性的详细信息:

内部表示可在整个程序集中访问它。这就是为什么IntelliSense仍然显示构造函数

您需要的是私有的受保护的

private表示只能在类内调用它

protected意味着可以从类内部以及所有派生类中调用它。(如果希望从单例类派生,这是一个很好的选择)


有关可访问性的更多信息:

尝试使构造函数
私有化,而不是
内部化
快速猜测是将
私有化
关键字显式添加到
Person
方法中。但是为什么不直接调用构造函数很重要呢?内部意味着它将在相同的
命名空间中可见。是否确保使用
Person
的类不在同一命名空间中?否则,请参阅@Rob的评论。@Kevin:否,表示成员仅在同一程序集中可见。它与名称空间没有任何关系。@Kevin:它位于不同的程序集中。请尝试将构造函数
设置为private
,而不是
internal
。快速猜测是将
private
关键字显式添加到
Person
方法中。但是为什么不直接调用构造函数很重要呢?内部意味着它将在相同的
命名空间中可见。是否确保使用
Person
的类不在同一命名空间中?否则,请参阅@Rob的评论。@Kevin:否,表示成员仅在同一程序集中可见。它与名称空间没有任何关系。@凯文:它在另一个程序集中。问题中的代码不是单例代码。仅仅因为它有一个工厂方法并不能自动使它成为一个单例。问题中的代码不是一个单例。仅仅因为它有一个工厂方法并不能自动使它成为一个单例。