Domanda

Guardando un sacco di post / articoli sull'utilizzo di IIF (). Tutto ciò è iniziato quando ho provato a usare IIF () come un operatore condizionale molto in caso di c / c # / c ++ ecc.

Cosa ho provato a fare esattamente era esattamente nelle linee di questo del seguente post:

Usando vb.net IIF I Ottenere NullReferenceException Tuttavia, la soluzione che avevo implementato è stata presa in prestito dal seguente sito MSDN:

http://msdn.microsoft .com / en-noi / libreria / 27ydhh0d% 28v= vs.80% 29.aspx

è solo dopo aver imparato il metodo IF () in VB.NET.

Così alla fine avevo scritto una funzione che restituisse il valore appropriato (che ha utilizzato la riflessione) per raggiungere lo scopo. Ma quel metodo (che ho scritto) non ha gettato alcuna eccezione. In effetti sono stato in grado di controllare la nullabilità del tipo all'interno della funzione.

Function ReturnValue(ByVal MyType As SomeType, ByVal PropertyName as String) As Object
    If MyType Is Nothing Then Return String.Empty
    Dim arrPropInfo As PropertyInfo() = MyType.GetType().GetProperties()
    Return arrPropInfo.Where(Function(x) x.Name = PropertyName).Item(0).GetValue(MyType, Nothing)
End Function
.

La mia domanda è, c'è qualcosa scritto all'interno di IIF () per lanciare un errore del genere? - A NullReferenceException

If MyType Is Nothing Then Throw New NullReferenceException()
.

O c'è qualcosa di molto più grande al lavoro qui? Quindi supporti se volevo scrivere funzione come IIF, che avrà un errore se qualcosa nell'elenco degli argomenti è null è il modo in cui sopra l'unico modo per farlo?

È stato utile?

Soluzione

La distinzione è che ?: e If() sono operatori . IIf() non è un operatore; È una semplice vecchia funzione. Puoi persino implementarlo da solo:

Public Shared Function IIf(ByVal Expression As Boolean, ByVal TruePart As Object, ByVal FalsePart As Object) As Object
    If Expression Then Return TruePart Else Return FalsePart
End Function
.

Ciò significa che tutti gli argomenti passati alla funzione devono essere valutati prima la funzione è chiamata, proprio come qualsiasi altra funzione. Non c'è nulla all'interno di IIF () che lancia un'eccezione - è solo il normale processo di valutazione degli argomenti passati a una funzione.

Hai inoltre bisogno di notare che è perfettamente ok passare null / nulla a una funzione. Hai visto l'eccezione nel tuo codice perché l'espressione che stavi passando avevi un riferimento nullo che non poteva essere valutato - Dì, se hai fatto qualcosa di simile a utilizzare la proprietà .length di una variabile di stringa null.

L'operatore IF (), d'altra parte, dall'altra parte, non ha questo problema perché è proprio questo: un operatore inoltre, è un operatore che sfrutta la valutazione del cortocircuito, tale che solo l'espressione restituita deve essere valutato. IF () ha anche il bello vantaggio di essere al sicuro, anche se è possibile replicare anche la sicurezza di tipo in una funzione IIF generica (della T) (), se volevi.

Altri suggerimenti

IIF differisce da C ++ :?In almeno un modo significativo, valuta sempre entrambe le espressioni in modo da non poter fare cose come IIF(X is nothing,DefaultValue,X.Value).Getterà un'eccezione di riferimento nullo perché nel caso x non è nulla, valuterà ancora x.value.

IIF funziona come fa perché è una funzione, non un operatore

Non hai fornito il codice per come stavi usando IIF, quindi sto solo indovinando.Quello che ho appena detto è il primo commento del link che hai fornito a MSDN quindi è probabile che tu sappia già questo o questa non è la tua domanda.

Se la tua domanda è davvero che vuoi lanciare un'eccezione, dovresti usare il codice che hai sopra, ma lanciare e Argumentnullexception invece in modo da poter specificare quale argomento era null.

È possibile aggiungere un argomento extra byref per indicare se in effetti è stata verificata un'eccezione nella funzione.In questo modo possiamo eliminare la necessità di catturare qualsiasi eccezione sollevata nella funzione.Naturalmente, devi aggiungere provare ... dichiarazione di cattura in quella funzione.

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