Странное интеллигентное поведение с приватным конструктором - PullRequest
3 голосов
/ 09 декабря 2008

Пример:

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 показывает как закрытый, так и открытый конструктор для нового ключевого слова, даже если один из конструкторов является приватным!

Что еще более странно, так это то, что когда я удаляю второй аргумент из общедоступного конструктора (удаляем lastName в качестве аргумента общедоступного конструктора), intellisense теперь правильно отображает только общедоступный конструктор с новым ключевым словом.

Это ошибка или я что-то здесь упускаю? Я использую VS2008 SP1.

редактировать: четкость кода

Ответы [ 4 ]

1 голос
/ 09 декабря 2008

Вау, это странно. Я только что попробовал это сам на своей копии VS2008 (я также использую SP1) и получил те же самые результаты. Когда было более одного параметра, частный конструктор появлялся в Intellisense, но не тогда, когда был только один. Я думаю, это ошибка.

0 голосов
/ 28 мая 2009

Несмотря на то, что частный конструктор отображается в Intellisense, компилятор все равно будет иметь ошибку «недоступен из-за уровня защиты», если вы попытаетесь скомпилировать код, который использует его там, где это не разрешено

0 голосов
/ 09 декабря 2008

Вероятно, это ошибка, но не стоит усилий, чтобы ее исправить. А именно потому, что существует множество сценариев, в которых доступ к частному конструктору является законным. Возьмите следующий фрагмент кода. Все частные права доступа конструктора

class Outer {
  private Outer() {
  }
  public Outer Create() { return new Outer(); }
  class Inner() { 
    void Function1() { new Outer(); }
    class DoubleInner() {
       void Function2() { new Outer(); }
    }
  }
}
0 голосов
/ 09 декабря 2008

Не знаю, почему intellisense показывает вам странные вещи. Но у вас должен быть абстрактный базовый класс для ваших доменных объектов с открытым конструктором, чтобы вам не приходилось перелистывать свои объекты частными. Вы также должны поместить такие вещи, как ваши свойства для ваших первичных ключей и тому подобное.

public abstract class BaseDomainObject{
  public BaseDomainObject() { }

  private int _id;

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

}

public SomeDomainObject : BaseDomainObject{
  ...
}
...