私有构造函数与Intellisense的奇怪行为

3

例子:

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#类时,智能提示在使用new关键字时显示了私有构造函数和公共构造函数,尽管其中一个构造函数是私有的!
更奇怪的是,当我从公共构造函数中删除第二个参数(将lastName作为参数删除到公共构造函数),智能提示现在只显示带有new关键字的公共构造函数,这是正确的。
这是一个错误还是我漏掉了什么?我正在使用VS2008 SP1。
编辑:代码清晰度

顺便提一下,我确实需要默认的私有构造函数来满足 NHibernate 的要求。 - Mank
4个回答

1

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


谢谢确认我的观察。我还以为只有我一个人这样想! - Mank

0

尽管私有构造函数出现在Intellisense中,但如果您尝试在不允许的地方编译使用它的代码,编译器仍会抛出“由于保护级别而无法访问”的错误。


0

不知道为什么Intellisense会显示奇怪的东西。但是你应该为你的领域对象拥有一个抽象基类,其中包含一个公共构造函数,这样你就不必在对象中添加私有构造函数。你还应该将主键等属性放在那里。

public abstract class BaseDomainObject{
  public BaseDomainObject() { }

  private int _id;

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

}

public SomeDomainObject : BaseDomainObject{
  ...
}

名称是我的领域类的不可变值对象(DDD)。因此,实际上并不需要抽象基类。 - Mank

0

这很可能是一个 bug,但修复它并不值得。因为有许多情况下访问私有构造函数是合法的。看下面的代码片段,所有私有构造函数的访问都是合法的。

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

是的,对于内部类来说是有效的,但对于其他API用户来说看到一个无效的构造函数是相当烦人的。有没有更好的方法来创建一个不可变对象? - Mank
不要定义私有构造函数。如果您定义了显式构造函数,则不会生成隐式构造函数,因此可访问性将不是问题。这仅适用于引用类型,值类型始终具有默认构造函数。 - JaredPar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接