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();. 「new Person」の後に () がないのはなぜですか? () の代わりに {} があります。デフォルト、パラメーター化、静的、およびプライベートなコンストラクターを使用できることはわかっています。誰かが私にこれを説明できますか?以下の 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
}

もちろん、このクラスの View Model もあります。

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_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;

特にビューモデルで作業する場合、この区別は実際には非常に重要です。セッターが「PropertyChanged」イベントを発生させ、それをリッスンする 1 つ以上のビュー要素を持つプロパティに割り当てていると想像すると、これを確認できるはずです。temp 変数を使用すると、パフォーマンスが大幅に向上します。これは、すべてのイベント リスナーが 2 回 (Personプロパティが設定されたときに 1 回、次に各プロパティが初期化されたときに) ではなく、1 回だけ起動されるためです。

于 2014-11-06T20:50:09.323 に答える
3

提供されたコードはObject Initializer ( MSDN )を使用しています

そのページから:

オブジェクト初期化子を使用すると、作成時にオブジェクトのアクセス可能なフィールドまたはプロパティに値を割り当てることができます。コンストラクターを呼び出してから代入ステートメントを実行する必要はありません。オブジェクト初期化構文を使用すると、コンストラクターの引数を指定したり、引数 (および括弧構文) を省略したりできます。

基本的に、これは を必要とせず、()で public フィールド/プロパティ値を指定できることを意味します{}

また; 別のサイトを見つけて MVVM を学習してください。UI から Model/ViewModel オブジェクトを直接作成することは絶対にできません

于 2014-11-06T20:39:19.627 に答える