2011-05-16 55 views
8
public void Finalise() 
    ProcessFinalisation(true); 

沒有編制,但正確的版本:爲什麼只有一個語句的方法需要大括號?

public void Finalise() 
{ 
    ProcessFinalisation(true); 
} 

編譯罰款(當然)。

如果允許我如果的不帶括號時,下面的代碼只有一行:

if(true) 
    CallMethod(); 

爲什麼同樣不允許用一個下面這行的方法呢?有技術原因嗎?

+1

我相信,沒有括號是防止建議如果,但有歷史的原因。目前我似乎無法找到我的消息來源,但也許有人可以證實這一點? – Bazzz 2011-05-16 11:29:29

+0

「if」是一個語句,該規則僅用於語句。方法是類的成員。 – 2011-05-16 11:30:02

+0

你將不得不回到1970年代找到答案。這來自C. – 2011-05-16 11:30:52

回答

2

由於C#6.0,你可以聲明:

void WriteToConsole(string word) => Console.WriteLine(word) 

然後調用它像往常一樣:

public static void Main() 
{ 
    var word = "Hello World!"; 
    WriteToConsole(word); 
} 
14

顯而易見的答案是語言規範;推理......我想主要是簡單 - 它只是不值得的理智開銷 - 檢查規範和編譯器的單聲明方法的數量很小的微小的。特別是,我可能會看到通用約束條件等問題(即簽名末尾的where T : IBlah, new())。

請注意,不使用大括號有時會導致含糊不清,並且在某些地方令人不悅。我個人比實際更務實一些,但各自爲政。

這也可能是感興趣的是C#裏面剃刀不允許使用沒有明確的大括號。完全不用(即使對於if等)。

+0

感謝marc,你有沒有使用大括號會導致歧義的例子? – 2011-05-16 11:32:38

+3

@Tom - 我的意思是*維護*不明確性 - 經典示例是在相同的縮進處添加第二條語句,而不是注意到丟失的大括號。 – 2011-05-16 11:33:24

+0

啊感謝你了! – 2011-05-16 11:34:08

11

Marc基本上是對的。爲了擴展他的答案,有一些地方C#需要一個支撐的語句塊,而不是允許一個「裸」的語句。它們是:

  • 方法,構造函數,析構函數,屬性訪問器,事件訪問器或索引器訪問器的主體。
  • 嘗試,抓住,最後,檢查,未檢查或不安全區域的塊。
  • 聲明lambda或匿名方法的塊
  • if或loop語句的塊如果塊直接包含局部變量聲明。 (也就是說,「while(x!= 10)int y = 123;」是非法的;您必須遵守聲明。)

在上述每種情況下,都有可能提出一個明確的語法(或用於歧義歧義語法的啓發式語法),其中單個無限制語句是合法的。但是,這有什麼意義呢?在所有這些情況下,您都希望看到多種表述;單一的陳述是罕見的,不太可能的情況。似乎並不值得讓語法在這些不太可能的情況下明確表達出來。

+0

「語句lambda的塊」 - 是不是有點重複,因爲語句lambda是一個帶括號的? – configurator 2011-05-19 01:59:12

+1

@configurator:當然,但那是因爲我們決定如此。如果我們想要的話,lambda表達式可以是lambda表達式,其中任何語句都在=>後面。說它必須是一個塊才容易。 「action = x => foreach(x中的var y)Console.WriteLine(y);」如果我們想出解析它的規則,可能會成爲法律聲明lambda。 – 2011-05-19 06:37:43

1

簡短的回答:C語言是在C語言後面設計的,C語言規定由於C函數聲明過去是如何支持的。

龍版採用的歷史:早以K & R C,功能進行了聲明如下:

int function(arg1, arg2) 
int arg1; 
int arg2; 
{ code } 

當然你不能在這一安排無支撐功能。ANSI C規定的語法,我們都知道,愛:

int function(int arg1, int arg2) 
{ code } 

,但並沒有讓無支撐的功能,因爲它們會引起嚴重破壞舊的編譯器只知道在K & [R聲明ķ& [R語法[和支持是仍然需要]。時間繼續延續,並且多年後C#被設計爲圍繞C [或C++,在語法方面有相同的區別],並且由於C不允許無支撐函數,因此C#也不是。

相關問題