Istruzione Operator
Dichiara il simbolo dell'operatore, gli operandi e il codice che definiscono una routine di operatore in una classe o una struttura.
Sintassi
[ <attrlist> ] Public [ Overloads ] Shared [ Shadows ] [ Widening | Narrowing ]
Operator operatorsymbol ( operand1 [, operand2 ]) [ As [ <attrlist> ] type ]
[ statements ]
[ statements ]
Return returnvalue
[ statements ]
End Operator
Parti
attrlist
Facoltativo. Vedere Elenco degli attributi.
Public
Obbligatorio. Indica che questa routine dell'operatore ha accesso pubblico.
Overloads
Facoltativo. Vedere Overload.
Shared
Obbligatorio. Indica che questa routine dell'operatore è una routine Shared.
Shadows
Facoltativo. Vedere Shadows.
Widening
Obbligatorio per un operatore di conversione a meno che non si specifichi Narrowing
. Indica che questa routine dell'operatore definisce una conversione Widening. Vedere "Conversioni verso l'estensione e la riduzione" in questa pagina della Guida.
Narrowing
Obbligatorio per un operatore di conversione a meno che non si specifichi Widening
. Indica che questa routine dell'operatore definisce una conversione Narrowing. Vedere "Conversioni verso l'estensione e la riduzione" in questa pagina della Guida.
operatorsymbol
Obbligatorio. Simbolo o identificatore dell'operatore definito da questa routine operatore.
operand1
Obbligatorio. Nome e tipo del singolo operando di un operatore unario (incluso un operatore di conversione) o l'operando sinistro di un operatore binario.
operand2
Obbligatorio per gli operatori binari. Nome e tipo dell'operando destro di un operatore binario.
operand1
e operand2
hanno la sintassi e le parti seguenti:
[ ByVal ] operandname [ As operandtype ]
In parte | Descrizione |
---|---|
ByVal |
Facoltativo, ma il meccanismo di passaggio deve essere ByVal. |
operandname |
Obbligatorio. Nome della variabile che rappresenta questo operando. Vedere Declared Element Names. |
operandtype |
Facoltativo, a meno che Option Strict non sia On . Tipo di dati di questo operando. |
type
Facoltativo, a meno che Option Strict
non sia On
. Tipo di dati del valore restituito dalla routine dell'operatore.
statements
Facoltativo. Blocco di istruzioni eseguite dalla routine dell'operatore.
returnvalue
Obbligatorio. Valore restituito dalla routine dell'operatore al codice chiamante.
End
Operator
Obbligatorio. Termina la definizione di questa routine dell'operatore.
Osservazioni:
È possibile usare Operator
solo in una classe o in una struttura. Ciò significa che il contesto di dichiarazione per un operatore non può essere un file di origine, uno spazio dei nomi, un modulo, un'interfaccia, una routine o un blocco. Per altre informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefiniti.
Tutti gli operatori devono essere Public Shared
. Non è possibile specificare ByRef
, Optional
o ParamArray
per uno degli operandi.
Non è possibile utilizzare il simbolo o l'identificatore dell'operatore per contenere un valore restituito. È necessario usare l'istruzione Return
e specificare un valore. Qualsiasi numero di istruzioni Return
può essere visualizzato in qualsiasi punto della procedura.
La definizione di un operatore in questo modo viene chiamata overload dell'operatore, indipendentemente dal fatto che si usi o meno la parola chiave Overloads
. La tabella seguente elenca gli operatori che è possibile definire.
Type | Operatori |
---|---|
Unario | + , - , IsFalse , IsTrue , Not |
Binario | + , - , * , / , \ , & , ^ , >> , << , = , <> , > , >= , < , <= , And , Like , Mod , Or , Xor |
Conversione (unario) | CType |
Si noti che l'operatore =
nell'elenco binario è l'operatore di confronto, non l'operatore di assegnazione.
Quando si definisce CType
, è necessario specificare Widening
o Narrowing
.
Coppie abbinate
È necessario definire determinati operatori come coppie abbinate. Se si definisce un operatore di tale coppia, è necessario definire anche l'altro. Le coppie abbinate sono le seguenti:
=
e<>
>
e<
>=
e<=
IsTrue
eIsFalse
Restrizioni relative ai tipi di dati
Ogni operatore definito deve coinvolgere la classe o la struttura in cui viene definita. Ciò significa che la classe o la struttura deve essere visualizzata come tipo di dati degli elementi seguenti:
Operando di un operatore unario.
Almeno uno degli operandi di un operatore binario.
Operando o il tipo restituito di un operatore di conversione.
Alcuni operatori hanno restrizioni aggiuntive sui tipi di dati, come indicato di seguito:
Se si definiscono gli operatori
IsTrue
eIsFalse
, devono restituire entrambi il tipoBoolean
.Se si definiscono gli operatori
<<
e>>
, entrambi devono specificare il tipoInteger
peroperandtype
dioperand2
.
Il tipo restituito non deve corrispondere al tipo di operando. Ad esempio, un operatore di confronto come =
o <>
può restituire Boolean
anche se nessuno degli operandi è Boolean
.
Operatori logici e bit per bit
Gli operatori And
, Or
, Not
e Xor
possono eseguire operazioni logiche o bit per bit in Visual Basic. Tuttavia, se si definisce uno di questi operatori su una classe o una struttura, è possibile definire solo l'operazione bit per bit.
Non è possibile definire l'operatore AndAlso
direttamente con un'istruzione Operator
. Tuttavia, è possibile usare AndAlso
se sono state soddisfatte le condizioni seguenti:
Si è definito
And
sugli stessi tipi di operando da usare perAndAlso
.La definizione di
And
restituisce lo stesso tipo della classe o della struttura in cui è stato definito.L'operatore
IsFalse
è stato definito nella classe o nella struttura in cui è stato definitoAnd
.
Analogamente, è possibile usare OrElse
se è stato definito Or
negli stessi operandi, con il tipo restituito della classe o della struttura, ed è stato definito IsTrue
nella classe o nella struttura.
Widening and Narrowing Conversions
Una conversione che supporta un maggior numero di dati ha sempre esito positivo in fase di esecuzione, mentre una conversione che supporta un minor numero di dati può avere esito negativo in fase di esecuzione. Per altre informazioni, vedere Widening and Narrowing Conversions.
Se si dichiara una routine di conversione come Widening
, il codice della routine non deve generare errori. Ciò comporta quanto segue:
Deve restituire sempre un valore valido di tipo
type
.Deve gestire tutte le possibili eccezioni e altre condizioni di errore.
Deve gestire qualsiasi errore restituito da qualsiasi routine che chiama.
Se è possibile che una routine di conversione non riesca o che possa causare un'eccezione non gestita, è necessario dichiararla come Narrowing
.
Esempio
Nell'esempio di codice seguente viene utilizzata l'istruzione Operator
per definire il contorno di una struttura che include procedure di operatore per gli operatori And
, Or
, IsFalse
e IsTrue
. And
e Or
accettano ognuno due operandi di tipo abc
e tipo restituito abc
. IsFalse
e IsTrue
accettano ognuno un singolo operando di tipo abc
e restituiscono Boolean
. Queste definizioni consentono al codice chiamante di usare And
, AndAlso
Or
e OrElse
con operandi di tipo abc
.
Public Structure abc
Dim d As Date
Public Shared Operator And(ByVal x As abc, ByVal y As abc) As abc
Dim r As New abc
' Insert code to calculate And of x and y.
Return r
End Operator
Public Shared Operator Or(ByVal x As abc, ByVal y As abc) As abc
Dim r As New abc
' Insert code to calculate Or of x and y.
Return r
End Operator
Public Shared Operator IsFalse(ByVal z As abc) As Boolean
Dim b As Boolean
' Insert code to calculate IsFalse of z.
Return b
End Operator
Public Shared Operator IsTrue(ByVal z As abc) As Boolean
Dim b As Boolean
' Insert code to calculate IsTrue of z.
Return b
End Operator
End Structure