2014-11-06 4 views
2

Я начинаю, когда дело доходит до ООП. Вчера я пытался читать некоторые MVVM/МОФ примеров и я, конечно, попасть в беду ... У меня есть некоторые проблемы с понять некоторые из кода ниже:Возможный способ инициализации конструктора/объекта

{ 
class Person 
{ 
public string FirstName { get; set; } 
public string LastName { get; set; } 
public string Addres { get; set; } 
} 

Это просто обычный класс Person, ничего на самом деле unusal здесь , Проблема заключается в том, что я не могу понять, ниже код:

private void SayHi_Click(object sender, RoutedEventArgs e) 
{ 
Person person = new Person 
{ 
FirstName=FirstName.Text, 
LastName=LastName.Text, 
Addres=Address.Text 
}; 

часть, которую я не понимаю:

Person person = new Person 
    { 
    FirstName=FirstName.Text, 
    LastName=LastName.Text, 
    Addres=Address.Text 
    }; 

Я не уверен, что это именно то. Я думал, что каждый новый объект должен быть инициализирован следующим образом: Class class = new Class() ;. Почему нет() после «нового человека»? Вместо() имеем {}. Я знаю, что мы можем использовать стандартные, параметризованные, статические и частные конструкторы. Может ли кто-нибудь объяснить это мне? Аналогичная ситуация в ниже учебнике из CodeProject:

http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial

У нас есть песни Class

public class Song 
{ 
#region Members 
string _artistName; 
string _songTitle; 
#endregion 

#region Properties 
/// The artist name. 
public string ArtistName 
{ 
get { return _artistName; } 
set { _artistName = value; } 
} 

/// The song title. 
public string SongTitle 
{ 
get { return _songTitle; } 
set { _songTitle = value; } 
} 
#endregion 
} 

И мы, конечно же, вид Модель для этого класса:

public class SongViewModel 
{ 
Song _song; 

public Song Song 
{ 
get 
{ 
return _song; 
} 
set 
{ 
_song = value; 
} 
} 

public string ArtistName 
{ 
get { return Song.ArtistName; } 
set { Song.ArtistName = value; } 
} 
} 

И снова, эта часть кода - это то, что я не могу понять:

public class SongViewModel 
{ 
Song _song; 

public Song Song 

Что это за "Песня _song;" является? Это объект класса песни? И это недвижимость «Песня Песня» также странно ... Возможно, у меня есть недостаток знаний

+0

Компилятор в C# был и будет с большей скоростью, разработанный, чтобы занять много рутинной работы из-за кодирования. Вещи, которые занимают много времени, потому что они выполняются все проклятое время, оптимизируются компилятором по сокращенному коду. Компилятор перезаписывает этот инициализатор объекта как CLS-совместимый, когда он генерирует IL из вашего кода. Есть много иллюзий к компилятору, каждая из которых больше радости, чем следующая. – Will

+0

Песня _song является синтаксическим предпочтением. Всякий раз, когда я вижу примеры кода, которые используют знак подчеркивания, я переводил его в нижестоящую версию вместо подчеркивания. – Stunna

ответ

3

Предоставленный код использует инициализатор Object (MSDN)

От этой страницы:

Инициализаторы объектов позволяют присваивать значения любым доступным полям или свойствам объекта во время создания без необходимости вызывать конструктор, за которым следуют строки операторов присваивания. Синтаксис инициализатора объекта позволяет указать аргументы для конструктора или опустить аргументы (и синтаксис скобок).

В основном, это означает, что вам не нужно (), и можно указать значения общественных мест/недвижимости в {}.

Также; найти другой сайт, чтобы узнать MVVM. Непосредственное создание объектов Model/ViewModel из пользовательского интерфейса - это big no-no.

0

Это:

Person person = new Person 
{ 
FirstName=FirstName.Text, 
LastName=LastName.Text, 
Addres=Address.Text 
}; 

И:

Person person = new Person(); 
person.FirstName=FirstName.Text; 
person.LastName=LastName.Text; 
person.Addres=Address.Text; 

эквивалентны. Первый - синтаксический сахар.

6

Мне пришлось оставить здесь новый ответ, потому что я видел, как 2 человека ошибаются. Синтаксис инициализатора:

Person person = new Person 
{ 
    FirstName = FirstName.Text, 
    LastName = LastName.Text, 
    Address = Address.Text 
}; 

ли не точно эквивалентно созданию новой переменной «лицо», а затем назначить свойства. Скорее всего, это эквивалентно созданию переменной температуры, назначая свойства, а затем назначая результат «лицо»:

Person person; 
var temp = new Person(); 
temp.FirstName = FirstName.Text; 
temp.LastName = LastName.Text; 
temp.Address = Address.Text; 
person = temp; 

различие может быть на самом деле очень важно, особенно при работе в модели представления. Вы должны уметь это видеть, если вы представляете, что вы назначаете свойство, чей сеттер вызывает событие «PropertyChanged», которое, в свою очередь, имеет один или несколько элементов вида, которые его прослушивают. Использование переменной temp приводит к большому усилению производительности, потому что каждый прослушиватель событий запускается только один раз, а не дважды (один раз, когда устанавливается свойство Person, а затем снова, когда каждый из инициализируется его свойствами).

+1

+1 для уточнения – keyboardP

+0

+1 для уточнения. Размышление: D – Stunna

Смежные вопросы