我没有看到任何人在最后对您明确的第二个问题发表评论:“ 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#和VB,在家中使用C#是因为我喜欢它(当我在工作中使用C#时),而我最近的工作要求我使用VB而不是C#。因此,我现在越来越频繁地使用VB(现在大约有10个月了),但是根据我的个人证词,我更喜欢C#,就实际类型而言,VB的类型要多得多。我读过的一个例子中有人实际上试图说VB更简洁,它给出了一个with例子,with中有一个长变量,因此在VB中,您可以只使用'.property'。这是愚蠢的,声称VB需要较少的键入。在实际实践中,有一些事情(不仅是这个示例)的VB更短,而C#更简洁的时候却更多。
但是我认为C#更简洁的最大原因是VB冗长的“ IF / THEN”语句。如果语句是通用的。在C#中,没有要键入的“然后”字!:)同样,所有的'end ...'语句也都使用c#键入,通常只是一个右括号'}'。我已经读到有些人声称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等价...更多在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 ...”,因为这对他们的人类语言来说更自然。那很好。首选项很好。对我来说,努力是我重视的一个因素,我认为任何人都可以习惯于思考自己喜欢的任何符号,因为“ if”和“ then”是字母符号,以及C#的“ if(条件)语句”;语法也是符号。一个比另一个更接近非程序员的语法。我喜欢简洁的。
我还认为需要在VB中的字符文字之后使用'c'使其成为字符文字而不是字符串是很烦人的。我更喜欢C#的简洁性。当方法需要字符文字时,您需要提供一个字符而不是一个字符长度的字符串,因此有时您不得不":"c
在VB中使用,而在C#中则必须使用':'
。我认为这是挑剔的。
公平地说,我想说VB有很多优点,例如不必在方法调用后放置空括号,例如Dim nameUpper$ = name.ToUpperInvariant
C#需要空括号的地方string nameUpper = name.ToUpperInvariant()
。或加倍喜欢修剪的效果:Dim nameUpper$ = name.Trim.ToUpperInvariant
vs string nameUpper = name.Trim().ToUpperInvariant()
。我喜欢VB的简洁用法,我只是在$
上面用它来将其调暗为“ As String”,而C#没有这些快捷方式。VB具有用于String,Integer,Long,Decimal,Single和Double类型的那些快捷方式,但是缺点是它不太清楚,因此我谨慎使用它。但是,尽管如此,我还是喜欢简洁的代码。
好吧,这只是这个经验丰富的程序员的一些建议,而且我认为,这是我对C#和VB进行编程的“见证”。我认为,两者都是不错的语言。但是,是的,我仍然更喜欢C#。
ps由于我打算一生中都要编程,所以我什至重新学习了使用最高效的键盘进行打字的方法:Dvorak键盘,与Qwerty键盘相比,它需要大约1/3的英文键入时间。查一下。也许您可能也要切换。;)使我的输入更加轻松67%!:)我鼓励任何人都跳脱思维,评估工作效率。Dvorak简化键盘布局和C#为我完成了此任务。:)
PSS i会将Dvorak和C#与公制进行比较,而不是Qwerty键盘布局,并将VB与Empirial进行比较。Dvorak,metric和C#只是“干净”的。但是VB并没有真正落后。但是它确实需要向后兼容旧的VB6代码和pre.NET代码,例如“ Or”和“ OrElse”以及“ IIF()”。
我谨慎行事。请谨慎行事,听不真正知道他们在说什么的人。针对VB和C#的所有弊端中有一半不是不再存在任何问题,人们仍然对它们不了解该语言实际上仍然存在哪些不利之处发表了看法。我能想到的最好的例子是在VB中使用三撇号或在C#中使用三斜杠注释符号的方法的XML注释。但是,请您自己分辨一个人是出于无知还是出于经验。个人证词意味着他们从实际经验中了解。等到某人有很多经验之后,再振作起来。我在C#和VB方面都有10多年的经验。归结为:两者都是(非常)好的语言。和大多数差异一样,您在阅读代码后的5分钟内即可看到。但是,是的,要找到障碍,其他功能可能还需要数年时间。我知道的一个障碍(在C#中),我可以 甚至不会想到一个有用的现实生活环境。所以也许这毕竟不是障碍。
编码愉快!