2014-11-04 98 views
2

,所以我期待在這個C#方法C#方法意味着

if (IsInDesignMode) 
     { 
      // Only runs in design mode 
      _dataService.GetMachine(_machines[0].Machine.SerialNumber, (machine, error) => //<-- this is what I am confused about 
      { 
       SelectedMachine = new MachineViewModel(machine); 
      }); 
     } 

我明白if()語句和SelectedMachine = new MachineViewModel(machine);線。 但是我對這個註釋行感到困惑。

_dataService調用GetMachine方法通過_machines[0].Machine.SerialNumber param和(machine, error) => {}。這不是一個「等於或少於」的陳述吧? 它有點像一個Javascript代碼給我...?

請問法說,

If IsInDesignMode { 
     dataservice.GetMachine(machine serial number, machine error is new MachineViewModel) 
} 

任何人能解釋這是什麼=> { }?非常感謝你!

+0

這裏有幾個鏈接適合您:http://msdn.microsoft.com/en-us/library/bb311046.aspx http://msdn.microsoft.com/en-us/library/bb397687.aspx – Blorgbeard 2014-11-04 02:06:00

+0

@ RaymondChen你好Raymond,你說得對!我只是點擊鏈接。謝謝!我會在下次更難搜索stackoverflow :) – jmesolomon 2014-11-04 02:49:02

回答

3

您詢問的部分是使用lambda表達式的匿名方法。它通常用於回調。

當你寫這個

(machine, error) => { SelectedMachine = new MachineViewModel(machine); } 

你正在還沒有名字(因此不能用名字被重用,像一個普通的方法)的功能。當需要製作一段只需使用一次的可調用代碼時,這是非常方便的,例如,在回調中。

請注意,該方法不必是匿名的:您可以創建一個等效的命名方法。但是,由於匿名方法是在使用方法的上下文中構建的,因此上下文中的變量可用。您的匿名方法分配SelectedMachine,這可能是您班級的一個屬性。同樣,匿名方法也可以訪問局部變量,這是一種非常強大的機制,可以將狀態和運行在其上的一段代碼結合在一起。

+1

可能這句話「因此不能被重用」會誤導? – 2014-11-04 02:11:22

+0

@DanielPratt如果我創建一個名爲委託例如'del customDelegate => a = a + b',那麼我可以重用customDelegate函數..是這樣嗎?所以我猜一個無名函數不能被重用,而一個命名函數可以。 – jmesolomon 2014-11-04 02:16:57

+0

@jmesolomon我認爲丹尼爾意味着如果你爲一個委託類型的變量賦予一個匿名函數並傳遞這個變量,你就可以通過一個變量來訪問它。命名方法可以通過名稱和代理重用。 – dasblinkenlight 2014-11-04 02:20:35

1

更確切地說,這是一個使用lambda表達式的匿名方法。 您要求的符號'=> {}'被稱爲lambda表達式。 通常它與委託類型(如func,Action,predicate和其他)一起使用。 看看上面的類型,讓自己更清晰。