124

ここで議論を始めるつもりはありませんが、何らかの理由で、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# を学びたいという熱烈な欲求はありませんが、Visual Basic では提供されていない C# の提供を見逃していることがある場合 (VB.NET がXML リテラルを提供していることは反対です)、その機能について詳しく知ることができます。したがって、この場合、C 言語では大文字と小文字が区別され、それは良いことであり、Visual Basic では大文字と小文字が区別されないことは悪いことであるとよく言われます。知りたい...

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

14 に答える 14

110

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

Jonathanが言うように、プログラミングの場合、VB.NETは、文字列の比較、XML、およびその他のいくつかの状況を除けば、大文字と小文字を区別しないと考えることができます...

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

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

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

編集IDEを方程式から外したい場合は、いつでもコマンドラインからコンパイルできます。メモ帳でコードを編集して、ssコンパイラSSが何をするかを確認します。

.NETFramework設計ガイドラインの45ページにあるJeffreyRichterからの引用を編集します。

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

于 2010-02-20T11:17:23.410 に答える
22

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

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

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

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

于 2010-02-20T19:30:15.340 に答える
16

VB はほとんど大文字と小文字を区別しませんが、例外があります。たとえば、XML リテラルと理解では大文字と小文字が区別されます。T-SQL などとは異なり、通常、文字列比較では大文字と小文字が区別されますが、文字列比較で大文字と小文字を区別しないようにするコンパイラ スイッチがあります。もちろん、継承、COM、および動的言語ランタイムを扱う際のエッジ ケースもあります。

于 2010-02-20T04:55:11.247 に答える
9

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

2 つの識別子が異なると見なされるためには、大文字と小文字だけでなく、それらが異なる必要があります。

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

于 2010-02-20T12:10:26.850 に答える
7

VB は(IDE で)大文字と小文字を保持しますが、大文字と小文字を区別しません。ある意味、Windows のファイル システムに似ています。Hello.txt と hello.txt は同じファイル名と見なされます。

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

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

補足:

ほとんどの人は、大文字と小文字を区別しない方法で考えます。「犬」という言葉を見ると、その言葉は私たちの心の中で意味に翻訳されます。単語の意味は大文字と小文字に基づいていません (つまり、「DOG」、「DoG」、または「dOG」の綴りに関係なく、吠えます)。 コンピューターは単語を個別のビットの袋として認識します。大文字と小文字は異なるビット パターンであり、したがって異なります。

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

于 2011-07-29T17:22:13.423 に答える
5

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

詳細については、VB.NET Basics チュートリアルをご覧ください :)

于 2010-02-20T04:05:50.463 に答える
3

私はあなたを理解しているかどうかわかりませんか?VB では大文字と小文字が区別されないため、ss と SS は同じ変数であるため、コンパイラは、変数が再宣言されたと正しく警告します。

変数は大文字と小文字を区別しないと思いますが、関数名は区別します。

于 2010-02-20T04:06:31.783 に答える
1

はい、VB は大文字と小文字を区別しません。慣れていない人を少しループさせてしまうことがあります。

于 2010-02-20T04:07:15.153 に答える
1

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

このようにして、VB.NET はほとんど大文字と小文字を区別しないと判断できますが、大文字と小文字を区別する方法でその情報を使用できる CLR で識別子の大文字と小文字を使用できるようにします。

于 2010-07-14T21:56:38.333 に答える
1

私が 80 年代初頭にプログラミングの教科書から思い出すように、大文字と小文字を区別する言語は (当時) コンパイル時のエラーを減らすことを厳密に意図していたということしか言えません。つまり、「厳密さ」は、より正確なコーディング規律を開発することを目的としていました。変数、クラス、メソッド、関数、およびそこにスローしたいその他のものの適切なラベル付けの追加が判明したため、同様に進化しました。

それらの本のほとんどすべてに、先頭の大文字、小文字などの推奨パターンが含まれていたことを思い出します。ご存知のように、その多くは捨てられているか、実際には無視されています。ハイエンドの制作会社を除いて、 CASEソリューション、またはより高いスキルレベルに達した人向け。誰もがこの学習曲線を経験していると思います。

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

于 2013-05-17T14:36:24.600 に答える
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()' には同一の署名を持つ複数の定義があります」というエラーが表示されます。および「'Public Function c() As Integer' には、同一のシグネチャを持つ複数の定義があります。」、それぞれ。

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

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

于 2012-10-05T07:54:30.493 に答える