1

これは大丈夫ですC#

private int total;
public int Total {
    get {
        return total;
    }
}

したがって、バッキングフィールドのtotalスペルはと同じProperty Totalですが、の場合だけが区別されTます。

VB.NET私が次のことをしようとすると、VSで文句を言います。Return total実際、小文字で記述したり、大文字tに自動修正したりすることすらできません。T

ここに画像の説明を入力してください

しかし、バッキングフィールドのスペルを変えれば、問題ないようです。

Private fTotal As Integer
Public ReadOnly Property Total() As Integer
    Get
        Return fTotal
    End Get
End Property

それらは異なる言語であることに気づきましたが、この違いの背後に論理的な理由がありますか?(EDITは元々、「違い」ではなく「明らかな矛盾」と言っていました)

また、Visual StudioがVB.NETの大文字と小文字を自動修正すると思いますが、実際には、この言語では大文字と小文字が区別されませんか?

4

5 に答える 5

5

私はそれらが異なる言語であることを理解していますが、この明らかな矛盾の背後に論理的な理由がありますか?

元の理由は単純に歴史的なものです。VBはBASICに基づいており、当時の他の言語(FORTRAN)と同様に、大文字と小文字は区別されませんでした(ただし、通常はすべて大文字で記述されていました)。

さらに、矛盾は見られません。VBの内部では、ケーシングは完全に一貫しています。特に、タイトルが示すように、「大文字と小文字を区別する」わけではありません。

今日でも大文字と小文字を区別しない論理的な理由があります。名前の衝突のためにバグを導入するのが難しくなります。次のC#コードを検討してください。

private int total;

public int Total {
    get { return total; }
    set { Total = value; }
}

エラーをすぐに見つけましたか?もしそうなら、悪くはありません(ここでの構文のハイライトが役立ちます)。VBでは、このクラスのエラーは発生しません。しかし実際には、このクラスのバグは、一度特定されると簡単に排除できるため、それほど問題にはならないと思います。したがって、これが大文字と小文字を区別しない理由ですが、それほど強力なものではありません。

最後に、WindowsおよびOS XファイルシステムはここでVBと同じ規則を使用していることに注意してください。ファイルシステムは大文字と小文字を区別しませんが(ファイル名の大文字と小文字は関係ありません)、大文字と小文字を区別します。つまり、ファイルシステムはファイル名の元の大文字と小文字を保持して表示します。正しくはありますが、比較する場合、大文字と小文字は考慮されません。

于 2012-12-13T09:23:08.090 に答える
1

VB.NETは大文字と小文字を区別せず、Visual Basicプログラマーが簡単に習得できるように設計されており、この特性をVisualBasicと共有しています。

C#では大文字と小文字が区別され、VB.NETとは異なる言語です。両方が.NET開発に使用されている場合でも、一貫している必要はありません。.NET開発には多くの言語を使用できます。これらの言語の違いは多く、大文字と小文字の区別に限定されません。

于 2012-12-13T09:11:22.640 に答える
1

対処すべきいくつかのポイントがあります。

  • Visual Basicの言語では、常に大文字と小文字が区別されません。コンパイラは、ある方法で変数を宣言し、別の方法でそれを使用するかどうかを気にしません。

  • IDE(Visual Studio)は、実際の宣言と一致するように変数の使用法のケースを修正するのに役立ちます。設定でオフにできるかもしれませんが、試したことがないので、実際に可能かどうかはわかりません。

ここでコードに戻ります。

Private total As Integer
Public ReadOnly Property Total() As Integer
    Get
        Return Total
    End Get
End Property

ここには実際には2つのバグがあります。

  1. 同じ名前の2つのメンバー、というフィールドとtotalというプロパティがありますTotal。大文字と小文字を区別せずに比較されるため、これらは同じ名前です(コンパイラーは、これに対するエラーを表示します-スクリーンショットの青い波線)。

  2. フィールドではなくプロパティを実際に参照しているため、IDEはプロパティ内の「合計」を「合計」に自動修正します。このため、コンパイラはエラーを表示しませんが、フィールドを削除すると(プログラムがコンパイルされるように)、プロパティがそれ自体を呼び出すため、実行時にスタックオーバーフローが発生します。IDEのオートコレクトを無効にできたとしても、大文字と小文字を区別せずに検索されるため、プロパティを参照していることに注意してください。

于 2012-12-13T11:12:37.523 に答える
0

VB.Netコンパイラは、これまでのところ大文字と小文字を区別しないため、すべての目的と目的で、同じ名前のフィールドの使用と大文字または小文字の唯一の違いを禁止しています。

基盤となるCLI(共通言語インターフェース)とCLR(共通言語ランタイム)は、大文字と小文字の違いをサポートします。ただし、指定されたc#の例はCLSでは有効ではありません。

于 2012-12-13T09:12:58.990 に答える
0

実際、ここでの問題は、「total」という名前の別のケースフィールドとは何の関係もありません。そのフィールドを削除しても同じ問題が発生します。

問題は、VBでは、プロパティまたは関数と同じ名前の非表示のローカル変数を介してプロパティまたは関数から返される値をオプションで設定し、その非表示の変数を返すことができることです。

e.g., this will work:
Public ReadOnly Property Total() As Integer
    Get
        Total = 3  'setting the hidden VB variable
        Return Total 'returning the hidden VB variable
    End Get
End Property

この場合、VBではreturnステートメントを省略できます。

Public ReadOnly Property Total() As Integer
    Get
        Total = 3  'setting the hidden VB variable
    End Get 'since the hidden VB variable was set, it is returned implicitly
End Property

この種のVBイズムは、VBコードで実際に起こっていることを解釈することを非常に苛立たせる可能性があります。

于 2012-12-13T15:04:58.340 に答える