2

我是 OOP 的初学者。昨天我试图阅读一些 mvvm/wpf 示例,当然我遇到了麻烦......我在理解下面的一些代码时遇到了一些问题:

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

这只是普通的 Person 类,这里没有什么不寻常的。问题是我无法理解下面的代码:

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

我们有一个歌曲班

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;” 是?这是宋课的对象?而且这个属性“宋歌”也很诡异……大概是我见识少

4

3 回答 3

6

我不得不在这里留下一个新的答案,因为我见过 2 人弄错了。初始化器语法:

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

完全等同于创建一个新变量“person”然后分配属性。相反,它相当于创建一个临时变量,分配属性,然后将结果分配给“person”:

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

这种区别实际上可能非常重要,尤其是在视图模型中工作。您应该能够看到这一点,如果您想象您正在分配一个属性,该属性的 setter 引发“PropertyChanged”事件,而该事件又具有一个或多个视图元素监听它。使用 temp 变量会带来很大的性能提升,因为每个事件侦听器只被触发一次,而不是两次(一次在Person设置属性时,然后在初始化其每个属性时再次触发)。

于 2014-11-06T20:50:09.323 回答
3

提供的代码使用对象初始化器( MSDN )

从该页面:

对象初始化器允许您在创建时为对象的任何可访问字段或属性赋值,而无需调用构造函数,然后调用赋值语句行。对象初始值设定项语法使您能够为构造函数指定参数或省略参数(和括号语法)。

基本上,这意味着您不需要(), 并且可以在{}.

还; 找一个不同的网站来学习 MVVM。从 UI 直接创建 Model/ViewModel 对象是一个很大的禁忌。

于 2014-11-06T20:39:19.627 回答
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;

是等价的。第一个是语法糖。

于 2014-11-06T20:44:58.403 回答