2017-04-18 10 views
-3

これは私がここから得たプロジェクトのコードのプロトタイプですが、なぜそれが動作するのか理解するのには苦労しています。 コードは次のとおりです。C#デリゲートを含むコードはどのように機能しますか?

static void Main(string[] args) 
    { 
     SomeClass sm = new SomeClass(); 
     var assigner = new Dictionary<string, Action<SomeClass, string>> 
     { 
      ["TargetText"] = (someClass, value) => someClass.Name = value, 
     }; 

     for (int i = 0; i < 10; i++) 
     { 
      Action<SomeClass, string> propertySetter; 
      if (!assigner.TryGetValue("TargetText", out propertySetter)) 
      { 
       continue; 
      } 
      else 
       propertySetter(sm, "Johnny Bravo"); 
     } 
     Console.WriteLine(sm); // output Johnny Bravo ???? 
    } 
} 
public class SomeClass 
{ 
    string name; 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
    public override string ToString() 
    { 
     return $"{Name}"; 
    } 
} 

質問:

  1. propertySetterデリゲートがMain()に割り当てられていないので、なぜそれが使用することを許可されていますか?
  2. 引数がpropertySetter(sm, "Johnny Bravo");で渡されたときに、代入ディクショナリに移動するよう指示するものはありますか?それは辞書に取得しない場合、私は"TargetText"がそれらであるpropertySetter(sm, "Johnny Bravo");

と一緒に渡されているようなものが表示されないよう、どのようにそれは(複数が提供される)は、ラムダ式実行するために知っているん

  • 今私がこれについて持っている質問のみ、私は何かを考えればこの投稿を更新します。

  • +2

    'PropertySetter'は' TryGetValue'呼び出しで割り当てられます。 – msitt

    +2

    スレッドごとに1つの質問をお願いします。あなたの問題を絞り込んでください – Rahul

    +0

    * "アサイナ辞書に行くための指示は何ですか?" * - あなたはそれを「割り当て者」から得ました。 'TryGetValue'を使って辞書から引っ張ったラムダ式オブジェクトを実行します。 –

    答えて

    1

    main()でpropertySetterデリゲートが割り当てられていないため、なぜそれを使用できますか?

    ifステートメントにout引数として渡すので、値に初期化されます。

    引数がpropertySetter(sm、 "Johnny Bravo")で渡されたとき。それは割り当て者の辞書に行くために何を指示するのですか?

    assigner.TryGetValue("TargetText", out propertySetter) 
    

    だから、デリゲートがpropertySetterに割り当てられ、それがSomeClassのインスタンスを受け取り、そのを設定している:あなたはあなたが見上げているキーTargetTextに関連付けられている辞書にアクションデリゲートを持って

    Nameの値を指定します。その後、デリゲートが必要とするのは、クラスのインスタンスと渡される値です。

    propertySetter(sm, "Johnny Bravo"); 
    
    +0

    これははるかに理にかなっています、ありがとうございます。 – Vocaloidas

    関連する問題