2017-04-18 175 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");中傳遞時,什麼指示它轉到分配器字典?
  3. 當它到達的字典,它是如何知道應執行lambda表達式(提供有多個),因爲我沒有看到一起傳遞與propertySetter(sm, "Johnny Bravo");

這些都是像"TargetText"只有我現在有關於此的問題,如果我想到其他內容,我會更新這篇文章。

+2

'屬性設置器'在'TryGetValue'調用中分配。 – msitt

+2

每個線程的一個問題請。縮小你的問題 – Rahul

+0

*「什麼指示它去分配器字典?」* - 你從'assigner'得到它。它使用'TryGetValue'執行從字典中提取的lambda表達式對象。 –

回答

1

propertySetter委託在Main()中是未賦值的,那爲什麼它被允許使用?

因爲您將它作爲out參數傳遞給if語句,以確保它將被初始化爲值。

當參數在propertySetter(sm,「Johnny Bravo」)中傳遞時;什麼指示它去分配器字典?

你必須與關鍵TargetText相關的字典,你在查找一個動作代表:

assigner.TryGetValue("TargetText", out propertySetter) 

使委託分配給propertySetter,它需要的SomeClass一個實例,並將其Name屬性爲給定值。在此之後,所有代表需要的是類的實例和值,您正在傳入:

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

這樣做更有意義,謝謝。 – Vocaloidas