2010-07-01 2 views
2

Я пытаюсь использовать инициализаторы объектов, чтобы установить свойства класса, а затем получить доступ к ним внутри конструктора класса. Проблема заключается в том, что свойства не отображаются до тех пор, пока не запустится конструктор. Я делаю что-то неправильно. неИнициализаторы объектов и конструкторы

Базовый класс ..

public class TestClass 
{ 
    public string FirstName{get; set;} 

    public TestClass(){ 
     NewClass nc = NewClass(FirstName); 
    } 

} 

Client Class

public class ClientClass 
{ 
    public ClientClass(){ 
     TestClass tc = new TestClass{ FirstName="Jimmy"}; 
    } 
} 

ответ

10

Инициализаторы объектов действительно синтаксические. Дано:

var person = new Person() { Name = "Matt" }; 

Компилятор изменит это:

Person person = new Person(); 
person.Name = "Matt"; 

(ну, на самом деле его вариант IL)

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

public TestClass(string firstName) { } 
0

Нет вы не делаете ничего плохого. Так работают инициализаторы объектов. Сначала они вызывают конструктор, чтобы получить ссылку на объект и только после установки свойств. Это просто синтаксический сахар.

1
TestClass tc = new TestClass { FirstName = "Jimmy" }; 

является синтаксически

TestClass tc = new TestClass(); 

tc.FirstName = "Jimmy"; 

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

Объектные инварианты должны устанавливаться конструктором и не нарушаться в течение жизни объекта (или более практические инвариантные нарушения должны быть кратковременными и не видимыми для внешнего мира). Поэтому вам действительно нужно передать первое имя в качестве параметра конструктора, если это важно для установления инвариантов объекта.

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

0

Как и другие ответы. Что вы можете сделать, это использовать конструктор для установки FirstName:

public TestClass(string firstName){ 
    FirstName = firstName; 
    NewClass nc = NewClass(FirstName); 
} 
Смежные вопросы