2013-05-03 15 views
5

Ho un metodo che verifica la validità di un oggetto rispetto al mio programma (qualche algoritmo). L'oggetto viene creato (analizzato) da una stringa che viene passata inPassare in un oggetto come parametro esterno

La logica è:.

bool isValid(String str, out Object obj) 
    { 
     obj = null; 
     obj = new Object(str); //Validation happens during the object creating 
     if(obj.Legit) //Don't mind this line :) 
      return true; 
     return false; 
    } 

e chiamo questa convalida da un'altra classe, che se questo convalida non riesce, fa una convalida diversa (stesso metodo)

void FindingObjectType(String str) 
{ 
     if(isValid(str, out ??????) 
      //process 
} 

Quindi invece di ?????, non so come passare l'oggetto.

Ho solo 1 costruttore, Object (String).

+1

_bool_ isValid? –

+1

Nice catch =) Editato. – Alexey

+0

Si noti che questo non è un nome proprio. 'isValid' suggerisce un metodo di prova/controllo ma crea anche qualcosa. Chiamalo invece 'TryParse'. –

risposta

8

Questo documento MSDN descrive la parola "fuori":
http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx

Prima di chiamare il metodo isValid(), è necessario dichiarare l'oggetto di output:

void FindingObjectType(String str) 
{ 
    Object obj; 
    if(isValid(str, out obj) 
     //process 
} 
+1

C'è un modo per dichiararlo all'interno del parametro? O è l'unico modo? – Alexey

+1

Non credo che ci sia un modo per farlo. C# è una lingua che richiede la dichiarazione prima dell'assegnazione. – nic

3

Hai solo bisogno di dichiarare un oggetto. Il codice seguente funzionerà per te.

void FindingObjectType(String str) 
{ 
     Object obj; 
     if(isValid(str, out obj) 
      //process 
} 
+0

Il codice funzionerà ma non crea _istanza_. Dichiara solo una variabile di riferimento. –

+0

@HenkHolterman l'istanza viene creata all'interno del metodo IsValid. – Alexey

+0

Anche se l'istanza viene creata all'interno del metodo isValid, il testo è stato rivisto per eliminare la confusione. – Vinay

7

Come detto nic, in genere si potrebbe dire:

void FindingObjectType(String str) 
{ 
    object obj; 
    if(isValid(str, out obj) 
    { 
     // process valid obj 
    } 
} 

Questo è perfettamente accettabile. Tuttavia, ci sono altri modi si potrebbe fare questo che sono forse meglio:

Thing GetThing(String str) 
{ 
    Thing thing = new Thing(str); 
    if(thing.Legit) 
     return thing; 
    return null; 
} 

void FindingObjectType(String str) 
{ 
    Thing thing = GetThing(); 
    if(thing != null) 
     //process 
} 

Ecco un altro:

Thing GetThing(String str) 
{ 
    // Make a static method that tests the string. 
    if (Thing.IsLegit(str)) 
     return new Thing(str); 
    return null; 
} 

void FindingObjectType(String str) 
{ 
    Thing thing = GetThing(); 
    if(thing != null) 
     //process 
} 

Naturalmente, se avete intenzione di farlo allora perché avete bisogno di GetThing? Basta dire:

void FindingObjectType(String str) 
{ 
    if (Thing.IsLegit(str)) 
    { 
     Thing thing = new Thing(str); 
     //process 
    } 
} 

Questo ultimo schema è probabilmente il migliore. Si desidera separare i propri dubbi. Se si dispone di un parametro out, solitamente si tratta del metodo , il metodo sta tentando di fare troppe cose.

+0

Il tuo punto sembra chiaro, ma per curiosità, non sei un tipo "TryParse"? –

+0

Un'altra opzione è solo per chiamare un costruttore e rilevare le eccezioni che genera. – nic

+1

@nic: Quindi devi chiedere se l'eccezione è veramente * eccezionale *.Se non è eccezionale, non fare in modo che il chiamante gestisca un'eccezione; dare sempre al chiamante un modo per evitare l'eccezione. –

Problemi correlati