「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文字長の文字列ではなく文字を指定する必要があるため、":"c
C#ではVBでの使用を強制される場合があります':'
。私はこれが一生懸命であると思います。
公平を期すためにDim nameUpper$ = name.ToUpperInvariant
、C#が空の括弧を必要とする場合のように、メソッド呼び出しの後に空の括弧を配置する必要がないように、VBに似ている利点があると言いますstring nameUpper = name.ToUpperInvariant()
。またはそれをトリミングするようにそれを2倍にします:Dim nameUpper$ = name.Trim.ToUpperInvariant
vs 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#で)、私は それが役立つであろう実際の生活状況についても考えます。結局のところ、それはおそらくハンディキャップではありません。
幸せなコーディング!