Funzioni i cui parametri sono forniti in modo implicito

5

Le funzioni di callback sono in grado di accettare alcuni parametri, ma non vengono dichiarate esplicitamente quando si chiama la funzione.

Come funziona davvero? Che cosa sta succedendo ci consente di passare una funzione come parametro a un'altra funzione e includere implicitamente un parametro in questo?

Ad esempio:

JavaScript

$.get('somefile.php', {func : 'getUserNames'}).done(function(data){
    if(data)
       console.log(data); // '{"0" : "billy", "1" : "bobby"}'
    // This is a js ajax call to a php file. 
    // How exactly am I retrieving "data" ?
}, 'json');

C #

private void BeginReadingData(){
    NetworkStream stream = tcpClient.GetStream();
    stream.BeginRead(buffer, 0, bufferSize, MyCallBack, tcpClient);
}

private void MyCallBack(IAsyncResult ar){
    // Now I can operate on 'ar'
    // why and how? 
}

Questo è qualcosa che capisco come usare, ma non come spiegare o descrivere correttamente il processo.

    
posta BarryBones41 11.08.2015 - 16:05
fonte

3 risposte

4

What do you call a callback function that accepts some parameters, but they are not explicitly declared when calling the function?

Non sono sicuro. In alcuni casi, si può considerare che il metodo di un oggetto abbia l'oggetto stesso come parametro implicito.

Ma non ci sono chiamate di funzione con parametri impliciti nei tuoi esempi. Con un callback, non si passa il risultato di chiamare la funzione, si passa la funzione stessa.

stream.BeginRead(buffer, 0, bufferSize,
    MyCallBack, /* <- Not a function call, just a reference to a function. */
    tcpClient);

La funzione che hai dato al callback, in questi casi $.get e stream.BeginRead chiamerà la funzione di callback che le hai assegnata e fornirà esplicitamente i parametri che dovrebbe assumere.

Quindi quello che ti manca qui è la definizione di stream.BeginRead che ha qualcosa del tipo:

public virtual ISyncResult BeginRead(
        byte[] buffer,
        int offset,
        int count,
        AsyncCallback callback,
        Object state
    ) {
    /* stuff */

    callback(ar); /* <-- called with explicit parameter */

    /* more stuff */
}
    
risposta data 11.08.2015 - 16:30
fonte
2

What do you call a callback function that accepts some parameters, but they are not explicitly declared when calling the function?

Non sono sicuro di cosa stai parlando.

function(data) esplicitamente dichiara un parametro denominato data per la funzione anonima.

private void MyCallBack(IAsyncResult ar) esplicitamente dichiara un parametro denominato ar con il tipo IAsyncResult per la funzione denominata MyCallback .

Entrambi rendono l'identificatore disponibile per il corpo della funzione e il compilatore / interprete sa tradurre la risoluzione dell'identificatore in "accesso al primo argomento di questa funzione".

    
risposta data 11.08.2015 - 16:24
fonte
0

In C #, i callback sono semplici delegati. I delegati avvolgono il metodo di callback all'interno di un oggetto e quell'oggetto viene passato come parametro. Quindi, ogni volta che si passa ad una funzione di callback, si dice un gestore di eventi, quel gestore di eventi è avvolto in un oggetto delegato. Ora, quando arriva il momento giusto di invocazione, l'elemento corrispondente, nel tuo esempio, l'oggetto 'NetworkStream' controlla se una callback è registrata. Se trovato (nel tuo caso - "MyCallback" è registrato), richiama quindi la richiamata registrata.

In JavaScript, in base alla progettazione, i metodi non sono altro che gli oggetti stessi. così, ogni volta che si passa una funzione di callback, si passa un oggetto. Come JavaScript si compila, non controlla la firma del callback che stai passando. Se ha la firma appropriata (ad es. Con il numero corretto di parametri) il callback riceverà tutti i valori, se la firma non corrisponde, la callback salterà i valori dei risultati.

    
risposta data 12.08.2015 - 14:57
fonte

Leggi altre domande sui tag