VB è davvero case insensitive?


122

Non sto cercando di iniziare un argomento qui, ma per qualsiasi motivo, in genere si afferma che Visual Basic non fa distinzione tra maiuscole e minuscole e linguaggi C non lo sono (e in qualche modo è una buona cosa).

Ma ecco la mia domanda: dove esattamente Visual Basic non fa distinzione tra maiuscole e minuscole? Quando scrivo ...

Dim ss As String
Dim SS As String

... nell'IDE di Visual Studio 2008 o Visual Studio 2010 , il secondo ha un avviso di " La variabile locale SSè già dichiarata nel blocco corrente ". In VBA VBE, non elimina immediatamente un errore, ma si limita a correggere automaticamente il caso.

Mi manca qualcosa qui con questo argomento che Visual Basic non fa distinzione tra maiuscole e minuscole? (Inoltre, se sai o ti interessa rispondere, perché sarebbe una cosa negativa?)

Perché sto facendo questa domanda?

Ho usato Visual Basic in molti dei suoi dialetti ormai da anni, a volte come hobbista, a volte per programmi di piccole imprese in un gruppo di lavoro. Negli ultimi sei mesi ho lavorato a un grande progetto, molto più grande di quanto mi aspettassi. Gran parte del codice sorgente di esempio disponibile è in C #. Non ho alcun desiderio ardente di imparare C #, ma se ci sono cose che mi sto perdendo nelle offerte di C # che Visual Basic non ha (un opposto sarebbe VB.NET offre XML Literals ), allora mi piacerebbe per saperne di più su questa funzione. Quindi, in questo caso, si sostiene spesso che i linguaggi C fanno distinzione tra maiuscole e minuscole e questo è positivo e Visual Basic non fa distinzione tra maiuscole e minuscole e questo è un male. Mi piacerebbe sapere ...

  1. In che modo Visual Basic non fa distinzione tra maiuscole e minuscole poiché ogni singolo esempio nell'editor di codice diventa sensibile al maiuscolo / minuscolo (il che significa che il caso viene corretto) indipendentemente dal fatto che lo voglia o no.
  2. È abbastanza convincente per me da considerare il passaggio a C # se il caso VB.NET in qualche modo limita ciò che potrei fare con il codice?

5
+1 Mi sono chiesto esattamente questa stessa cosa prima.
NakedBrunch

7
Ummm ... non sono sicuro di aver capito cosa significhi sensibile alle maiuscole. Poiché VB in effetti non fa distinzione tra maiuscole e minuscole, SS e ss hanno lo stesso nome, mentre in C non lo sarebbero.
Ed S.

1
@ed: non posso usare entrambi SSe ssin VB, quello che uso per primo è quello che usa l'editor.
Todd Main,

1
Otaku, consiglio vivamente di concentrare questa domanda su esattamente cosa significa dire che VB non fa distinzione tra maiuscole e minuscole e come viene implementato. La questione se sia meglio che una lingua non faccia distinzione tra maiuscole e minuscole può, purtroppo, iniziare una guerra di fiamme. Se sei davvero curioso, fallo in un'altra domanda. (Ti consiglio di non farlo, ma se devi taggarlo soggettivo e renderlo wiki comunitario)
MarkJ

16
Stai (o stavi) pensando a questo sottosopra. È proprio perché il compilatore non distingue tra maiuscole e minuscole che l'errore legge "variabile SS già dichiarata". Se facesse distinzione tra maiuscole e minuscole, otterresti una "variabile ss non utilizzata" o nessun errore e un bug se hai usato alternativamente l'una e l'altra.
Adriano Varoli Piazza

Risposte:


108

La differenza tra VBA e VB.NET è solo perché VB.NET compila continuamente in background. Riceverai un errore quando compili il VBA.

Piace dice Jonathan , quando si programma si può pensare a VB.NET come senza distinzione tra maiuscole e minuscole a parte i confronti di stringhe, XML e poche altre situazioni ...

Penso che tu sia interessato a cosa c'è sotto il cofano. Bene, .NET Common Language Runtime fa distinzione tra maiuscole e minuscole e il codice VB.NET si basa sul runtime, quindi puoi vedere che deve fare distinzione tra maiuscole e minuscole in fase di esecuzione, ad esempio quando cerca variabili e metodi.

Il compilatore e l'editor VB.NET ti consentono di ignorarlo, perché correggono il caso nel tuo codice.

Se giochi con le funzionalità dinamiche o l'associazione tardiva (Option Strict Off) puoi dimostrare che il tempo di esecuzione sottostante fa distinzione tra maiuscole e minuscole. Un altro modo per capirlo è rendersi conto che i linguaggi con distinzione tra maiuscole e minuscole come C # usano lo stesso runtime, quindi il runtime ovviamente supporta la distinzione tra maiuscole e minuscole.

EDIT Se vuoi togliere l'IDE dall'equazione, puoi sempre compilare dalla riga di comando . Modificare il codice in Blocco note in modo da ha sse SSvedere cosa fa il compilatore.

EDIT Citazione di Jeffrey Richter nelle Linee guida per la progettazione di .NET Framework a pagina 45.

Per essere chiari, il CLR fa effettivamente distinzione tra maiuscole e minuscole. Alcuni linguaggi di programmazione, come Visual Basic, non fanno distinzione tra maiuscole e minuscole. Quando il compilatore Visual Basic sta tentando di risolvere una chiamata a un metodo in un tipo definito in un linguaggio con distinzione tra maiuscole e minuscole come C #, il compilatore (non CLR) calcola il caso effettivo del nome del metodo e lo incorpora nei metadati. Il CLR non ne sa nulla. Ora, se stai usando la reflection per associare a un metodo, le API di reflection offrono la possibilità di eseguire ricerche senza distinzione tra maiuscole e minuscole. Questa è la misura in cui CLR offre insensibilità al maiuscolo / minuscolo.


La migliore risposta che ho sentito finora. C'è un modo per dimostrare questo punto che il compilatore e l'editor di VB.Net ti permettono di ignorarlo ? C'è un modo per disattivare la correzione automatica? O c'è un modo per compilare un linfonodo sentinella che è non è scritto in VS IDE in MSBuild che utilizza sia ssed SSe compilerà e il lavoro come previsto?
Todd Main

5
Puoi disattivare la correzione automatica barando. Fare clic con il tasto destro su un file vb e selezionare "Apri con". Quindi scegli qualcosa come "XML (Text) Editor". Perderai tutte le funzionalità specifiche di VB come la correzione automatica.
Jonathan Allen,

+1 ottima risposta, e anche una buona domanda Otaku (penso che lo sapessi già ma volevi tirarne fuori una buona definizione ehi?)
Tipo anonimo

Il compilatore / IDE VB.NET non fa distinzione tra maiuscole e minuscole al 100%. Ad esempio Dim pdfWriter As PDFWriterè completamente valido. VB.NET ti consente di distinguere tra nomi di classi e nomi di variabili, il che è un bel tocco, poiché è pratica comune nei linguaggi con distinzione tra maiuscole e minuscole.
ingrediente_15939

La via VB è giusta per l'interoperabilità. Esempio: creare una DLL in C # con email come String e Email () come proprietà con l'evento inotifypropertychanged al suo interno. C # verrà compilato correttamente e verrà generata la DLL. Prova a fare riferimento a questa DLL in VB o in un linguaggio simile. Dirà che c'è un conflitto nella variabile email / Email nella libreria. Gli strumenti di analisi del codice indicano questo come un problema nel compilatore C # non nel compilatore VB.
Venkat

22

Parte del problema qui è che devi dividere la lingua dall'esperienza IDE.

Come linguaggio, VB.NET non fa distinzione tra maiuscole e minuscole rispetto agli identificatori. Chiamando DateTime.Parsee datetime.parsesi legherà allo stesso identico codice. E a differenza di linguaggi come C #, non è possibile definire metodi o tipi che differiscono solo per caso.

Come IDE, VB.NET tenta di preservare il caso degli identificatori esistenti quando elenca piuttosto un blocco di codice. Piuttosto elenchi si verificano ogni volta che ci si sposta dalla riga logica di codice corrente. In questo caso, esci dalla seconda dichiarazione di SS, il grazioso lister nota che esiste un identificatore esistente con quel nome e lo corregge in modo che abbia il caso corrispondente.

Questo comportamento, tuttavia, è puramente un valore aggiunto per l'utente. Non fa parte del linguaggio di base.


1
Grazie Jared, interessante sapere che è solo l'IDE. Ancora non riesco a capire perché sarebbe una buona cosa avere più di un nome che rappresentano cose diverse solo per la differenza di caso nel nome, ma immagino che sia per un altro giorno.
Todd Main

1
Non credo che Jared volesse dire che è solo l'IDE. Credo che abbia detto che il compilatore è case-insensitive, quindi pensa che ssè identico a SS, ma anche come un aiuto per leggere le corregge IDE SSper ssla digitazione. Quindi, anche se l'IDE non ha corretto il caso, il compilatore vedrebbe comunque i due identificatori come identici.
MarkJ

2
"Ancora non riesco a capire perché sarebbe una buona cosa avere più di un nome che rappresentino cose diverse solo per differenza di maiuscole e minuscole nel nome" <- Mi sentivo allo stesso modo prima di passare da VBA / VB6 / VB.NET a C # , Ho pensato che avere nomi diversi solo in base ai casi sembrava assolutamente pericoloso. In pratica, però, si rivela abbastanza utile e, sorprendentemente, non soggetto a errori.
Mike Rosenblum

2
@Mike Sono molto in disaccordo con questo punto. Non ho mai visto nomi con maiuscole e minuscole che hanno fatto altro che creare confusione.
JaredPar

2
Veramente? Intendo qualcosa come void SetColor (color Color) {this.color = color}; Mi rendo conto che questo potrebbe sembrare pericoloso, ma funziona senza problemi, il compilatore non ti consente di commettere errori e IntelliSense ti fornisce i membri corretti dopo "color". rispetto a "Colore". La cosa che mi dà fastidio qui è che l'uso di "this" non è richiesto - è applicato da FxCop e / o StyleCop (non ricordo quale), ma vorrei che ci fosse un'impostazione per avere l'IDE che lo imponga sempre quando si accede alla classe membri invece di consentire potenzialmente che l'ambito venga oscurato accidentalmente.
Mike Rosenblum

16

VB è per lo più case insensitive, ma ci sono eccezioni. Ad esempio, i valori letterali e la comprensione XML fanno distinzione tra maiuscole e minuscole. I confronti tra stringhe di solito fanno distinzione tra maiuscole e minuscole, a differenza di T-SQL, ma ci sono switch del compilatore per rendere i confronti tra stringhe insensibili al maiuscolo / minuscolo. E ovviamente ci sono casi limite quando si tratta di ereditarietà, COM e Dynamic Language Runtime.


3
Buoni punti su dove il caso è importante come i valori letterali XML e i confronti di stringhe. Ma quando diciamo che è per lo più senza distinzione tra maiuscole e minuscole, di cosa stiamo parlando esattamente? Passando a Outlook VBA, proprio come un esempio, se digito Dim mi as mailiteme subject = mi.subject, i nomi degli oggetti verranno corretti automaticamente in MailIteme mi.Subject. Il compilatore si preoccupa (perché lo correggerà sempre automaticamente) o è un bel codice o ...?
Todd Main,

1
Al compilatore non interessa. È possibile testarlo modificando un file nel blocco note e utilizzando il compilatore della riga di comando.
Jonathan Allen

9

Sì, il compilatore VB.NET tratta gli identificatori senza distinzione tra maiuscole e minuscole. E sì, ciò può causare problemi quando utilizza assembly scritti in un'altra lingua o utilizza componenti COM. Il primo caso è coperto dalla specifica del linguaggio comune . La regola pertinente è:

Affinché due identificatori siano considerati distinti, devono differire per qualcosa di più del semplice caso.

Il caso COM è gestito in modo piuttosto rozzo dal costruttore della libreria dei tipi, costringe l'involucro degli identificatori con lo stesso nome a essere identico. Anche quando questi identificatori hanno ruoli diversi. In altre parole, un parametro di metodo con il nome "index" imporrà che il nome di un metodo "Index" venga riclassificato in "index". Ciò ha prodotto molti graffi alla testa, come puoi immaginare :)


6

VB preserva le maiuscole (nell'IDE) ma non fa distinzione tra maiuscole e minuscole . È come il file system di Windows in un certo senso. Hello.txt e hello.txt sono considerati lo stesso nome di file.

L'IDE presume che la dichiarazione di una variabile sia il caso "corretto" per quella variabile e regola ogni istanza di quella variabile in base alla dichiarazione. Lo fa per motivi di piacere per gli occhi e coerenza, ma non per funzionalità.

Ho visto diversi casi in cui il caso non è stato modificato automaticamente per corrispondere alla dichiarazione e l'istruzione funziona allo stesso modo. È inoltre possibile utilizzare qualsiasi editor di testo per scrivere codice che verrà compilato correttamente in casi diversi.

Una nota a margine:

Maggior parte PERSONE pensa senza distinzione tra maiuscole e minuscole. Quando vediamo la parola "cane", la parola viene tradotta in significato nella nostra mente. Il significato della parola non è basato sulle maiuscole / minuscole (cioè indipendentemente dal fatto che si scriva "CANE", "DoG" o "CANE" abbaia ancora). I COMPUTER vedono le parole come sacche discrete di bit. Le maiuscole e le minuscole sono modelli di bit diversi e sono quindi diversi.

Poiché la maggior parte dei programmatori è umana, l'insensibilità al maiuscolo / minuscolo sembra più adatta al modo in cui le persone pensano e la sensibilità al maiuscolo / minuscolo riguarda più l'adattamento del modo in cui pensano gli umani ai vincoli di una macchina.


4
Tranne che i programmatori hanno bisogno di distinguere tra oggetti e classi, e hanno tradizionalmente usato un cambiamento nel caso in cui lo facessero (non richiesto, solo una convenzione). In questo modo object.method()e Object.Method()vengono immediatamente riconosciuti come riferimenti e metodi a oggetti e classi (se ci si conforma a quella convenzione di codifica). Come in inglese, distingui i nomi propri e l'inizio delle frasi con una lettera maiuscola. Quindi durante la lettura o la programmazione non penso in modo insensibile alle maiuscole, altrimenti mi perderei un significato.
Jason S

@ Jason, è tutto quello a cui sei abituato. I nuovi studenti di programmazione in C offrono inizialmente una miriade di lamentele sulla distinzione tra maiuscole e minuscole, quindi, dopo alcuni corsi, ci si abitua. Object.method () e Object.Method () sono solo una convenzione ed è il caso più forte per la distinzione tra maiuscole e minuscole. Ho dovuto modificare un programma scritto da qualcun altro che aveva due variabili denominate temp e Temp nello stesso ambito, e ti dirò che è stato molto difficile tenerle dritte nella mia testa. E mentre possiamo riconoscere un nome comune con le maiuscole, le parole "bob" e "Bob" hanno lo stesso significato nel nostro cervello.
Andrew Neely

Perché l'IDE conserva il case in quel caso? (spiacente). Penso che l'IDE conservi il caso perché i progettisti di SM ritengono che il caso abbia una certa semantica, nel cervello, cosa che fa. Ma in realtà l'IDE VB considera forme Formlo stesso, il che è comunque per me confuso. Nel caso (ancora una volta mi dispiace), di tempe Tempsi potrebbe facilmente utilizzare gli strumenti di refactoring in C # per rinominare Tempal bobTempo qualsiasi altra cosa. Tuttavia, sto mantenendo un po 'di VB e qualcuno è andato e ha fatto Dim form As Form. Ora, quando rinomino, rinomina sia i riferimenti alla classe che agli oggetti. Bleah!
Jason S

@ Jason, in VB dico sempre "Dim aform as Form", ma sto divagando. VB supporta la distinzione tra maiuscole e minuscole nella ricerca. Inoltre vorrei cercare "As Form" e sostituirlo con "somethingstupid", quindi rinominare il form in qualcosa di sensato, quindi rinominare "somethingstupid" in "As Form". In realtà mi piace cambiare il caso, perché verifica che non ho scritto il nome della variabile.
Andrew Neely

Sì, ma questo non sostituisce uno strumento di refactoring che distinguerà tra classe e riferimento all'istanza quando i nomi sono gli stessi (o differiscono solo per caso in VB). Gli strumenti di refactoring C # sembrano essere in grado di farlo. Non nomino le stesse classi e istanze. In C # userò maiuscole e minuscole per distinguere, ma in VB non posso farlo quindi uso le lettere per anteporre. Ovviamente il mio problema è che sto mantenendo il codice di qualcun altro che ha usato lo stesso nome. Ma questa discussione sta diventando troppo grande per i commenti, quindi la lascio qui.
Jason S

5

Questo fa parte dell'editor che stai utilizzando, possono comportarsi in modo diverso ma il fatto è che Visual Basic è davvero un linguaggio che non fa distinzione tra maiuscole e minuscole. Quindi, sse SSsono gli stessi.

Per ulteriori informazioni, dai un'occhiata al tutorial VB.NET Basics :)


oh, è interessante. c'è un posto in cui cerco questo dettaglio? non l'ho ancora testato, ma pensando a VBScript, potresti avere ragione.
Todd Main,

@Otaku: per favore guarda di nuovo la mia risposta, ho fornito il link ora. Grazie
Sarfraz

Conosco abbastanza VB, grazie :) Non sono sicuro di cosa vuoi che guardi in quella pagina.
Todd Main,

3

Non sono sicuro di averti capito? VB non fa distinzione tra maiuscole e minuscole, quindi ss e SS sono la stessa variabile, quindi il compilatore si lamenta correttamente che hai ri-dichiarato la variabile.

Penso che le variabili non facciano distinzione tra maiuscole e minuscole, ma i nomi delle funzioni lo sono.


ma se uso sse poi digito in seguito SS, viene automaticamente corretto ss, il che mi porta a credere che il compilatore si preoccupi davvero delle maiuscole.
Todd Main,

5
@oTAKU: Questo è l'IDE che cambia il caso, non il compilatore.
John Saunders

2
VB ancora non si preoccupa davvero del caso. L'IDE sta tentando di pulire il codice in modo che le variabili rimangano le stesse per tutto il tempo.
Guitarthrower

1

Sì, VB non fa distinzione tra maiuscole e minuscole. A volte getta quelli che non ci sono abituati per un po '.


1

Non è necessario provare così tanto in VB.NET per creare codice con diverse "ortografie" maiuscole / minuscole di un identificatore. Cambiare l'involucro di un identificatore nel file in cui è dichiarato senza usare la funzione "Rinomina" non causerà l'aggiornamento del nome in altri file, anche se la modifica di qualsiasi riga che contiene il nome lo renderà conforme alla definizione attuale.

In questo modo, si può determinare che VB.NET è per lo più insensibile al maiuscolo / minuscolo, ma rende disponibile il caso degli identificatori al CLR che può utilizzare tali informazioni in modi sensibili al maiuscolo / minuscolo.


1

Posso solo offrire questo, che come ricordo dai miei libri di testo di programmazione all'inizio degli anni '80, è che i linguaggi sensibili al caso erano, (a quel tempo) strettamente intesi a ridurre gli errori di compilazione. Vale a dire, il "rigore" aveva lo scopo di sviluppare una disciplina di codifica di maggiore accuratezza. Come si è scoperto, si è evoluta anche l'aggiunta di una corretta etichettatura di variabili, classi, metodi, funzioni e qualsiasi altra cosa si desideri inserire.

Ricordo che quasi tutti quei libri includevano uno schema consigliato per le lettere maiuscole, minuscole, ecc. Come tutti sappiamo, gran parte di questo è stato buttato via o, dovrei dire, ignorato in pratica, tranne che per le case di produzione di fascia alta e Soluzioni CASE, o per quelle che hanno raggiunto un livello di competenza superiore. Penso che tutti sperimentino questa curva di apprendimento.

Dato il progresso di questi linguaggi e IDE, la domanda migliore diventa: quale lingua migliora il mio tempo di sviluppo? Naturalmente, se non hai familiarità con ciascuna delle varie lingue, le tue opzioni sono limitate.


1

Proverò a rispondere alla tua seconda domanda.

"è abbastanza convincente per me da considerare il passaggio a C # se il caso VB.NET sta in qualche modo limitando ciò che potrei fare con il codice?"

Creare un servizio Web WCF utilizzando C #. Crea un DataContract (1 classe). Uno con la proprietà "string email". Un altro con "stringa Email" come un'altra proprietà. La tua scelta di intendere come e-mail personale o e-mail dell'ufficio. Oppure potrebbe essere in due diversi DataContract.

Per C # questo va bene. Il servizio web è stato creato correttamente. Il programma AC # può facilmente creare un WSDL e tutto va bene.

Ora prova a creare un WSDL con VB (qualsiasi versione). Dirà che "email" è già dichiarato e la generazione di WSDL non riesce.

Come tutti, ho pensato che questo fosse un inconveniente nel linguaggio VB. Ma!!!

Usa FxCOP e analizza il codice C # originale. FxCOP afferma che l'utilizzo di e-mail / e-mail è un problema. Consiglia di utilizzare nomi diversi che supportano l'insensibilità tra maiuscole e minuscole. Si noti inoltre che alla data .NET Framework ha 106 linguaggi di programmazione e ci sono molti linguaggi con distinzione tra maiuscole e minuscole ON. Ci stiamo muovendo tutti verso il cloud e vogliamo che i nostri servizi siano accessibili da tutte le piattaforme / linguaggi di programmazione.

Quindi la distinzione tra maiuscole e minuscole è la tua scelta all'interno del tuo programma e se sei un tipo C lo vorresti. Se il programma verrà utilizzato / accessibile da altri programmi non C, è necessario supportare l'insensibilità tra maiuscole e minuscole, ma la tua lingua è la tua scelta.

http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Visual_Basic_.NET http://www.vbrad.com/article.aspx?id=65


Il cloud utilizza URI che fanno distinzione tra maiuscole e minuscole (che è particolarmente importante per proxy e server di cache).
binki

1

Anche l'occultamento dei simboli (ad es. Il campo local hides) non fa distinzione tra maiuscole e minuscole.

Ecco un esempio :

Public Class C
    Public Name As String

    Public Function M(name As String) As Boolean
        Return String.Equals(name, Name) ' case differs
    End Function
End Class

L'output del compilatore VB.NET viene decompilato (e quindi equivalente a) il seguente C #:

public class C
{
    public string Name;

    public bool M(string name)
    {
        return string.Equals(name, name); // both lowercase
    }
}

string.Equalsviene passato il campo due volte. Il locale è nascosto, indipendentemente dal caso. La lingua non fa distinzione tra maiuscole e minuscole.

Per fare riferimento esplicitamente a un membro, come questo campo, è necessario dereferenziare il membro tramite Me:

Return String.Equals(name, Me.Name) ' differentiate field from local

0

Non ho visto nessuno commentare la tua seconda domanda esplicita alla fine: "2: è abbastanza convincente per me da considerare di passare a C # se il caso VB.NET sta in qualche modo limitando ciò che potrei fare con il codice?"

Preferisco l'approccio con più opzioni che C # consente al programmatore di scegliere se limitare le opzioni del programmatore. Preferisco di gran lunga C #, ma per la sola distinzione tra maiuscole e minuscole, non lo penserei nemmeno vicino all'apprendimento di una lingua solo perché è sensibile al maiuscolo / minuscolo. tutte le caratteristiche sono ciò che conta, e quando guardo i vantaggi di entrambi, C # e VB.NET, preferisco fortemente C #. ma ti darò una vera prospettiva equilibrata, di parte sì, perché ho una preferenza, ma sarò onesto anche sugli svantaggi del C #.

prima di tutto, entrambe le lingue presentano vantaggi e svantaggi. le differenze che puoi fare in una lingua che non possono essere fatte nell'altra stanno diminuendo poiché, per fortuna, Microsoft sta migliorando entrambe le lingue e sembrano non mostrare una parzialità ingiusta verso nessuna delle due lingue.

quando C # è uscito per la prima volta, VB non aveva i suoi commenti XML che potresti mettere prima dei metodi, cosa che ho amato in C #. Lo odiavo in VB.NET. ma negli anni ho visto che molte funzionalità che non sono in una lingua vengono aggiunte all'altra. (lo stesso team di sviluppatori MS sviluppa sia C # che VB, quindi ha senso che le funzionalità diventino abbastanza simili.)

ma hai chiesto cosa ha C # che VB non ha. eccone alcuni a cui posso pensare immediatamente:

1: C # è più conciso e richiede meno battitura .. in MOLTI modi! Ho persino visto la stupidità parlare quando viene fatta l'affermazione opposta, che VB salva la digitazione. ma per favore ascolta le persone che ti dicono che usano entrambe le lingue, e nessuna delle due è usata raramente da loro. io uso entrambi C # cheVB, C # a casa perché mi piace (e quando lavoro con C # al lavoro), e le mie richieste di lavoro più recenti che uso VB e non C #. quindi sto utilizzando più frequentemente VB ora (da circa 10 mesi), ma nella mia testimonianza personale, preferisco di gran lunga C #, e in termini di battitura effettiva, VB è notevolmente più digitazione. l'unico esempio che ho letto in cui qualcuno ha effettivamente provato a dire che VB era più conciso, stava dando un esempio "with ..." con una variabile lunga nel con, quindi in VB, potresti semplicemente usare ".property". questa è stupidità nell'affermare che VB ha bisogno di meno battitura. ci sono alcune cose (e non solo questo esempio) in cui VB è più breve, ma molte più volte quando C # è più conciso, nella pratica reale.

ma il motivo principale per cui credo che C # sia più conciso, sono le verbose dichiarazioni "IF / THEN" di VB. le istruzioni if ​​sono comuni. in C # non c'è nessuna parola "allora" da digitare! :) anche tutte le istruzioni 'end ...' richiedono la digitazione che, in c #, di solito è solo una parentesi graffa di chiusura '}'. Ho letto che alcune persone affermano che questa maggiore verbosità in VB.NET è un vantaggio per VB poiché diverse istruzioni / simboli di blocco di chiusura possono essere annidati e terminare immediatamente l'uno accanto all'altro, ma non sono abbastanza d'accordo. una persona può quasi sempre scrivere un programma meglio in C # o VB rispetto a un altro programmatore perché la prossima revisione del codice potrebbe essere progettata meglio. questo vale per la "confusione di numerose parentesi graffe di chiusura in C #" e se i blocchi annidati sono tutti dello stesso tipo come diversi IF annidati, VB soffre dello stesso problema che ha in C #. questo non è un vantaggio in VB. questa situazione è precisamente il motivo per cui mi piace commentare il significato del mio simbolo di chiusura o dichiarazione di chiusura in entrambe le lingue. sì, questo è più prolisso da fare, ma in entrambe le lingue hai la possibilità di essere chiaro, il che è importante nei casi specifici basati sul giudizio e sulla situazione. Penso che la chiarezza del codice sia abbastanza importante.

2: VB non ha commenti su più righe. quando ho lavorato con VB non mi importava. poi sono passato ad alcuni linguaggi in stile C. ora sono tornato principalmente a utilizzare VB.NET al lavoro e mi mancano. è solo qualcosa che trovi conveniente e che poi devi perdere. :(

3: "andalso" e "orelse" di VB è piuttosto fastidioso da digitare tutto questo quando in C # sono semplicemente "&&" e "||". ancora una volta, meno battitura. questo non è raro nel mio codice sia in VB che in C #. semmai, per la funzionalità, 'OR' vs 'OrElse' di solito non ha importanza tranne che 'OrElse' è più veloce per il computer, quindi se un programmatore usa solo 'Or' e 'And' in VB, allora produce un codice meno ottimale per qualcuno a cui piace la chiarezza del codice. "Or" è molto più facile da scorrere rispetto a "OrElse".

4: maggiore flessibilità nel posizionamento del codice in C #. quando una riga è lunga e si desidera avvolgerla nella riga successiva, odio il riadattamento del mio codice da parte di VB.NET. C # lo fa un po ', ma lo trovo più utile in C #, dove in VB, è molto più controllo. ma questo è più dell'IDE VB.NET rispetto all'IDE C # piuttosto che il linguaggio stesso. ma non so se vuoi entrambe o puramente le funzionalità del linguaggio senza differenze IDE.

5: quello che mi manca davvero è solo creare un nuovo blocco di codice in C #, potrei avere molte cose accadute in un metodo e voglio dichiarare una variabile in un blocco di codice molto piccolo ma non avere quella variabile dichiarata al di fuori di quel blocco in l'intero metodo. in C #, possiamo semplicemente creare un nuovo blocco con "{" e terminarlo con "}". VB non ha questa caratteristica, ma la sua corrispondenza più simile è un blocco incondizionato "If True Then" e "End If". (nota l'equivalente di 2 caratteri C # vs 18 caratteri VB.NET di nuovo ... più digitando VB.)

6: incremento sé e gli operatori di decremento: ++ e - come nei myVariable++o ++myVariableo versioni decremento equivalenti. questo è molto utile ... a volte. ecco un esempio di codice effettivo quando ho perso molto C #:

// C#:
while (txt.Length > x)
{
    thisChar = txt[x];
    if (charsAllowedWithoutLimit.Contains(thisChar)) { ++x; }
    else if (allowLettersWithoutLimit && char.IsLetter(thisChar)) { ++x; }
    else if ((x2 = charsAllowedWithLimit.IndexOf(thisChar)) >= 0)
    {
        ++x; if (++usedCountA[x2] > charAllowedLimit[x2]) { break; }
    }
    else { break; }
}

' VB.NET:
While (txt.Length > x)
    thisChar = txt(x)
    If (charsAllowedWithoutLimit.Contains(thisChar)) Then
        x += 1
    ElseIf (allowLettersWithoutLimit AndAlso Char.IsLetter(thisChar)) Then
        x += 1
    Else
        x2 = charsAllowedWithLimit.IndexOf(thisChar)
        If (x2 >= 0) Then
            x += 1
            usedCountA(x2) += 1S
            If usedCountA(x2) > charAllowedLimit(x2) Then Exit While
        Else
            Exit While
        End If
    End If
End While

E solo per dare un MOLTO buon esempio in cui le regole C #, questo è più codice che ho scritto personalmente di recente:

// C#
public static bool IsNotWithin(this Byte   v, Byte   v1, Byte   v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this SByte  v, SByte  v1, SByte  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int16  v, Int16  v1, Int16  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int32  v, Int32  v1, Int32  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int64  v, Int64  v1, Int64  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt16 v, UInt16 v1, UInt16 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt32 v, UInt32 v1, UInt32 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt64 v, UInt64 v1, UInt64 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Decimal v, Decimal v1, Decimal v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }

public static bool IsWithin(this Byte   v, Byte   v1, Byte   v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this SByte  v, SByte  v1, SByte  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int16  v, Int16  v1, Int16  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int32  v, Int32  v1, Int32  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int64  v, Int64  v1, Int64  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt16 v, UInt16 v1, UInt16 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt32 v, UInt32 v1, UInt32 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt64 v, UInt64 v1, UInt64 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Decimal v, Decimal v1, Decimal v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }

' And the VB equivalent is a mess! Here goes:
<Extension()>
Public Function IsNotWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsNotWithin(v%, value1%, value2%) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsNotWithin(v&, value1&, value2&) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsNotWithin(v@, value1@, value2@) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsWithin(v%, value1%, value2%) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsWithin(v&, value1&, value2&) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsWithin(v@, value1@, value2@) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

Forse questa è una prova enuf che C # è più conciso. Ma non tutti i programmatori amano la concisione. Alcuni preferiscono leggere "se a <b allora ..." perché è più naturale per il loro linguaggio umano. E va benissimo. Le preferenze vanno bene. Per me, lo sforzo con la mano è un fattore che apprezzo, e penso che chiunque possa abituarsi a pensare in qualsiasi simbolo preferisca, perché "se" e "allora" sono simboli di un alfabeto, e l '"istruzione if (condizione) di C #;" anche la sintassi sono simboli. uno è solo più vicino alla sintassi dei non programmatori rispetto agli altri. preferisco quello conciso.

Penso anche che dover usare "c" dopo i caratteri letterali in VB per renderlo un carattere letterale piuttosto che una stringa sia fastidioso. Mi piace molto di più la concisione di C # con questo. quando un metodo richiede un carattere letterale, è necessario fornire un carattere non una stringa con una lunghezza di un carattere, quindi a volte sei costretto a usarlo ":"cin VB mentre in C # lo è ':'. Penso che questo sia pignolo comunque.

Per essere onesti, devo dire ci sono vantaggi mi piace VB come non dover mettere parentesi vuote dopo le chiamate di metodo, come Dim nameUpper$ = name.ToUpperInvariantdove C # richiede le parentesi vuote: string nameUpper = name.ToUpperInvariant(). o il doppio che, come il taglio è troppo: Dim nameUpper$ = name.Trim.ToUpperInvariantvs string nameUpper = name.Trim().ToUpperInvariant(). Mi piace l'uso conciso di VB di come ho appena usato$ sopra per attenuarlo 'As String' dove C # non ha quelle scorciatoie. VB ha quelle scorciatoie per i tipi String, Integer, Long, Decimal, Single e Double, ma lo svantaggio è che è meno chiaro, quindi lo uso con cautela. ma comunque, preferisco il codice conciso.

Bene, questi sono solo alcuni suggerimenti di questo programmatore esperto e, come considero, questa è la mia "testimonianza" di programmazione di C # vs VB. entrambe sono belle lingue comunque, secondo me. ma sì, preferisco ancora di gran lunga C #.

ps Dato che ho intenzione di programmare per la maggior parte della mia vita, ho persino reimparato a digitare utilizzando la tastiera più efficiente: la tastiera Dvorak, che impiega circa 1/3 dello sforzo per digitare l'inglese rispetto a una tastiera Qwerty. cercalo. forse potresti voler cambiare anche tu. ;) ha reso la mia digitazione più facile del 67%! :) Incoraggio chiunque a pensare fuori dagli schemi e valutare una migliore efficienza nel proprio lavoro. Il layout di tastiera semplificato Dvorak e C # lo hanno fatto per me. :)

PSS confronterei Dvorak e C # con la metrica rispetto al layout della tastiera Qwerty e VB alle misurazioni empiriali. Dvorak, metric e C # sono semplicemente "puliti". MA VB non è molto indietro. Ma soffre della necessità di essere retrocompatibile con il vecchio codice VB6 e il codice pre .NET, come "Or" vs "OrElse" e "IIF ()".

Concludo con una cautela. Si prega di essere più prudenti che ascoltare persone che non sanno veramente di cosa stanno parlando. La metà di tutti gli svantaggi contro VB e C # lo sono non lonessun problema più, e le persone continuano a postare su di loro ignorando quali svantaggi esistono ancora nella lingua. Il miglior esempio a cui riesco a pensare sono i commenti XML per i metodi che utilizzano il triplo apostrofo in VB o simboli di commento a tripla barra in C #. Ma per favore discernere da soli se una persona parla per ignoranza o per esperienza. La testimonianza personale significa che sanno dalla loro esperienza reale. E dopo che qualcuno ha molta esperienza, rianima le orecchie. Ho più di 10 anni di esperienza sia in C # che in VB. E si riduce a questo: entrambe sono (molto) buone lingue. E la maggior parte delle differenze, puoi vedere immediatamente entro 5 minuti dalla lettura del codice. Ma sì, altre caratteristiche possono richiedere anni per trovare un handicap. E un handicap di cui sono a conoscenza (in C #), posso ' Non pensare nemmeno a una situazione di vita reale in cui sarebbe utile. Quindi forse non è un handicap, dopotutto.

Buona programmazione!


Apprezzo tutti i dettagli, ma il tuo esempio non usa maiuscole / minuscole / insensibilità (per quanto ne so) per mostrare perché C # è in qualche modo "migliore".
Todd Main

Ho provato a rispondere alla seconda domanda con un esempio diretto.
Venkat

@ToddMain, corretto. E il mio esempio non usa la distinzione tra maiuscole e minuscole per mostrare perché C # è migliore perché la domanda non chiede perché la distinzione tra maiuscole e minuscole lo rende migliore. Inoltre credo che questa caratteristica parli da sola. E credo che la logica sia fondamentale per cui la maggior parte delle persone può dedurlo da sé. Ma se qualcuno me lo chiede, sono felice di aiutarlo a seguire la logica. Ma questa, amico mio, secondo me, è una domanda diversa. ;)
Shawn Kovac

In realtà, questa era una delle due domande poste nel post originale. Non è evidente, ecco perché l'ho chiesto. Ma non preoccuparti di non affrontare la domanda.
Todd Main

@ToddMain, capisco il tuo punto. punto davvero molto giusto. :) Grazie per avermi aperto gli occhi su questo. :)
Shawn Kovac

0

VB.NET fa distinzione tra maiuscole e minuscole.

Esempi:

1.

Dim a As Integer
Dim A as Integer

2.

Sub b()
    'Some statement(s) here
End Sub
Sub B()
    'Some statement(s) here
End Sub

3.

Function c() As Integer
    'Some statement(s) here
End Function
Function C() As Integer
    'Some statement(s) here
End Function

Tutti questi codici genereranno un ERRORE IN TEMPO DI COMPILAZIONE .

Per il primo esempio, verrà mostrato un errore, dicendo "La variabile locale 'A' è già dichiarata nel blocco corrente.".

Mentre per il 2 ° e 3 ° esempio, verrà mostrato un errore che dice "'Public Sub b ()' ha più definizioni con firme identiche". e "'Funzione pubblica c () As Integer' ha più definizioni con firme identiche.", rispettivamente.

Da questi errori, si noti che gli errori vengono generati in posizioni diverse per variabili e procedure / funzioni. Per le variabili, l'errore viene lanciato alla seconda dichiarazione mentre per le procedure / funzioni viene lanciato alla prima dichiarazione / definizione di codice identico.

Come detto da un utente in un commento da qualche parte sopra, il codice VB.NET viene continuamente controllato e / o corretto in background; puoi vedere questo errore nella finestra "Elenco errori" in VS IDE. E poiché questo è UN ERRORE e NON UN AVVERTENZA , il codice non verrà compilato finché l'errore non verrà risolto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.