代码之家  ›  专栏  ›  技术社区  ›  Mank

带有私有构造函数的怪异智能感知行为

  •  3
  • Mank  · 技术社区  · 17 年前

    例子:

    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会同时显示新关键字的private和public构造函数,即使其中一个构造函数是private!

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

    这是虫子还是我遗漏了什么?我正在使用VS2008 SP1。

    编辑:代码清晰度

    4 回复  |  直到 17 年前
        1
  •  1
  •   BFree    17 年前

    哇,真奇怪。我自己在vs2008的副本上试过(我也在运行sp1),结果完全一样。当有不止一个参数时,私有构造函数出现在智能感知中,而不是只有一个。我猜是个虫子。

        2
  •  0
  •   Strelok    17 年前

    不知道为什么Intellisense会向你展示奇怪的东西。但是您应该有一个抽象基类,用于使用公共构造函数的域对象,这样就不必将对象与私有对象混合。你还应该放一些东西,比如你的主键的属性等等。

    public abstract class BaseDomainObject{
      public BaseDomainObject() { }
    
      private int _id;
    
      public virtual int Id { get { return _id; } set { _id = value; } }
    
    }
    
    public SomeDomainObject : BaseDomainObject{
      ...
    }
    
        3
  •  0
  •   JaredPar    17 年前

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

    class Outer {
      private Outer() {
      }
      public Outer Create() { return new Outer(); }
      class Inner() { 
        void Function1() { new Outer(); }
        class DoubleInner() {
           void Function2() { new Outer(); }
        }
      }
    }
    
        4
  •  0
  •   RobV    17 年前

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