Domanda

public void Finalise()
    ProcessFinalisation(true);
.

non si compila, ma la versione corretta:

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

Compila fine (ovviamente).

Se sono permesso se è senza staffe quando il seguente codice ha solo una riga:

if(true)
    CallMethod();
.

Perché è lo stesso non consentito per i metodi con una seguente riga?C'è una ragione tecnica?

È stato utile?

Soluzione

Dal momento che C # 6.0 puoi dichiarare:

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

e poi chiamalo come al solito:

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

Altri suggerimenti

La risposta ovvia è la specifica della lingua;Per il ragionamento ... Immagino principalmente semplicità - non valeva solo il sovraccarico di controllo sanitario, il controllo delle specifiche e il compilatore per il minuscolo minuscolo numero di metodi di istruzione singola.In particolare, posso potenzialmente vedere problemi con vincoli generici, ecc. (Cioè where T : IBlah, new() sulla fine della firma).

Si noti che non usare le parentesi graffe può a volte portare ad ambiguità, e in alcuni punti è accigliato.Sono un po 'più pragmatico di quello personalmente, ma ognuno al proprio.

Potrebbe anche essere di interesse che c # all'interno del rasoio non consente l'utilizzo senza bretelle esplicite.Attualmente (cioè anche per if ecc.).

Marc è fondamentalmente giusto. Per espandere la sua risposta un po ': ci sono un certo numero di posti in cui c # richiede un blocco di dichiarazioni preparato piuttosto che permettere una dichiarazione "nuda". Sono:

    .
  • Il corpo di un metodo, costruttore, distruttore, accessori immobiliari, accessori per eventi o accessori indicizzatore.
  • Il blocco di una prova, cattura, infine, controllata, deselezionata o regione non sicura.
  • Il blocco di una dichiarazione lambda o metodo anonimo
  • Il blocco di un'istruzione IF o Loop se il blocco contiene direttamente una dichiarazione variabile locale. (Cioè, "while (x!= 10) int y= 123;" è illegale, devi preparare la dichiarazione.)

    In ciascuno di questi casi sarebbe possibile trovare una grammatica non ambigua (o euristica per disambiguare una grammatica ambigua) per la funzione in cui una singola affermazione non intrausti è legale. Ma quale sarebbe il punto? In ciascuna di queste situazioni si aspetta di vedere più dichiarazioni; Le singole affermazioni sono il caso raro e improbabile. Sembra che non sia davvero valsa la pena di rendere la grammatica non ambigua per questi casi molto improbabili.

Risposta breve: C # è in stile dopo c, e c mandare che le funzioni vengono prelevate a causa di come le dichiarazioni della funzione C utilizzate per essere.

Versione lunga con cronologia: Indietro in K & R C, le funzioni sono state dichiarate in questo modo:

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

Certo che non avresti potuto avere funzioni nonbraced in tale disposizione.ANSI C ha mandato la sintassi che tutti conosciamo e amiamo:

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

Ma non ha permesso funzioni nonbracciate, perché causerebbero caoc con compilatori più anziani che conoscevano solo la sintassi K & R che [e il supporto per le dichiarazioni K & R è stato ancora richiesto].

Il tempo è andato avanti, e anni dopo C # è stato progettato intorno a C [o C ++, la stessa differenza in termini di sintassi] e, poiché c non ha permesso funzioni nonbracciate, né c #.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top