【问题标题】:Weird intellisense behavior with private constructor私有构造函数的奇怪智能行为
【发布时间】:2008-12-09 05:57:42
【问题描述】:

例子:

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 作为公共构造函数的参数)时,智能感知现在只正确显示带有 new 关键字的公共构造函数。

这是一个错误还是我在这里遗漏了什么?我正在使用 VS2008 SP1。

编辑:代码清晰

【问题讨论】:

  • 附带说明,我确实需要默认的私有构造函数来满足 NHibernate 要求。

标签: c# .net visual-studio visual-studio-2008 intellisense


【解决方案1】:

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

【讨论】:

  • 感谢您确认我的观察。以为只有我一个!
【解决方案2】:

不知道为什么智能感知会向您显示奇怪的东西。但是你应该有一个带有公共构造函数的域对象的抽象基类,所以你不必用私有的对象来填充你的对象。您还应该将诸如主键的属性之类的东西放在那里。

public abstract class BaseDomainObject{
  public BaseDomainObject() { }

  private int _id;

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

}

public SomeDomainObject : BaseDomainObject{
  ...
}

【讨论】:

  • 名称是我的域类的不可变值对象 (DDD)。所以真的不需要抽象基类。
【解决方案3】:

这可能是一个错误,但不值得努力修复。即因为在许多情况下访问私有构造函数是合法的。取下面的 sn-p 代码。所有私有构造函数访问都是合法的

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

【讨论】:

  • 是的,它对内部类有效,但对于其他 API 用户来说,看到无效的构造函数非常烦人。有没有更好的方法来创建不可变对象?
  • 根本不定义私有构造函数。如果您定义显式构造函数,则不会生成隐式构造函数,因此可访问性不会成为问题。这仅适用于引用类型,值类型将始终具有默认构造函数
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多