C# 使用私有构造函数的奇怪intellisense行为

C# 使用私有构造函数的奇怪intellisense行为,c#,.net,visual-studio,visual-studio-2008,intellisense,C#,.net,Visual Studio,Visual Studio 2008,Intellisense,例如: public class Name { public string FirstName { get; private set; } public string LastName { get; private set; } private Name() { } public Name(string firstName, string lastName) { FirstName = firstName; LastName

例如:

public class Name {

    public string FirstName { get; private set; }
    public string LastName { get; private set; }

    private Name() { }

    public Name(string firstName, string lastName) {

        FirstName = firstName;
        LastName = lastName;

    }  
}
当试图实例化这个c#类时,intellisense为new关键字显示私有构造函数和公共构造函数,即使其中一个构造函数是私有的

更奇怪的是,当我从公共构造函数中删除第二个参数(将lastName作为参数删除到公共构造函数)时,intellisense现在正确地显示了带有new关键字的公共构造函数

这是一个错误还是我遗漏了什么?我使用的是VS2008SP1


编辑:代码清晰

哇,真奇怪。我只是在我的VS2008副本(我也在运行SP1)上尝试了一下,得到了完全相同的结果。当有多个参数时,私有构造函数会出现在Intellisense中,但当只有一个参数时不会出现。我的猜测是,这是一个bug。

我不知道为什么intellisense会向你展示奇怪的东西。但您应该为具有公共构造函数的域对象提供一个抽象基类,这样您就不必为对象添加私有类。您还应该为主键等设置属性

public abstract class BaseDomainObject{
  public BaseDomainObject() { }

  private int _id;

  public virtual int Id { get { return _id; } set { _id = value; } }

}

public SomeDomainObject : BaseDomainObject{
  ...
}

这可能是一个bug,但不值得努力修复。也就是说,在许多情况下,访问私有构造函数是合法的。以下面的代码片段为例。所有私有构造函数访问都是合法的

class Outer {
  private Outer() {
  }
  public Outer Create() { return new Outer(); }
  class Inner() { 
    void Function1() { new Outer(); }
    class DoubleInner() {
       void Function2() { new Outer(); }
    }
  }
}

即使私有构造函数出现在Intellisense中,如果您试图编译在不允许使用它的地方使用它的代码,编译器仍将通过“由于保护级别而无法访问”错误作为旁注,我确实需要默认私有构造函数来满足NHibernate要求。名称是不可变值对象(DDD)对于我的域类。是的,它对内部类是有效的,但是对于其他API用户来说,看到一个无效的构造函数是非常烦人的。有没有更好的方法来创建不可变对象?根本不要定义私有构造函数。如果定义显式构造函数,则不会生成隐式构造函数,因此无需考虑可访问性。这只适用于引用类型,值类型将始终具有用于确认观察的默认构造函数库。我以为我是唯一一个!