私はここで議論を始めようとはしていませんが、何らかの理由で、Visual Basicは大文字と小文字を区別せず、C言語はそうではないと一般的に述べています(そしてそれはどういうわけか良いことです)。
しかし、ここに私の質問があります:Visual Basicの大文字と小文字を区別しないのはどこですか?入力するとき...
Dim ss As String
Dim SS As String
...- Visual Studio 2008 または Visual Studio 201 IDEの場合、2番目のIDEには「Local variable SS
」という警告が表示されます現在のブロックで既に宣言されています」。 VBA VBEでは、すぐにエラーをキックするのではなく、ケースを自動修正するだけです。
Visual Basicでは大文字と小文字が区別されないというこの議論で何かが欠けていますか? (また、あなたが答えを知っている、または気にするなら、なぜそれが悪いことでしょうか?)
なぜこの質問をしているのですか?
私は何年もの間、方言の多くでVisual Basicを使用してきました。時には趣味で、ワークグループの小規模ビジネス関連のプログラムで使用することもありました。過去6か月の時点で、私は予想をはるかに上回る大きなプロジェクトに取り組んできました。サンプルソースコードの多くはC#にあります。私はC#を習得する熱烈な欲求はありませんが、Visual BasicにはないC#の提供に欠けているものがある場合(VB.NETが提供するのは逆です XMLリテラル )、その機能についてもっと知りたいです。そのため、この場合、C言語では大文字と小文字が区別され、それが適切であり、Visual Basicでは大文字と小文字が区別されず、それが悪いと主張されることがよくあります。知りたい...
VBAと VB.NET の違いは、VB.NETがバックグラウンドで継続的にコンパイルされるためです。 VBAをコンパイルするとエラーが発生します。
Jonathan says のように、プログラミングするとき、VB.NETは文字列比較、XML、および他のいくつかの状況とは別に、大文字と小文字を区別しないと考えることができます...
あなたは内部にあるものに興味があると思います。さて、.NET共通言語ランタイムは大文字と小文字を区別するであり、VB.NETコードはランタイムに依存しているため、実行時に大文字と小文字を区別する必要があることがわかります。変数とメソッドを検索しているとき。
VB.NETコンパイラーとエディターを使用すると、コード内で大文字と小文字を修正するため、これを無視できます。
動的な機能またはレイトバインディング(Option Strict Off)をいじると、基礎となるランタイムで大文字と小文字が区別されることを証明できます。それを確認する別の方法は、C#のような大文字と小文字を区別する言語が同じランタイムを使用するため、ランタイムが明らかに大文字と小文字を区別することを理解することです。
[〜#〜] edit [〜#〜] IDEを式から外したい場合、コマンドからいつでも compile- line 。 Notepad のコードを編集して、ss
とSS
が含まれるようにし、コンパイラーの動作を確認します。
[〜#〜] edit [〜#〜]Jeffrey Richter からの引用( .NET Framework Design Guidelines ページ45)。
明確にするために、CLRでは実際に大文字と小文字が区別されます。 Visual Basicなどの一部のプログラミング言語では、大文字と小文字が区別されません。 Visual BasicコンパイラがC#などの大文字と小文字を区別する言語で定義された型へのメソッド呼び出しを解決しようとすると、コンパイラ(CLRではなく)がメソッド名の実際の大文字と小文字を判別し、メタデータに埋め込みます。 CLRはこれについて何も知りません。現在、リフレクションを使用してメソッドにバインドしている場合、リフレクションAPIは大文字と小文字を区別しないルックアップを行う機能を提供します。これは、CLRが大文字と小文字を区別しない程度です。
ここでの問題の一部は、言語をIDEエクスペリエンスから分離する必要があることです。
言語として、 VB.NET は確かに識別子に関して大文字小文字を区別しません。 DateTime.Parse
とdatetime.parse
を呼び出すと、まったく同じコードにバインドされます。また、C#などの言語とは異なり、大文字と小文字のみが異なるメソッドまたは型を定義することはできません。
IDEとして、VB.NETはコードのブロックをきれいにリストするときに、既存の識別子の大文字小文字を保持しようとします。コードの現在の論理行から移動すると、プリティリストが発生します。この場合、SS
の2番目の宣言から離れると、きれいなリスターはその名前の既存の識別子があることに気付き、大文字と小文字が一致するように修正します。
ただし、この動作はユーザーの付加価値として純粋に行われます。コア言語の一部ではありません。
VBは大部分大文字と小文字を区別しませんが、例外があります。たとえば、XMLリテラルと内包表記では大文字と小文字が区別されます。 T-SQLとは異なり、文字列比較では通常大文字と小文字が区別されますが、文字列比較で大文字と小文字を区別しないようにするコンパイラスイッチがあります。そしてもちろん、継承、COM、および動的言語ランタイムを扱う際にEdgeのケースがあります。
はい、VB.NETコンパイラは大文字と小文字を区別しない方法で識別子を処理します。もちろん、別の言語で記述されたアセンブリを使用したり、COMコンポーネントを使用したりすると、問題が発生する可能性があります。前者の場合は Common Language Specification でカバーされています。関連するルールは次のとおりです。
2つの識別子が区別されると見なされるには、大文字と小文字の違いだけで異なる必要があります。
COMの場合は、タイプライブラリビルダーによって大雑把に処理され、同じ名前の識別子の大文字と小文字が同一になるように強制されます。それらの識別子に異なる役割がある場合でも。言い換えると、「index」という名前のメソッドパラメータは、メソッド名「Index」を強制的に「index」に変換します。あなたが想像するかもしれませんが、それはかなり多くの頭の傷を生み出しました:)
VBは大文字と小文字を区別(IDE内)ですが、大文字と小文字を区別しないです。ある意味、Windowsファイルシステムのようなものです。 Hello.txtとhello.txtは同じファイル名と見なされます。
IDEは、変数の宣言がその変数の「正しい」ケースであると想定し、その変数のすべてのインスタンスを宣言と一致させる。これは見た目と一貫性の理由で行うが、機能のためではありません。
宣言に一致するようにケースが自動的に変更されず、ステートメントがまったく同じように機能するいくつかのインスタンスを見てきました。また、任意のテキストエディターを使用して、さまざまなケースで問題なくコンパイルできるコードを作成できます。
サイドノート:
ほとんどの[〜#〜] people [〜#〜]は、大文字と小文字を区別しない方法で考えます。 「犬」という言葉を見ると、その言葉は心の中で意味に翻訳されます。 Wordの意味は大文字と小文字に基づいていません(つまり、スペルが「DOG」、「DoG」、または「dOG」であるかどうかにかかわらず、stillえます)。[〜#〜] computers [〜#〜] =単語を個別のビットの袋として見る。大文字と小文字は異なるビットパターンであるため、異なります。
ほとんどのプログラマーは人間であるため、大文字と小文字の区別は人々の考え方により適合しているように見え、大文字と小文字の区別は人間が機械の制約にどのように考えるかについて適応しているようです。
これは使用しているエディタの一部であり、動作が異なる場合がありますが、実際はVisual Basic really is大文字と小文字を区別しない言語です。したがって、ss
とSS
は同じです。
私はあなたを理解しているかわかりませんか? VBは大文字と小文字を区別しないため、ssとSSは同じ変数であるため、コンパイラは変数を再宣言したことを正しく通知します。
変数は大文字と小文字を区別しませんが、関数名は区別すると思います。
はい、VBは大文字と小文字を区別しません。時々ループに慣れていない人をスローします。
私がこれを提供できるのは、80年代前半のプログラミング教科書で思い出したように、大文字小文字を区別する言語は(当時)コンパイル時間エラーを減らすことを厳密に意図していたということです。つまり、「厳格さ」は、より正確なコーディング規則を開発することを目的としていました。変数、クラス、メソッド、関数、およびそこに投入したいものに適切なラベルを追加することが判明したため、同様に進化しました。
私は、それらの本のほとんどすべてが、大文字の大文字、小文字などの推奨パターンを含んでいたことを思い出します。ご存知のように、それらの多くは捨てられています。 CASEソリューション、またはより高いスキルレベルに達した場合。誰もがこの学習曲線を経験すると思います。
これらの言語とIDEの進歩を考えると、より良い質問になります。どの言語が開発時間を改善しますか?もちろん、さまざまな言語のそれぞれに精通していない場合、選択肢は限られています。
シンボルの非表示(ローカルの非表示フィールドなど)も大文字と小文字を区別しません。
例 は次のとおりです。
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回渡されます。ローカルは、大文字小文字に関係なく隠されています。言語は大文字と小文字を区別しません。
このフィールドなどのメンバーを明示的に参照するには、Me
を介してメンバーを間接参照する必要があります。
Return String.Equals(name, Me.Name) ' differentiate field from local
VB.NETで識別子の大文字/小文字の異なる「つづり」を使用してコードを作成するために、それほど難しいことをする必要はありません。 「名前変更」機能を使用せずに宣言されているファイルの識別子の大文字小文字を変更しても、他のファイルの名前は更新されませんが、名前を含む行を編集すると、現在の定義に準拠します。
このようにして、VB.NETは大部分が大文字と小文字を区別しないと判断できますが、大文字と小文字を区別する方法でその情報を使用する可能性のあるCLRが識別子の大文字と小文字を利用できるようにします。
2番目の質問に答えてみます。
「これは、VB.NETのケースがコードでできることを何らかの形で制限している場合、C#に移行することを検討するのに十分に魅力的ですか?」
C#を使用してWCF WebServiceを作成します。 DataContract(1クラス)を作成します。 「string email」プロパティを持つもの。別のプロパティとして「文字列メール」を持つ別の。個人のメールまたはオフィスのメールとして理解するための選択。または、2つの異なるDataContractsにある可能性があります。
C#の場合、これで問題ありません。 Webサービスは正常に作成されます。 C#プログラムはWSDLを簡単に作成でき、すべてが問題ありません。
ここで、VB(任意のバージョン)でWSDLを作成しようとします。「メール」は既に宣言されているため、WSDL生成は失敗します。
みんなと同じように、これはVB言語の欠点だと思った。しかし!!!
FxCOPを使用して、元のC#コードを分析します。 FxCOPは、電子メール/電子メールの使用が問題であると述べています。大文字と小文字を区別しない別の名前を使用することをお勧めします。また、日付時点で.NETフレームワークには106個のプログラミング言語があり、大文字と小文字を区別する多くの言語があることに注意してください。私たちはすべてクラウドに移行しており、すべてのプログラミングプラットフォーム/言語でサービスにアクセスできるようにしたいと考えています。
したがって、プログラム内で大文字と小文字を区別することはあなたの選択であり、もしあなたがCの男ならあなたはそれを好むでしょう。プログラムが他の非Cプログラムによって使用/アクセスされる場合、大文字と小文字を区別しないようにする必要がありますが、言語は選択できます。
http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Visual_Basic_.NEThttp://www.vbrad.com/article.aspx?id=65
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番目の宣言でエラーがスローされますが、プロシージャ/関数の場合、同一コードの最初の宣言/定義でエラーがスローされます。
上記のコメントの中でユーザーが言ったように、VB.NETコードはバックグラウンドで継続的にチェックおよび/または修正されます。このエラーは、VS IDEの[エラーリスト]ウィンドウで確認できます。 これはエラーですおよび警告ではありませんのように、エラーが解決されるまでコードはコンパイルされません。
最後にあなたの明示的な2番目の質問に誰もコメントしていません:「2:これは、VB.NETのケースがコードでできることを何らかの形で制限している場合、C#に移行することを検討するのに十分魅力的ですか?」
私は、プログラマーのオプションを制限するよりもプログラマーがC#で選択できる、より多くのオプションアプローチを好みます。私はC#を非常に好んでいますが、大文字と小文字を区別するだけでは、大文字と小文字を区別するという理由だけで言語の学習に近いとは思いません。すべての機能が重要であり、C#とVB.NETの両方の利点を見ると、C#が非常に好きです。しかし、私は好みがありますので、私はあなたに本当のバランスのとれた視点を与え、はい偏っていますが、C#の欠点についても正直です。
まず、両方の言語には長所と短所があります。ありがたいことに、Microsoftは両方の言語を改善しており、どちらの言語に対しても不公平な偏見を見せていないように見えるため、一方の言語ではできない違いを小さくしています。
c#が最初に登場したとき、VBにはメソッドの前に置くことができるXMLコメントがありませんでした。これはC#で大好きでした。 VB.NETではそれが嫌いでした。しかし、私は長年にわたって、ある言語にはない多くの機能が他の言語に追加されることを見てきました。 (MS開発者の同じチームがC#とVBの両方を開発しているため、機能が非常によく似ているはずです。)
しかし、あなたはVBにはないC#が何であるかを尋ねました。ここに私がすぐに考えることができるものがあります:
1:C#はより簡潔で、入力が少なくて済みます。 VBが入力を節約するという反対の主張がなされたとき、私は愚かさを話すことさえ見ました。ただし、両方の言語を使用しており、どちらの言語もほとんど使用されていないという話を聞いてください。私はC#and VB、自宅でC#が好きなので(そして職場でC#を使用するとき)、C#ではなくVBを使用する最近のジョブリクエストの両方を使用します。そのため、VBの使用頻度が増えています(約10か月間)が、私の個人的な証言では、C#を好みます。実際のタイピングに関しては、VBはかなり多くのタイピングです。誰かが実際にVBと言ったところを読んだ1つの例は、より簡潔で、withに長い変数を含む「with ...」の例を示したので、VBでは、単に「」を使用できます。プロパティ」。これは、VBの入力が少なくて済むと主張するのは愚かです。 VBが短い場合(この例だけでなく)がいくつかありますが、実際にはC#がより簡潔な場合が多くあります。
しかし、C#がより簡潔だと思う最大の理由は、VBの冗長な「IF/THEN」ステートメントです。 if文が一般的です。 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でははるかに制御しやすくなっています。しかし、これは言語そのものではなく、VB.NET IDE対C#IDEに近いものです。しかし、IDEの違いのない両方の言語機能が必要か、純粋に言語機能が必要かはわかりません。
5:私が本当に見逃しているのは、C#で新しいコードブロックを作成することです。メソッドで多くのことが起こる可能性があり、非常に小さなコードブロックで変数を宣言したいのですが、そのブロックの外側で変数を宣言したくないメソッド全体。 C#では、「{」で新しいブロックを作成し、「}」で終了できます。 VBにはそのような機能はありませんが、最も近い一致は無条件の「If True Then」および「End If」ブロックです。 (2文字のC#と18文字のVB.NETが再び同等になっていることに注意してください...
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文字の長さの文字列ではなく文字を提供する必要があるため、C#では":"c
であるのにVBで':'
を使用せざるを得ないことがあります。私はこれが非常に簡単だと思う。
公平に言うと、C#が空の括弧を必要とするDim nameUpper$ = name.ToUpperInvariant
のように、メソッド呼び出しの後に空の括弧を配置する必要がないなど、VBのような利点があると言います:string nameUpper = name.ToUpperInvariant()
。または、それをトリミングするのと同じように2倍にします:Dim nameUpper$ = name.Trim.ToUpperInvariant
vs string nameUpper = name.Trim().ToUpperInvariant()
。 VBが上記の$
を使用して、C#にこれらのショートカットがない 'As String'を暗くする方法を簡潔に使用するのが好きです。 VBには、String、Integer、Long、Decimal、Single、およびDouble型のショートカットがありますが、欠点は明確ではないため、注意して使用します。それにもかかわらず、私は簡潔なコードを好みます。
まあ、それはこのベテランのプログラマーからのほんの一部であり、私が考えるように、これはC#対VBの私のプログラミング「証言」です。私の意見では、どちらもナイス言語です。しかし、はい、私はまだC#を好みます。
追伸私は人生のほとんどをプログラムする予定なので、最も効率的なキーボードであるDvorakキーボードを使用して入力するように再学習しました。これは、Qwertyキーボードよりも英語を入力するのに約1/3の労力がかかります。調べる。多分あなたも切り替えたいかもしれません。 ;)入力が67%楽になりました! :)私は誰もが箱の外で考え、あなたの仕事のより良い効率を評価することを奨励します。 Dvorak Simplified Keyboard Layout and C#がこれを実現してくれました。 :)
追伸QwertyキーボードレイアウトとVBをEmpirial測定とは対照的に、DvorakとC#をメトリックと比較します。 Dvorak、metric、およびC#は単なる「クリーン」です。しかし、VBはそれほど遅れていません。しかし、「Or」対「OrElse」、「IIF()」のように、古いVB6コードおよび.NET以前のコードと下位互換性を保つ必要があるという問題があります。
私は注意して終了します。自分が何について話しているのか本当に分からない人たちの話を聞くことをもっと慎重にしてください。 VBとC#の両方に対するすべての短所の半分はnotの問題であり、人々は依然として、言語に実際に存在する不利益について無知であると投稿しています。私が考えることができる最良の例は、VBのトリプルアポストロフィまたはC#のトリプルスラッシュコメントシンボルを使用するメソッドのXMLコメントです。しかし、人が無知から話しているのか、経験から話しているのかを自分で識別してください。個人的な証言とは、彼らが実際の経験から知っていることを意味します。そして、誰かがそれで多くの経験をした後、あなたの耳を元気づけてください。 C#とVBの両方で10年以上の経験があります。要するに、両方とも(非常に)良い言語です。ほとんどの違いは、コードを読んでから5分以内にすぐに確認できます。しかし、はい、ハンディキャップを見つけるのに何年もかかるかもしれない他の機能。そして、私が知っている1つのハンディキャップ(C#で)、私はそれが役に立つだろう現実の状況を考えることさえできません。おそらくそれは結局のところハンディキャップではないでしょう。
ハッピーコーディング!