마지막에 귀하의 명시적인 두 번째 질문에 대해 언급 한 사람을 본 적이 없습니다. "2 : VB.NET 사례가 코드로 할 수있는 작업을 제한하는 경우 C #으로 이동하는 것을 고려하기에 충분히 설득력이 있습니까?"
저는 C #에서 프로그래머가 프로그래머의 옵션을 제한하는 것보다 선택할 수있는 더 많은 옵션 접근 방식을 선호합니다. 나는 C #을 매우 선호하지만 대소 문자 구분만으로는 대소 문자를 구분하기 때문에 언어를 배우는 것에 가깝다고 생각조차하지 않을 것입니다. 모든 기능이 중요하며 C #과 VB.NET의 장점을 모두 살펴보면 C #을 매우 선호합니다. 그러나 나는 당신에게 진정한 균형 잡힌 관점을 줄 것입니다. 예, 편견이 있습니다. 왜냐하면 나는 선호도가 있기 때문입니다. 그러나 나는 C #의 단점에 대해서도 솔직 할 것입니다.
우선, 두 언어 모두 장점과 단점이 있습니다. 고맙게도 Microsoft는 두 언어를 모두 개선하고 있으며 두 언어 모두에 대해 불공평 한 편파성을 보이지 않는 것 같습니다.
C #이 처음 나왔을 때 VB에는 내가 C #에서 좋아했던 메서드 앞에 넣을 수있는 XML 주석이 없었습니다. 나는 VB.NET에서 그것을 싫어했다. 하지만 수년 동안 한 언어로되어 있지 않은 많은 기능이 다른 언어에 추가되는 것을 보았습니다. (동일한 MS 개발자 팀이 C #과 VB를 모두 개발하므로 기능이 상당히 유사 해져야합니다.)
하지만 C #에는 VB가없는 것이 무엇인지 물었습니다. 다음은 내가 즉시 생각할 수있는 몇 가지입니다.
1 : C #은 더 간결하고 타이핑이 적습니다. 여러면에서! 나는 VB가 타이핑을 저장한다는 반대 주장이있을 때 말하는 어리 석음도 보았다. 그러나 두 언어를 모두 사용하고 거의 사용하지 않는다고 말하는 사람들의 말을 들어주세요. 나는 두 C #을 사용합니다. 과집에서 VB, C #을 좋아하기 때문에 (그리고 직장에서 C #으로 작업 할 때), C #이 아닌 VB를 사용하는 최근 작업 요청. 그래서 지금은 VB를 더 자주 사용하고 있습니다 (지금은 약 10 개월 동안).하지만 개인적인 증언으로는 C #을 훨씬 선호하고 실제 타이핑 측면에서는 VB가 훨씬 더 많은 타이핑입니다. 누군가가 실제로 VB가 더 간결하다고 말하려고 시도한 한 가지 예는 with에 긴 변수가있는 'with ...'예제를 제공 했으므로 VB에서는 '.property'를 사용할 수 있습니다. 이것은 VB가 타이핑을 덜 필요로한다고 주장하는 어리 석음입니다. VB가 더 짧은 몇 가지 (이 예제뿐만 아니라)가 있지만 실제로는 C #이 더 간결한 경우가 더 많습니다.
하지만 내가 C #이 더 간결하다고 믿는 가장 큰 이유는 VB의 장황한 "IF / THEN"진술 때문입니다. if 문이 일반적입니다. C #에서는 입력 할 'then'단어가 없습니다! :) 또한 모든 '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 #은 조금만 수행하지만 VB에서는 훨씬 더 많은 제어 기능을 제공하는 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 #의 간결함을 훨씬 더 좋아합니다. 메서드에 문자 리터럴이 필요한 경우 한 문자 길이의 문자열이 아닌 문자를 제공해야하므로 ":"c
VB 에서는 강제로 사용 하지만 C #에서는 ':'
. 나는 이것이 nit-picking tho라고 생각합니다.
공정하게 말하면, Dim nameUpper$ = name.ToUpperInvariant
C #에 빈 괄호가 필요한 경우 와 같이 메서드 호출 후에 빈 괄호를 넣지 않아도되는 등 VB에 좋아하는 이점이 있다고 말할 것 string nameUpper = name.ToUpperInvariant()
입니다. : 너무 그것을 트리밍과 같이 그 배 Dim nameUpper$ = name.Trim.ToUpperInvariant
대 string nameUpper = name.Trim().ToUpperInvariant()
. $
C #에 바로 가기가없는 '문자열'을 어둡게하기 위해 위에서 사용한 방법에 대한 VB의 간결한 사용을 좋아 합니다. VB에는 String, Integer, Long, Decimal, Single 및 Double 유형에 대한 단축키가 있지만 단점은 명확하지 않기 때문에 신중하게 사용합니다. 그럼에도 불구하고 저는 간결한 코드를 선호합니다.
글쎄, 그것은이 노련한 프로그래머의 약간의 이야기 일 뿐이고, 내가 생각하기에 이것은 C # 대 VB에 대한 나의 프로그래밍 '증언'입니다. 제 생각에는 둘 다 좋은 언어입니다. 하지만 예, 저는 여전히 C #을 선호합니다.
추신 평생 프로그래밍 할 계획 이었기 때문에 가장 효율적인 키보드 인 Dvorak 키보드를 사용하여 입력하는 방법도 다시 배웠습니다. Dvorak 키보드는 Qwerty 키보드보다 영어를 입력하는 데 약 1/3이 걸립니다. 찾아보세요. 당신도 전환하고 싶을 수도 있습니다. ;) 타이핑이 67 % 더 쉬워졌습니다! :) 나는 누구나 틀 밖에서 생각하고 당신의 작업에서 더 나은 효율성을 평가할 것을 권장합니다. Dvorak Simplified Keyboard Layout과 C #이이 작업을 수행했습니다. :)
PSS는 Qwerty 키보드 레이아웃과 VB를 Empirial 측정과는 반대로 Dvorak과 C #을 미터법과 비교할 것입니다. Dvorak, 메트릭 및 C #은 '깨끗'합니다. 그러나 VB는 실제로 멀지 않습니다. 그러나 'Or'대 'OrElse'및 'IIF ()'와 같은 이전 VB6 코드 및 .NET 이전 코드와 역 호환되어야합니다.
나는 조심스럽게 끝낸다. 그들이 무슨 말을하고 있는지 잘 모르는 사람들의 말을 듣는 것보다 더 신중 해지십시오. VB와 C #에 대한 모든 단점의 절반은 하지더 이상 문제가 없으며 사람들은 여전히 언어에 실제로 존재하는 단점에 대해 무지하다고 게시합니다. 내가 생각할 수있는 가장 좋은 예는 VB에서 삼중 아포스트로피를 사용하거나 C #에서 삼중 슬래시 주석 기호를 사용하는 메서드에 대한 XML 주석입니다. 그러나 어떤 사람이 무지로 말하고 있는지 아니면 경험으로 말하고 있는지 스스로 분별하십시오. 개인적인 간증은 그들이 실제 경험을 통해 안다는 것을 의미합니다. 그리고 누군가가 그것에 대해 많은 경험을 한 후에 귀를 기울이십시오. 저는 C #과 VB에서 10 년 이상의 경험을 가지고 있습니다. 그리고 결론은 이것으로 요약됩니다 : 둘 다 (아주) 좋은 언어입니다. 그리고 대부분의 차이점은 코드를 읽은 후 5 분 이내에 즉시 확인할 수 있습니다. 그러나 예, 다른 기능은 핸디캡을 찾는 데 수년이 걸릴 수 있습니다. 그리고 내가 아는 한 가지 핸디캡 (C #에서), 유용 할 실제 상황을 생각조차하지 마십시오. 그래서 아마도 그것은 결국 핸디캡이 아닐 것입니다.
즐거운 코딩 되세요!