2013-04-02 21 views
6

In C# è convenzionale per scrivere in modo abbastanza obiettivo, in questo modo:C#: come funzionano le chiamate con funzione sequenziale? (Efficienza-saggio)

MyObj obj = new MyObj(); 
MyReturn ret = obj.DoSomething(); 
AnotherReturn rett = ret.DoSomethingElse(); 

ho potuto solo scrivere quanto sopra come questo:

AnotherReturn rett = new MyObj().DoSomething().DoSomethingElse(); 

Tuttavia, come fa il lo stackframe funziona quando hai un sacco di chiamate di funzione in una sequenza come questa? L'esempio è abbastanza semplice, ma immaginate di avere più di 50 chiamate di funzione concatenate (questo può accadere in JavaScript (/ w jQuery)).

La mia ipotesi era che, per ogni chiamata di funzione, viene effettuato un indirizzo di ritorno (al "punto"?) E il valore di ritorno (un nuovo oggetto con altri metodi) viene quindi immediatamente immesso nella successiva chiamata di funzione in quel indirizzo di ritorno. Come funziona questo w.r.t. raggiungere il valore di ritorno generale (in questo esempio l'indirizzo di ritorno assegnerà il valore della funzione finale a rett)? Se continuassi a incatenare le chiamate, alla fine potrei traboccare? In tal caso, è considerato più saggio prendere la rotta obiettiva (al costo di un "inutile" incarico di memoria?).

+0

Si potrebbe, ma non ti ringrazio per il debug esso! –

+0

Hah sì, sto chiedendo solo perché mi sono divertito un po 'con il mio jQuery e non è insolito per me non assegnare nessuna variabile in funzioni abbastanza grandi. per esempio. function doSomething() {return (someReturnCode.somethingElse(). andSoOn); } –

+1

Tuttavia, qualcosa come StringBuilder viene spesso utilizzato (poiché fornisce un'interfaccia fluida). Inoltre, le classi di builder per tipi immutabili utilizzano spesso questo tipo di interfaccia fluente. –

risposta

2

È esattamente lo stesso come se si chiamasse ciascun metodo su una riga separata, assegnando il valore restituito a una variabile ogni volta e quindi utilizzando tale variabile per chiamare il metodo successivo.

Quindi i tuoi due campioni sono uguali, in modo efficace.

Avete un riflettore? Potresti provare i due metodi e ispezionare il codice IL generato per vedere esattamente quali differenze ci sono.

+0

Ehi, grazie mille per questa risposta. Ho provato a cercare le guide dello stack frame ma molto non ha indirizzato direttamente questa roba (o lo ha fatto ad un livello troppo alto). –

0

Anche se le 2 chiamate sono uguali ma se si hanno molti "Punti" allora da qualche parte si tratta di un odore di codice (Legge di Demetra).

Vedere sotto discussion

+0

Non è * un * odore di codice se si utilizza un'interfaccia fluida. http://en.wikipedia.org/wiki/Fluent_interface –

+0

Ah, non ho mai sentito parlare di un'interfaccia fluente, ma mi trovo a progettare classi per adattarne una (in modo sconosciuto). per esempio. MyClass Append (oggetto AnItem) {data.Add (elemento); restituiscilo; } –

Problemi correlati