Newsgroup: it.comp.lang.visual-basic
Titolo: Variabili Boolean

Scusate la domanda da 1a elementare, ma quando si utilizzano variabili
boolean:
    Dim Ok as Boolean
č meglio questa sintassi:
    If Ok Then ...
o questa:
    If Ok = True Then ...
So che il risultato č lo stesso ma qual'č la forma piů corretta (o piů
usata) ?

 usata) ?
E' tutt'altro che una domanda elementare.
L'argomento ogni volta mi trova dibattuto.
Io, personalmente, prediligo di gran lunga la leggibilità del codice alle
performance, salvo casi in cui il millisecondo fa la differenza.
Per cui, quanto a leggibilità, sicuramente preferisco [if Ok=True Then]. In
modo particolare nel caso del false, dove dovrei usare [If Not(Ok) Then]
anzichè un ben più leggibile [If Ok=False Then].
Tuttavia, a livello di performance è leggermente meglio la versione [If Ok
Then], per cui preferisco questa nei casi in cui devo eseguire loop
velocissimi con molti test delle variabili.
Ciao
Alberto

 
Rispondo come Albe:
If Ok Then è leggermente più performate (in VB.net non vi è differenza) 
poichè quel furbone di VB6 nel caso di If Ok = True Then valuta ogni 
volta anche True.
Per quanto riguarda la leggibilità, importantissima, personalmente 
ritengo molto più leggibile
Dim IsEqual As Boolean
IsEqual = (strLettera = "A")
If IsEqual Then
piuttosto che
If IsEqual = True Then ' Ridondante
Così come preferisco
If Not IsEqual Then
piuttosto che
If IsEqual = False Then
Mi sembra di dire "è falso che i valori sono uguali".
Trovo più fluido "i valori non sono uguali"
Ciao
-- 
E' falso che tu tu non pensi che tutto questo non sia corretto?
Trova la forma più snella per questa affermazione :)

 valuta ogni volta anche True.
Io credevo fosse per un CBool implicito in piů.
Cioč:
If Ok=True Then
viene elaborato come
If CBool(Ok=True) Then
In sostanza, dopo If, VB vuole necessariamente un booleano. Se trova una
espressione, la valuta e poi genera una sorta di variabile temporanea
booleana che viene valutata dall'If. Fa di fatto ciň che fai tu con il tuo
IsEqual.
mentre:
If Ok Then
viene elaborato com'č, in quanto Ok č giŕ booleana.
La tua interpretazione (su cui rifletterň), č invece che avvenga una cosa
del tipo:
If Ok=CBool(True) Then
Possibile, ma mi sembra talmente sciocco, che non voglio credere sia cosě.
Ciao
Alberto

 Fa di fatto ciň che fai tu con il tuo IsEqual.
Che cacofonia...
Almeno due virgole potevo metterle...
"Tina, ta te tňta tinta un tac!"
"Te cat tac i tac, m'tac't un tac?"
"Me ca tac un tac a tč?
Tac'tel te l tň tac, tň!"

 Io credevo fosse per un CBool implicito in più.
vorrei segnalare anche questa differenza:
se ok non è booleano, ma ad esempio integer, if ok = true funziona solo se
ok è = -1, mentre se facciamo if ok funziona per tutti i valori diversi da 0
-- 
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 valori diversi da 0
Allora ha ragione Zanna.
C'è un cast implicito del secondo elemento del confronto verso il tipo del
primo elemento.
Nel caso del
If Ok=True Then
con OK di tipo Integer, avviene:
If Ok=CInt(True) Then
Ciao
Alberto

volta anche True.
Possiamo confermare la tua affermazione, disassemblando un codice di
prova, che confronta usando True prima, dopo oppure senza, e con e
senza parentesi.
--- D:\Test\boolean\Module1.bas
-------------------------------------------------------------------------------------------
1:    Attribute VB_Name = "Module1"
2:    Option Explicit
3:
4:    Sub Main()
00401554   push        ebp
00401555   mov         ebp,esp
00401557   push        8
00401559   pop         eax
0040155A   call        VB@TEXT (00401090)
5:        Dim flag As Boolean
6:        Dim dummy As Integer
7:
8:        dummy = 0
0040155F   and         word ptr [dummy],0
9:        If (flag = True) Then
00401564   cmp         word ptr [flag],0FFFFh
00401569   jne         Module1::Main+1Dh (00401571)
10:           dummy = 1
0040156B   mov         word ptr [dummy],offset Module1::Main+1Bh
(0040156f)
11:       End If
12:
13:       If (flag) Then
00401571   movsx       eax,word ptr [flag]
00401575   test        eax,eax
00401577   je          Module1::Main+2Bh (0040157f)
14:           dummy = 2
00401579   mov         word ptr [dummy],offset Module1::Main+29h
(0040157d)
15:       End If
16:
17:       If flag Then
0040157F   movsx       eax,word ptr [flag]
00401583   test        eax,eax
00401585   je          Module1::Main+39h (0040158d)
18:           dummy = 3
00401587   mov         word ptr [dummy],offset Module1::Main+37h
(0040158b)
19:       End If
20:
21:       If flag = True Then
0040158D   cmp         word ptr [flag],0FFFFh
00401592   jne         Module1::Main+46h (0040159a)
22:           dummy = 4
00401594   mov         word ptr [dummy],offset Module1::Main+44h
(00401598)
23:       End If
24:
25:       If (True = flag) Then
0040159A   cmp         word ptr [flag],0FFFFh
0040159F   jne         Module1::Main+53h (004015a7)
26:           dummy = 5
004015A1   mov         word ptr [dummy],offset Module1::Main+51h
(004015a5)
27:       End If
28:
29:       If True = flag Then
004015A7   cmp         word ptr [flag],0FFFFh
004015AC   jne         Module1::Main+60h (004015b4)
30:           dummy = 6
004015AE   mov         word ptr [dummy],offset Module1::Main+5Eh
(004015b2)
31:       End If
32:   End Sub
004015B4   leave
004015B5   ret
-- 
ciao,
hal