Utilizzo di ref anziché out. Sarebbe considerato un bug?

3

Dato che i parametri out e ref hanno lievi connotazioni diverse, scrivere codice come sotto può essere considerato un bug (anche se al momento non causa problemi) o solo una mancanza di comprensione sui parametri ref e out?

public void MyMethod() 
{
    int myInt = 0;
    MyMethodWithRef(ref myInt);
}

public void MyMethodWithRef(ref myInt)
{
    // not used before being assigned a value.  Does an out parameter make more sense then  
    myInt = 5;
}

Capisco che questo sia l'uso scorretto di ref ma se lo vedessi costantemente in codice o anche solo una volta lo considererai un bug e quindi lo aggiusterai e informerà il coder originale o lo farai semplicemente come parte del refactoring generale pratiche?

    
posta dreza 25.01.2013 - 02:02
fonte

4 risposte

6

Non è un bug in quanto il compilatore non lo contrassegnerà e, dato il code base esistente, non causerà una differenza di comportamento.

È un problema che verrebbe sollevato in una revisione del codice o in un'intervista - è impreciso, fa chiedere al prossimo programmatore "perché", che se non è un peccato mortale è almeno un peccato veniale. E 'rimasto da un riutilizzo del codice copia / incolla, una funzionalità metà implementata, parte di una correzione di bug incompleta - in che modo, passando da out a ref o viceversa, è necessario e io non vedo è un terribile errore di qualcuno che non lo sa e non lo vedo ...

Anche se in genere approvo ulteriori restrizioni, non sono convinto che in pratica questa sia una sintassi utile - detto, il linguaggio fa la distinzione, e c'è un costo per non seguire le convenzioni. Non in termini di prestazioni o dimensioni, ma in termini di leggibilità e manutenibilità.

    
risposta data 25.01.2013 - 04:23
fonte
10

Dalla documentazione C #.

An argument that is passed to a ref parameter must be initialized before it is passed. This differs from out parameters, whose arguments do not have to be explicitly initialized before they are passed

The out keyword causes arguments to be passed by reference. This is similar to the ref keyword, except that ref requires that the variable be initialized before being passed.

The ref and out keywords are treated differently at run-time, but they are treated the same at compile time.

Penso che lo spieghi bene.

Se hai bisogno del metodo per passare un valore, utilizza ref . Se hai bisogno del metodo per generare solo un valore, utilizza out . Non dovresti utilizzare out se prevedi che il parametro del metodo contenga già un valore.

Il tuo esempio non è un bug, perché il compilatore impone questa restrizione. Un ref può generare un risultato. Questo non è un requisito. Il requisito è che sia stato inizializzato.

Sarebbe un bug se ti aspettavi che out contenga già un valore.

    
risposta data 25.01.2013 - 02:46
fonte
3

Sì, un fuori ha più senso in quel caso. Sarà più leggibile per quanto riguarda l'intento.

    
risposta data 25.01.2013 - 02:35
fonte
3

Nel tuo esempio, cambierei il tuo tipo di ritorno da void a int , dichiarare myInt local al metodo, quindi return alla fine.

    
risposta data 25.01.2013 - 03:33
fonte

Leggi altre domande sui tag