VBは本当に大文字と小文字を区別しませんか?


122

私はここで議論を始めようとはしていませんが、何らかの理由で、通常、Visual Basicは大文字と小文字を区別せず、C言語はそうではないと述べています(そして、何とかそれは良いことです)。

しかし、ここに私の質問があります:Visual Basicは大文字と小文字を区別しませんか?入力すると...

Dim ss As String
Dim SS As String

... Visual Studio 2008またはVisual Studio 2010 IDEに、2番目のIDEは「ローカル変数SSは既に現在のブロックで宣言されています」という警告が表示されます。VBA VBEでは、すぐにエラーが発生するのではなく、ケースが自動修正されます。

Visual Basicでは大文字と小文字が区別されないというこの引数で何か不足していますか?(また、あなたが知っているか、答えようとするなら、なぜそれが悪いことでしょうか?)

なぜ私はこの質問をするのですか?

私は長年にわたって、多くの方言でVisual Basicを使用してきました。時には趣味として、時にはワークグループの小規模ビジネス関連プログラムに使用しました。過去6か月の時点で、私は予想以上に大きなプロジェクトに取り組んできました。そこにあるサンプルソースコードの多くはC#にあります。私はC#を学習したいという強い欲求はありませんが、そのC#で見落としていることがVisual Basicにはない(VB.NETがXMLリテラルを提供している場合はその逆です)場合は、その機能についてもっと知りたい。そのため、この場合、C言語では大文字と小文字が区別され、Visual Basicでは大文字と小文字が区別されず、それが悪いとよく言われます。知りたい...

  1. コードエディターのすべての例では、必要かどうかにかかわらず、大文字と小文字が区別される(つまり、大文字と小文字が修正される)ため、Visual Basicの大文字と小文字はどれほど正確に区別されません。
  2. これは、VB.NETのケースがコードで何ができるかを何らかの形で制限している場合に、C#への移行を検討するのに十分魅力的ですか?

5
+1これまでとまったく同じことを考えたことがあります。
NakedBrunch 2010

7
うーん...大文字小文字を区別する意味が何であるかを理解しているかはわかりません。VBは実際には大文字と小文字を区別しないので、SSとss 同じ名前ですが、Cでは区別されません。
Ed S.

1
@ed:とVBの両方SSを使用することはできませんss。どちらを先に使用しても、エディターが使用します。
トッドメイン

1
オタク、私は間違いなく、VBは大文字と小文字を区別しないと言うことの意味とそれがどのように実装されるかに正確に焦点を当ててこの質問を続けることをお勧めします。言語が大文字と小文字を区別しない方が良いかどうかの質問は、悲しいことに、炎の戦争を開始するかもしれません。本当に興味があるなら、別の質問で聞いてください。(お勧めしませんが、主観的なタグを付けてコミュニティWikiにする必要がある場合)
MarkJ

16
あなたはこれを逆さまに考えています(または考えていました)。それは正確ですので、コンパイラはエラーは「は既に宣言された変数SS」を読み込むこと大文字と小文字を区別しません。大文字と小文字が区別される場合は、「ss変数が使用されていません」またはまったくエラーが発生せず、どちらか一方を使用した場合はバグが発生します。
Adriano Varoli Piazza

回答:


108

VBAとVB.NETの違いは、VB.NETがバックグラウンドで継続的にコンパイルされるためです。VBAをコンパイルするとエラーが発生します。

同様ジョナサン氏は述べていますプログラミングする場合、あなたは大文字と小文字を区別しない文字列比較を、XML、およびいくつかの他の状況から離れてVB.NETと考えることができます...

内面の内容に興味があると思います。さて、.NET共通言語ランタイムは大文字と小文字を区別し、VB.NETコードはランタイムに依存しているため、変数やメソッドを検索するときなど、実行時に大文字と小文字を区別する必要があることがわかります。

VB.NETコンパイラとエディタでは、コードの大文字と小文字正しく修正されるため、これを無視できます。

動的機能や遅延バインディング(Option Strict Off)をいじってみると、基になるランタイムで大文字と小文字が区別されることを証明できます。これを確認するもう1つの方法は、C#のような大文字と小文字を区別する言語が同じランタイムを使用することを認識することです。したがって、ランタイムは大文字と小文字の区別を明らかにサポートします。

編集 IDEを方程式から外したい場合は、いつでもコマンドラインからコンパイルできます。でコードを編集し、メモ帳、それが持つようにssしてSSコンパイラが何を参照してください。

編集から引用ジェフリー・リヒター、.NET Frameworkの設計ガイドライン 45ページ。

明確にするために、CLRは実際には大文字と小文字を区別します。Visual Basicなどの一部のプログラミング言語では、大文字と小文字が区別されません。Visual Basicコンパイラがメソッド呼び出しをC#などの大文字と小文字を区別する言語で定義された型に解決しようとすると、コンパイラ(CLRではない)がメソッド名の実際の大文字と小文字を区別し、メタデータに埋め込みます。CLRはこれについて何も知りません。メソッドにバインドするためにリフレクションを使用している場合、リフレクションAPIは大文字と小文字を区別しない検索を実行する機能を提供します。これは、CLRが大文字と小文字を区別しない範囲です。


これまでに聞いたベストアンサー。VB.Netコンパイラとエディタがあなたにそれを無視させたこの点を証明する方法はありますか?自動修正をオフにする方法はありますか?それともれるSLNコンパイルする方法がありません両方を使用していますMSBuildのではVS IDEで書かをssし、SSそして期待どおりにコンパイルして動作しますか?
トッドメイン

5
不正行為によって自動修正をオフにすることができます。vbファイルを右クリックし、[プログラムから開く]を選択します。次に、「XML(テキスト)エディター」などを選択します。自動修正など、VB固有の機能はすべて失われます。
ジョナサンアレン

+1良い答え、良い質問、そしてオタク(あなたはすでに知っていたが、良い定義を引き出したいと思ったと思いますか?)
匿名タイプ

VB.NETコンパイラ/ IDEは、100%大文字と小文字を区別しません。たとえば、Dim pdfWriter As PDFWriter完全に有効です。VB.NETを使用すると、クラス名と変数名を区別できます。これは、完全に大文字と小文字を区別する言語で一般的に行われている方法です。
成分

VBの方法は相互運用性に適しています。例:C#で、メールを文字列として、Email()をプロパティとして、inotifypropertychangedイベントを含むDLLを作成します。C#は正常にコンパイルされ、DLLが生成されます。このDLLをVBまたは同様の言語で参照してみてください。ライブラリの変数email / Emailに競合があると表示されます。コード分​​析ツールは、これをVBコンパイラではなくC#コンパイラの問題として指摘します。
Venkat

22

ここでの問題の一部は、言語をIDEエクスペリエンスから分離する必要があることです。

言語として、VB.NETは識別子に関して大文字と小文字を区別しません。呼び出しDateTime.Parsedatetime.parseまったく同じコードにバインドします。また、C#のような言語とは異なり、大文字と小文字のみが異なるメソッドや型を定義することはできません。

IDEとして、VB.NETはコードのブロックをかなりリストするときに、既存の識別子の大文字と小文字を維持しようとします。かなりのリストは、コードの現在の論理行から移動するたびに発生します。この場合、の2番目の宣言から移動すると、SSpretty listerはその名前の既存の識別子があることに気づき、大文字と小文字が一致するように修正します。

ただし、この動作は純粋にユーザーの付加価値として行われます。コア言語の一部ではありません。


1
Jaredに感謝します。IDEだけであることを知って興味深いです。それでも、複数の名前で大文字と小文字の違いだけで異なるものを表すのが良い理由はまだわかりませんが、それは別の日だと思います。
トッドメイン

1
Jared がIDE だけを意味しているとは思いません。私は彼はコンパイラは大文字と小文字を区別しないと言ったと思うので、それはssと同じであると考えますがSS、入力時にIDEが正しく修正するのSSを助けるためでもありssます。したがって、IDEがケースを修正しなかった場合でも、コンパイラーは2つのIDを同一と見なします。
MarkJ、2010

2
「複数の名前に大文字と小文字の違いだけで異なるものを表すのはなぜ良いことなのかまだ理解できません」<-VBA / VB6 / VB.NETからC#に切り替える前は同じように感じていました、名前だけがケースによって異なるだけだと、まったく危険だと思った。しかし実際には、それは非常に有用であることが判明し、驚くべきことに、エラーが発生しにくくなっています。
Mike Rosenblum、2011

2
@マイク私はその点に非常に同意しません。混乱を招く以外は何もしない、大文字と小文字が混在する名前を見たことがありません。
JaredPar 2011

2
本当に?void SetColor(color Color){this.color = color}のようなものを意味します。これは危険に見えるかもしれませんが、スムーズに動作し、コンパイラーはミスを許さず、IntelliSenseは「色」の後に正しいメンバーを提供します。対「色」。ここで私が気になるのは、「this」の使用は必須ではないということです。FxCopやStyleCop(またはどちらか)によって強制されますが、IDEがクラスにアクセスするときに常にこれを強制する設定があったらいいのにと思います。スコープが誤ってシャドウされる可能性を潜在的に許可する代わりに、メンバー。
Mike Rosenblum、2011

16

VBはほとんどの場合大文字と小文字を区別しませんが、例外があります。たとえば、XMLリテラルと内包では大文字と小文字が区別されます。文字列比較は通常、T-SQLとは異なり、大文字と小文字を区別しますが、文字列比較で大文字と小文字を区別しないようにするコンパイラスイッチがあります。そしてもちろん、継承、COM、Dynamic Language Runtimeを扱う際には、エッジケースがあります。


3
XMLリテラルや文字列比較のように、大文字と小文字が区別される場合の良い点。しかし、ほとんどの場合大文字と小文字を区別しないと言うとき、正確には何を話しているのでしょうか。私が入力した場合、単なる一例としては、Outlook VBAに上を移動するDim mi as mailitemsubject = mi.subject、オブジェクト名がに自動補正されますMailItemmi.Subject。コンパイラは気にしていますか(常にこれを自動修正するため)、またはこのきれいなコードですか...?
トッドメイン

1
コンパイラーは関係ありません。これは、メモ帳でファイルを編集し、コマンドラインコンパイラを使用してテストできます。
ジョナサンアレン

9

はい、VB.NETコンパイラは大文字と小文字を区別しない方法で識別子を処理します。そして、そうです。別の言語で記述されたアセンブリを使用したり、COMコンポーネントを使用したりすると、問題が発生する可能性があります。前者のケースは、共通言語仕様でカバーされています。関連するルールは次のとおりです。

2つの識別子を区別できると見なすには、大文字と小文字の違いだけでなく異なる必要があります。

COMのケースはタイプライブラリビルダーによって大雑把に扱われ、同じ名前の識別子の大文字と小文字を区別します。それらの識別子が異なる役割を持つ場合でも。つまり、「index」という名前のメソッドパラメータは、メソッド名「Index」を強制的に「index」にリケースします。あなたが想像するかもしれないように、それはかなり多くの頭を引っかくことを引き起こしました:)


6

VBがある場合の保存(IDEで)が、ケース・小文字を区別しません。ある意味でWindowsファイルシステムのようなものです。Hello.txtとhello.txtは同じファイル名と見なされます。

IDEは、変数の宣言がその変数の「正しい」ケースであると想定し、その変数のすべてのインスタンスを宣言に合わせて調整します。これは、見栄えと一貫性の理由からこれを行いますが、機能性のためではありません。

宣言に一致するようにケースが自動的に変更されなかった例をいくつか見ましたが、ステートメントはまったく同じように機能します。また、テキストエディターを使用して、さまざまなケースで問題なくコンパイルされるコードを作成することもできます。

補足:

ほとんどの人々は、大文字と小文字を区別しない方法で考えます。私たちが「犬」という言葉を見ると、その言葉は私たちの心の中で意味に翻訳されます。単語の意味は(すなわちかかわらず、もし呪文それは「DOG」、「犬」、または「DOG」はまだ樹皮の。)場合に基づいていない コンピュータでは、ビットの個別の袋などの単語を参照してください。大文字と小文字は異なるビットパターンであるため、異なります。

ほとんどのプログラマーは人間なので、大文字と小文字を区別しないことは、人々が考える方法により適応しているようであり、大文字と小文字を区別することは、人間がマシンの制約にどう考えるかを適応させることについてです。


4
プログラマーがオブジェクトとクラスを区別する必要があることを除いて、そうするために伝統的にそうするために変更を使用してきました(必要ではなく、単なる慣習)。そのためobject.method()Object.Method()オブジェクトおよびクラスの参照とメソッドとして即座に認識されます(そのコーディング規約に準拠している場合)。英語と同様に、固有名詞と文頭を大文字で区別します。ですから、読んだりプログラミングしたりするときに、大文字と小文字を区別しないとは思いません。
Jason S

@ジェイソン、それはあなたが慣れていることのすべてです。新しいCプログラミングの学生は、最初は大文字と小文字の区別について無数の不満を示し、その後、いくつかのコースを経て慣れます。object.method()とObject.Method()は単なる慣例であり、大文字と小文字を区別する最も強力なケースです。tempとTempという名前の2つの変数が同じスコープ内にある別のユーザーが作成したプログラムを変更する必要があり、それらを頭の中でまっすぐに保つことが非常に困難であったことを説明します。また、大文字で共通名詞を認識することもありますが、「ボブ」と「ボブ」という言葉は頭の中で同じ意味です。
Andrew Neely、2011

IDEがそのケースで大文字と小文字を保持するのはなぜですか?(ごめんなさい)。MSの設計者は、脳にはケースに意味があると考えているため、IDEはケースを保持していると思います。しかし、現実にはVB IDEを考慮formし、Form混乱、とにかく私にはある、と同じ。場合には(申し訳ありません再び)、のtempTemp簡単に名前を変更するためにC#でリファクタリングツールを使用することができますTempするbobTempか、何でも。しかし、私はいくつかのVBを維持しており、誰かが行って行っていDim form As Formます。名前を変更すると、クラス参照とオブジェクト参照の両方の名前が変更されます。ブレア!
ジェイソンS

@ジェイソン、VBではいつも「フォームを暗くする」と言いますが、余談です VBは、検索での大文字と小文字の区別をサポートします。また、「As Form」を検索して「somethingstupid」に置き換え、フォームの名前を適切な名前に変更してから、「somethingstupid」の名前を「As Form」に戻します。私は実際に大文字と小文字を変更するのが好きです。変数名をファットフィンガーしていないことを確認するためです。
Andrew Neely、2011

ええ、でもこれは、名前が同じ(またはVBで大文字と小文字のみが異なる)ときにクラスとインスタンスの参照を区別するリファクタリングツールに代わるものではありません。C#リファクタリングツールはそれを実行できるようです。クラスとインスタンスに同じ名前を付けていません。C#では大文字と小文字を区別して使用しますが、VBではそれができないため、先頭に文字を使用します。明らかに私の問題は、同じ名前を使用している他の誰かのコードを管理していることです。しかし、この議論はコメントに対して大きすぎますので、ここに残します。
Jason S

5

これは、使用しているエディタの一部であり、動作が異なる場合がありますが、Visual Basicは実際には大文字と小文字を区別しない言語です。だから、ssSS同じです。

詳細については、VB.NETの基本チュートリアルをご覧ください。


おお、それは面白いです。この詳細を調べる場所はありますか?まだテストしていませんが、VBScriptについて考えると、正しいかもしれません。
トッドメイン

@オタク:私の回答をもう一度ご覧ください。リンクを提供しました。ありがとう
Sarfraz、2010

私はVBに精通しています。ありがとう:)そのページで何を見てほしいのかわかりません。
Todd Main、

3

分かりますか?VBは大文字と小文字を区別しないため、ssとSSは同じ変数であるため、コンパイラーは変数を再宣言したことを正しく報告します。

変数では大文字と小文字は区別されませんが、関数名では区別されます。


しかし、使用ssして後で入力すると、SSはに自動修正されますss。これにより、コンパイラーが実際に大文字小文字を区別していると私は確信します。
トッドメイン

5
@oTAKU:コンパイラではなくIDEが大文字と小文字を変更します。
John Saunders

2
VBはまだケースについてはあまり気にしていません。IDEは、変数が全体的に同じになるようにコードをクリーンアップしようとしています。
Guitarthrower、

1

はい、VBは大文字と小文字を区別しません。それは時々ループの少しの間それに慣れていないものを投げます。


1

VB.NETでは、識別子の大文字と小文字の異なる "スペル"を使用してコードを作成するために、VB.NETでそれほど努力する必要はありません。「名前の変更」機能を使用せずに宣言されたファイルの識別子の大文字と小文字を変更しても、他のファイルで名前が更新されることはありませんが、名前を含む行を編集すると、現在の定義に準拠します。

このようにして、VB.NETはほとんど大文字と小文字を区別しないと判断できますが、CLRが識別子の大文字と小文字を区別して使用する可能性があります。


1

私がこれを提供できるのは、80年代前半のプログラミングの教科書から思い出すと、コンパイル時のエラーを減らすことを厳密に目的とした(当時の)センシティブな言語でした。つまり、「厳密さ」は、より正確なコーディング規則を開発することを目的としていました。変数、クラス、メソッド、関数などの適切なラベル付けが追加されたことが判明したので、そこに追加したいものも進化しました。

それらの書籍のほとんどすべてに、大文字、小文字などの主要な推奨パターンが含まれていたことを思い出します。ご存じのとおり、それらの多くは捨てられているか、実際には無視されています。 CASEソリューション、またはより高いスキルレベルに達したソリューション。誰もがこの学習曲線を経験すると思います。

これらの言語とIDEの進歩を考えると、より良い質問は、どの言語が私の開発時間を改善するのですか?もちろん、さまざまな言語のそれぞれに慣れていない場合、オプションは制限されます。


1

2つ目の質問にお答えします。

「これは、VB.NETのケースがコードで何ができるかを何らかの形で制限している場合、私がC#への移行を検討するのに十分説得力がありますか?」

C#を使用してWCF WebServiceを作成します。DataContract(1クラス)を作成します。「文字列メール」プロパティを持つもの。別のプロパティとして「文字列メール」を持つ別のもの。個人のメールまたはオフィスのメールとして理解するためのあなたの選択。または、2つの異なるDataContractsにある場合もあります。

C#の場合はこれで問題ありません。Webサービスは正常に作成されています。C#プログラムは簡単にWSDLを作成でき、すべて問題ありません。

次に、VB(任意のバージョン)でWSDLを作成してみます。「email」はすでに宣言されていると表示され、WSDLの生成は失敗します。

みんなと同じように、これはVB言語の欠点だと思いました。だが!!!

FxCOPを使用して、元のC#コードを分析します。FxCOPは、電子メール/電子メールの使用が問題であると述べています。大文字と小文字を区別しない別の名前を使用することをお勧めします。また、現時点では、.NETフレームワークには106のプログラミング言語があり、大文字と小文字の区別がオンになっている多くの言語があります。私たちは皆、クラウドに移行しており、すべてのプログラミングプラットフォーム/言語からサービスにアクセスできるようにしたいと考えています。

したがって、大文字と小文字を区別することはプログラム内での選択であり、Cの人ならそれを好みます。プログラムが他のC以外のプログラムによって使用/アクセスされる場合は、大文字と小文字を区別せずにサポートする必要がありますが、言語はあなたの選択です。

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


クラウドは、大文字と小文字を区別するURIを使用します(これは特にプロキシとキャッシュサーバーにとって重要です)。
binki 2017

1

シンボルの非表示(例:ローカル非表示フィールド)も大文字と小文字を区別しません。

次に例を示します。

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

VB.NETコンパイラの出力は、次のC#に逆コンパイルされます(したがって、これに相当します)。

public class C
{
    public string Name;

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

string.Equalsフィールドに2回渡されます。ケースに関係なく、ローカルは非表示になります。言語は大文字と小文字を区別しません。

このフィールドなどのaメンバーを明示的に参照するには、次のようにしてメンバーを逆参照する必要がありますMe

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

0

「2:VB.NETのケースがコードで何ができるかを何らかの形で制限している場合、これはC#への移行を検討するのに十分な説得力がありますか?」

プログラマーのオプションを制限するのではなく、C#がプログラマーに選択させるより多くのオプションのアプローチを好みます。私はC#を非常に好みますが、大文字と小文字を区別するだけでも、大文字と小文字を区別するという理由だけで言語の学習に近いとは思わないでしょう。すべての機能が重要であり、C#とVB.NETの両方の利点を見ると、C#を非常に好みます。しかし、私は好みを持っているため、真のバランスの取れた視点を提供します。そうです、私は好みがありますが、C#の欠点についても正直になります。

まず、両方の言語には長所と短所があります。ありがたいことに、マイクロソフトは両方の言語を改善しており、どちらの言語に対しても不公平な偏見を見せていないように見えるため、一方の言語では実行でき、もう一方の言語では実行できない違いは減少しています。

C#が最初に登場したとき、VBにはメソッドの前に配置できるXMLコメントがありませんでした。これはC#で気に入っていました。VB.NETではそれが嫌いでした。しかし、私は何年にもわたって見てきましたが、1つの言語にない多くの機能が他の言語に追加されています。(MS開発者の同じチームがC#とVBの両方を開発するので、機能が非常に似たものになるはずです。)

しかし、VBにはないC#の機能を要求しました。ここに私がすぐに考えることができるいくつかがあります:

1:C#はより簡潔で、タイピングが少なくて済みます。私は反対の主張がなされたときに愚かさが話すことさえ見ました、そのVBはタイピングを節約します。ただし、両方の言語を使用していて、どちらもほとんど使用されていないという話を聞いてください。私は両方のC#を使用しますVB、自宅でC#を使用するのが好きなため(および職場でC#を使用する場合)、C#ではなくVBを使用するという最近のジョブリクエスト。VBをより頻繁に使用するようになりましたが(今から約10か月間)、個人的な証言では、C#のほうがずっと好きです。私が読んだ例の1つは、実際にVBの方が簡潔だと言ったところですが、withに長い変数を使用した「with ...」の例を示したため、VBでは「.property」を使用できます。これは、VBに必要なタイピングが少ないと主張するのは愚かです。この例だけでなく、VBが短い場合もいくつかありますが、実際には、C#の方が簡潔な場合はさらに多くなります。

C#の方が簡潔であると私が思う最大の理由は、VBの冗長な "IF / THEN"ステートメントです。ステートメントが共通する場合。C#では、入力する「その後」の単語はありません。:)また、すべての 'end ...'ステートメントは、c#では通常、1つの閉じ中かっこ '}'を入力する必要があります。いくつかの人々は、VB.NETのこの冗長性がVBの利点であると主張していることを読んだことがあります。これは、いくつかの終了ブロックステートメント/シンボルを入れ子にして、すぐ隣で終了できるためです。次のコードリビジョンをより適切に設計できるため、ほとんどの場合、C#またはVBのいずれかで他のプログラマよりも優れたプログラムを書くことができます。これは、「C#での多数の閉じ括弧の混乱」に適用されます。さらに、ネストされたブロックがいくつかのネストされたIFのようにすべて同じタイプの場合、VBはC#と同じ問題を抱えます。これはVBでは利点がありません。この状況こそが、私の終結記号または終結ステートメントが両方の言語で何に当てはまるかをコメントしたい理由です。はい、これはもっと冗長ですが、どちらの言語でも、明確にするオプションがあります。これは、判断に基づく特定の状況で重要です。コードの明快さは非常に重要だと思います。

2:VBには複数行コメントはありません。私がVBで作業したときは気にしませんでした。その後、いくつかのCスタイルの言語に行きました。今私は仕事でVB.NETを使用して戻ってきて、私はそれらが恋しいです。それはあなたが便利だと思ったものであり、それから失う必要があります。:(

3:VBの「andalso」と「orelse」は、C#では「&&」と「||」の場合、すべてを入力するのはかなり面倒です。もう一度、タイピングを減らす これは、VBとC#の両方のコードで珍しいことではありません。機能に関しては、「OR」と「OrElse」のどちらが通常問題にならない場合を除き、「OrElse」の方がコンピュータの方が高速であるため、プログラマがVBで「Or」と「And」を使用するだけの場合、コードの明快さが好きな人。「Or」は「OrElse」よりもはるかに簡単にスキミングできます。

4:C#でのコード配置の柔軟性が向上しました。行が長く、次の行に折り返したい場合は、VB.NETによるコードの「制御」による再調整が嫌いです。C#はそれを少し行いますが、C#の方が便利です。しかし、これは言語自体ではなく、VB.NET IDEとC#IDEの違いです。しかし、両方が必要か、純粋にIDEの違いのない言語機能が必要かはわかりません。

5:私が本当に見逃しているのは、C#で新しいコードブロックを作成することだけです。メソッドで多くのことが発生する可能性があり、非常に小さなコードブロックで変数を宣言したいが、そのブロックの外側でその変数を宣言したくない場合メソッド全体。C#では、「{」で新しいブロックを作成し、「}」で終了するだけです。VBにはそのような機能はありませんが、最も近いのは無条件の「If True Then」ブロックと「End If」ブロックです。(2文字のC#と18文字のVB.NETで同等のものに再度注意してください... VBでさらに入力します。)

6:自己インクリメント:++と-のようにmyVariable++、または++myVariableまたは同等の減少バージョン。これは非常に便利です...時々。ここに私が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

そして、C#ルールの非常に良い例を示すために、これは私が最近個人的に書いたより多くのコードです:

// 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

おそらくこれは、C#がより簡潔であることを示す証拠です。しかし、すべてのプログラマーが簡潔さを好むわけではありません。一部の人は「if a <b then ...」と読むことを好むが、それは彼らの人間の言語にとってより自然だからである。そして、それで十分です。好みは結構です。私にとって、手作業はファクターiの値であり、「if」と「then」はアルファベットの記号であり、C#の「if(条件)ステートメント」であるので、誰でも好きな記号で考えることに慣れることができると思います。構文もシンボルです。一方は、プログラマー以外の構文に近いだけです。簡潔な方がいいです。

文字列ではなく文字リテラルにするために、VBで文字リテラルの後に「c」を使用する必要があるのも面倒です。私はC#の簡潔さとそれ以上のものが好きです。メソッドが文字リテラルを必要とする場合、1文字長の文字列ではなく文字を指定する必要があるため、":"cC#ではVBでの使用を強制される場合があります':'。私はこれが一生懸命であると思います。

公平を期すためにDim nameUpper$ = name.ToUpperInvariant、C#が空の括弧を必要とする場合のように、メソッド呼び出しの後に空の括弧を配置する必要がないように、VBに似ている利点があると言いますstring nameUpper = name.ToUpperInvariant()。またはそれをトリミングするようにそれを2倍にします:Dim nameUpper$ = name.Trim.ToUpperInvariantvs string nameUpper = name.Trim().ToUpperInvariant()$C#にこれらのショートカットがない場合、VBが上記のように「文字列として」暗くする方法を簡潔に使用するのが好きです。VBには、String、Integer、Long、Decimal、Single、およびDouble型のショートカットがありますが、デメリットは不明確になるため、注意して使用してください。それにもかかわらず、私は簡潔なコードを好みます。

まあ、それはこの熟練したプログラマーからのほんの一部のことであり、私が考えるように、これはC#対VBの私のプログラミング「証言」です。私の意見では、どちらも素晴らしい言語です。しかし、はい、まだC#を好みます。

ps私は自分の人生のほとんどをプログラムするつもりなので、最も効率的なキーボードであるDvorakキーボードを使ってタイプする方法を再学習しました。調べる。多分あなたも切り替えたいかもしれません。;)入力が67%簡単になりました!:)私はだれでも自由に考え、あなたの仕事のより良い効率を評価することを勧めます。Dvorak Simplified Keyboard Layout and C#がこれを行いました。:)

PSS iは、QwertyキーボードレイアウトとVBをEmpirial測定とは対照的に、DvorakとC#をメトリックと比較します。Dvorak、metric、C#は「クリーン」です。しかし、VBはそれほど遅れていません。ただし、「Or」や「OrElse」、「IIF()」など、古いVB6コードや以前の.NETコードとの下位互換性が必要になるという欠点があります。

慎重に仕上げます。自分が何を話しているのか本当にわからない人の話を聞いてください。VBとC#の両方に対するすべての短所の半分はません問題はもうなくなり、人々はまだ、言語に実際にどのような欠点があるのか​​を知らないという投稿をしています。私が考えることができる最良の例は、VBでのトリプルアポストロフィまたはC#でのトリプルスラッシュコメント記号を使用するメソッドのXMLコメントです。しかし、人が無知から話しているのか、それとも経験から話しているのか、自分で見分けてください。個人的な証言とは、彼らが実際の経験から知っていることを意味します。そして、誰かがそれに多くの経験を積んだ後、あなたの耳を元気づけます。C#とVBの両方で10年以上の経験があります。結局のところ、どちらも(非常に)優れた言語です。そして、ほとんどの違いは、コードを読んでから5分以内にすぐにわかります。しかし、はい、ハンディキャップを見つけるのに何年もかかるかもしれない他の機能。そして、私が知っているハンディキャップ(C#で)、私は それが役立つであろう実際の生活状況についても考えます。結局のところ、それはおそらくハンディキャップではありません。

幸せなコーディング!


すべての詳細に感謝しますが、あなたの例では、C#がどういうわけか「より良い」のかを示すために(私が知る限り)大文字と小文字の区別を使用していません。
トッドメイン

私は直接的な例で2番目の質問に答えようとしました。
Venkat

@ToddMain、正しい。また、私の例では、大文字と小文字の区別を使用してC#の方が優れている理由を示していません。理由は、大文字と小文字の区別が優れている理由が質問に含まれていないためです。さらに、この機能はそれ自体が意味をなしていると思います。そして、私はそのロジックは、ほとんどの人がそれを自分で推測できる基本的なenufであると信じています。しかし、誰かが尋ねた場合、私は彼らが論理を介してステップするのを手伝って幸せです。しかし、私の意見では、私の友人は別の質問です。;)
Shawn Kovac 2017年

実際、それは元の投稿で尋ねられた2つの質問の1つでした。それは自明ではないので、私は尋ねました。しかし、質問に対処しないことについての心配はありません。
トッドメイン

@ToddMain、私はあなたの要点を見ます。非常に公正なポイントです。:)これに私の目を開いてくれてありがとう。:)
Shawn Kovac 2017年

0

VB.NETは大文字と小文字を区別しません。

例:

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

これらすべてのコードはCOMPILE-TIME ERRORをスローします。

最初の例では、「ローカル変数 'A'はすでに現在のブロックで宣言されています。」というエラーが表示されます。

2番目と3番目の例の場合、「 'Public Sub b()'には、同じシグネチャを持つ複数の定義があります」というエラーが表示されます。および「「パブリック関数c()As Integer」には、同じシグネチャを持つ複数の定義があります。」

これらのエラーから、エラーは変数およびプロシージャ/関数の異なる位置でスローされることに注意してください。変数の場合、2番目の宣言でエラーがスローされますが、プロシージャ/関数の場合、同じコードの1番目の宣言/定義でエラーがスローされます。

上記のコメントでユーザーが述べたように、VB.NETコードはバックグラウンドで継続的にチェックまたは修正されます。このエラーは、VS IDEの[エラーリスト]ウィンドウで確認できます。また、これはエラーであり警告ではないため、エラーが解決されるまでコードはコンパイルされません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.