Istruzione Operator
Aggiornamento: novembre 2007
Consente di dichiarare il simbolo dell'operatore, gli operandi e il codice che definiscono una routine operatore su una classe o una struttura.
[ <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 operatore è dotata di un accesso Public (Visual Basic).Overloads
Facoltativo. Per informazioni, vedere Overloads.Shared
Obbligatorio. Indica che questa routine operatore è una routine Shared (Visual Basic).Shadows
Facoltativo. Per informazioni, vedere Shadows.Widening
Obbligatorio per un operatore di conversione a meno che non si specifichi Narrowing. Indica che questa routine operatore definisce una conversione Conversione verso un tipo di dati più grande. Vedere "Conversioni di ampliamento e restrizione" in questa pagina della Guida.Narrowing
Obbligatorio per un operatore di conversione a meno che non si specifichi Widening. Indica che questa routine operatore definisce una conversione Conversione verso un tipo di dati più piccolo. Vedere "Conversioni di ampliamento e restrizione" in questa pagina della Guida.operatorsymbol
Obbligatorio. Il simbolo o l'identificatore dell'operatore definito da questa routine operatore.operand1
Obbligatorio. Il nome e il tipo del singolo operando di un operatore unario (incluso un operatore di conversione) o l'operando di sinistra di un operatore binario.operand2
Obbligatorio per gli operatori binari. Il nome e il tipo dell'operando di destra di un operatore binario.operand1 e operand2 sono composti dalla sintassi e dalle parti elencate di seguito:
[ ByVal ] operandname [ As operandtype ]
Part
Descrizione
ByVal
Facoltativo, ma il meccanismo di passaggio deve essere ByVal.
operandname
Obbligatorio. Nome della variabile che rappresenta questo operando. Per informazioni, vedere Nomi di elementi dichiarati.
operandtype
Facoltativo a meno che Option Strict sia On. Tipo di dati di questo operando.
type
Facoltativo a meno che Option Strict sia On. Tipo di dati del valore restituito dalla routine operatore.statements
Facoltativo. Blocco di istruzioni eseguite dalla routine operatore.returnvalue
Obbligatorio. Il valore restituito dalla routine operatore al codice che effettua la chiamata.EndOperator
Obbligatorio. Termina la definizione di questa routine operatore.
Note
È possibile utilizzare Operator solo in una classe o struttura. In altre parole il contesto della dichiarazione di un operatore non può essere un file di origine, uno spazio dei nomi, un modulo, un'interfaccia, una routine o un blocco. Per ulteriori informazioni, vedere Contesti delle dichiarazioni e livelli di accesso predefinito.
Tutti gli operatori devono essere Public Shared. Non è possibile specificare ByRef, Optional o ParamArray per uno dei due operandi.
Non è possibile utilizzare il simbolo dell'operatore o l'identificatore per contenere un valore restituito. È necessario utilizzare l'istruzione Return ed è necessario che specifichi un valore. È possibile inserire un numero illimitato di istruzioni Return in qualsiasi punto di una routine.
La definizione di un'operatore in questo modo viene denominata overload dell'operatore, sia che si usi o meno la parola chiave Overloads. Nella tabella riportata di seguito vengono elencati gli operatori che è possibile definire.
Tipo |
Operatori |
---|---|
Unario |
+, -, IsFalse, IsTrue, Not |
Binary |
+, -, *, /, \, &, ^, >>, <<, =, <>, >, >=, <, <=, And, Like, Mod, Or, Xor |
Conversione (unario) |
CType |
Si noti che l'operatore = nell'elenco binario è l'operatore di confronto e non l'operatore di assegnazione.
Quando si definisce CType, è necessario specificare Widening o Narrowing.
Coppie associate
È necessario definire alcuni operatori come coppie associate. Se si definisce ciascun operatore di tale coppia, è necessario definire anche l'altro. Le coppie associate sono le seguenti:
= e <>
> e <
>= e <=
IsTrue e IsFalse
Limitazioni relative ai tipi di dati
È necessario che ogni operatore definito implichi la classe o la struttura nella quale la si definisce. In altre parole è necessario che la classe o la struttura venga specificata come tipo di dati di quanto segue:
L'operando di un operatore unario.
Almeno uno degli operandi di un operatore binario.
L'operando o il tipo restituito di un operatore di conversione.
Alcuni operatori hanno limitazioni relative ai tipi di dati, come illustrato di seguito:
Se si definiscono gli operatori IsTrue e IsFalsequesti devono restituire entrambi il tipo Boolean.
Se si definiscono gli operatori << e >> questi devono entrambi specificare il tipo Integer per il operandtype di operand2.
Non è necessario che il tipo restituito corrisponda al tipo dell'altro operando. Un operatore di confronto come = o <>, ad esempio, è in grado di restituire Boolean anche se nessuno dei due operandi è Boolean.
Operatori logici e bit per bit
In Visual Basic gli operatori And, Or, Not e Xor sono in grado di eseguire operazioni logiche o bit per bit. Tuttavia se si definisce uno di questi operatori su una classe o struttura, è possibile definire solo il suo funzionamento bit per bit.
Non è possibile definire l'operatore AndAlso direttamente con un'istruzione Operator. Tuttavia è possibile utilizzare AndAlso se si sono soddisfatte le condizioni seguenti:
È stato definito And sugli stessi tipi di operandi che si desidera utilizzare per AndAlso.
La definizione diAnd restituirà lo stesso tipo della classe o della struttura nella quale si è definita.
È stato definito l'operatore IsFalse nella classe o nella struttura nelle quali si è definito And.
Analogamente, è possibile utilizzare OrElse se si è definito Or sugli stessi operandi, con il tipo restituito della classe o struttura e si è definito IsTrue nella classe o struttura.
Conversioni di ampliamento e restrizione
Una conversione di ampliamento ha sempre esito positivo in fase di esecuzione, mentre una conversione di restrizione può non riuscire. Per ulteriori informazioni, vedere Conversioni di ampliamento e restrizione.
Se si dichiara che una routine di conversione sia di Widening, è necessario che il codice della routine non generi alcun errore. In altre parole:
Deve sempre restituire un valore valido del tipo type.
Deve gestire tutte le eccezioni possibili e le altre condizioni di errore.
Deve gestire qualsiasi errore restituito da qualsiasi routine da lei chiamata.
Se esiste anche solo una possibilità che la routine di conversione non abbia esito positivo, o che possa causare un'eccezione non gestita, è necessario dichiararla come Narrowing.
Esempio
Nel codice riportato di seguito viene utilizzata l'istruzioneOperator per definire la struttura che includa le routine dell'operatore per gli operatori And, Or, IsFalse e IsTrue. And e Or prendono entrambi due operandi di tipo abc e il tipo restituito abc. IsFalse e IsTrue prendono entrambi un operando singolo di tipo abc e restituisconoBoolean. Queste definizioni consentono al codice che effettua la chiamata di utilizzare 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
Vedere anche
Attività
Procedura: definire un operatore
Procedura: definire un operatore di conversione
Procedura: chiamare una routine con operatore
Procedura: utilizzare una classe che definisce gli operatori
Concetti
Conversioni di ampliamento e restrizione