2017-03-01 55 views
4

當我跳過具有委託類型的標識符時,編譯器會拋出錯誤,說出所需的標識符。所以,在聲明委託時,爲什麼必須指定類型的標識符?在聲明權中只有類型信息就足夠了?爲什麼委託聲明需要提到標識符?

public delegate void MyDel(object o, EventArgs e); // accepted by compiler 
public delegate void MyDel(object, EventArgs); // throws error, why? 

注意:C++支持只有類型的聲明。由於我來自C++背景,我預計這裏的行爲也是一樣。

+3

假設您有一個代表對象和EventArgs的兩個對象的委託。你或者其他執行委託的人會如何分辨哪個是哪個? – BoltClock

+0

是否想從接口中聲明的方法中刪除參數名稱,以及抽象方法嗎?基本上,參數列表在任何地方都有一致的語法。 –

回答

1

如果沒有別的,那麼在您編寫documentation時,您可以清楚地指出您正在討論哪些參數。 (例如,對於具有相同類型的多個參數的代表)

它也與其他區域(例如抽象方法或接口方法)一致,但它們也沒有主體,但仍需要命名參數。

-1

任何優秀的程序員都將定義參數名稱,清楚地指明它們的用途。如果只允許輸入,則會導致混淆。這種混淆需要文檔和仔細閱讀,導致生產力的下降。對於這種語言的設計者決定在定義委託或接口時定義參數名稱。

想象的SqlCommand DEFN

SqlCommand(string, SqlConnection) 

VS

SqlCommand(string cmdText, SqlConnection connection) 
0

注意,我找不到任何官方關於這一點。以下是我的猜測。

首先,具有參數名稱可以讓人們很容易知道該參數的作用。如果你只有object而不是object sender,這個參數的重要性是非常模糊的。如果您在那裏輸入sender這個詞,人們一眼就會知道這個參數代表了一個事件的發送者。其次,這使得IDE爲您生成代碼變得很容易。曾嘗試讓Windows窗體設計器爲您生成一個事件處理程序?它根據委託聲明中的參數生成參數名稱。如果不在聲明中放入參數名稱,則IDE無法爲您生成有意義的名稱。

最後,保持語法與方法聲明類似,對於編譯器開發人員來說可能更少。 :)

1

還有一個名爲通話的問題的方法

MyDel myDel = MyMethod; 
myDel(o:sender,e: eve); 

C#允許它,如果你沒有一個名字,你怎麼能做到這一點。

+0

這是一個很好的論點,但它在歷史上有點顛倒。代表是第一個(並且他們總是有命名參數),然後來到命名參數。所以你也可以說,如果代表中沒有命名參數,引入顯式命名參數會更困難。無論如何,+1是值得的。 – Sefe

+0

你是對的可以宣誓它是在同一個版本。 –

0

有立即來到我的腦海裏至少有兩個很好的理由:

一致性與方法聲明

你是正確的,參數名稱不是簽名的組成部分,因此它在技術上是不需要匹配委託(因此,在將委託與方法匹配時,參數名稱將被忽略)。但是,一致性是語言的一個重要特徵。它使學習變得更容易,減少認知工作量,從而提高生產力。代表是一種方法的「佔位符」。爲了保持一致,將其定義儘可能類似於方法定義是有意義的。一種方法會聲明如下:

void PropertyChangedHandler(object sender, PropertyChangedEventArgs e) { 
    //... 
} 

授人以這種方法可以像定義:

delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e); 

正如你所看到的,唯一的區別是delegate關鍵字(當然缺乏一個方法體,這在這裏是不相關的,因爲這不是簽名的一部分)。這很容易學習和記憶。

發展論壇艾滋病

在Visual Studio中,您可以鍵入事件名稱,然後+=,按Tab鍵兩次,並會爲您生成的事件處理方法。代表參數的名稱用於生成的方法。如果代表僅帶有參數類型而不帶名稱,則參數必須命名爲param1,param2等,這不會很有意義。這同樣適用於其他開發輔助工具,例如,當您編寫代碼調用委託時,智能感知會向您顯示委託參數的名稱。這比他們的類型更有用。