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:否,表示成员仅在同一程序集中可见。它与名称空间没有任何关系。@凯文:它在另一个程序集中。问题中的代码不是单例代码。仅仅因为它有一个工厂方法并不能自动使它成为一个单例。问题中的代码不是一个单例。仅仅因为它有一个工厂方法并不能自动使它成为一个单例。