programing

VB는 정말로 대소문자를 구분하지 않습니까?

megabox 2023. 7. 3. 22:39
반응형

VB는 정말로 대소문자를 구분하지 않습니까?

여기서 논쟁을 시작하려는 것은 아니지만, 일반적으로 Visual Basic은 대소문자를 구분하지 않으며 C 언어는 대소문자를 구분하지 않는다고 합니다(그리고 왠지 좋은 일입니다).

하지만 제 질문은 이렇습니다.Visual Basic 대소문자를 구분하지 않는 정확한 위치는 어디입니까?입력할 때...

Dim ss As String
Dim SS As String

...Visual Studio 2008 또는 Visual Studio 2010 IDE의 두 번째 IDE에는 "로컬 변수가 현재 블록에서 이미 선언되었습니다."라는 경고가 표시됩니다.VBA VBE에서는 오류를 즉시 발생시키지 않고 사례를 자동으로 수정합니다.

Visual Basic이 대소문자를 구분하지 않는다는 이 주장에 대해 제가 누락된 부분이 있습니까? (또한, 알고 있거나 답변할 의사가 있다면, 왜 그것이 나쁜 것이겠습니까?)

내가 왜 이런 질문을 하는 거지?

저는 Visual Basic의 많은 방언을 수년 동안 사용해 왔습니다. 때로는 취미로, 때로는 작업 그룹의 소기업 관련 프로그램에 사용하기도 했습니다.지난 6개월 동안, 저는 제가 예상했던 것보다 훨씬 더 큰 큰 프로젝트를 하고 있었습니다.샘플 소스 코드의 대부분은 C#에 있습니다.C#을 배우고 싶은 열망은 전혀 없지만 Visual Basic이 제공하지 않는 C#이 있다면(반대로 VB.NET은 XML 리터럴을 제공) 해당 기능에 대해 자세히 알고 싶습니다.따라서 이 경우 C 언어는 대소문자를 구분하며 이는 좋은 것이고 Visual Basic은 대소문자를 구분하지 않고 나쁘다는 주장이 자주 제기됩니다.알고 싶어요...

  1. 코드 편집기의 모든 예제가 대/소문자를 구분하므로 Visual Basic 대/소문자가 정확히 구분되지 않습니다(대/소문자가 수정됨을 의미).
  2. VB.NET 사례가 코드로 수행할 수 있는 작업을 제한하는 경우 C#로 이동하는 것을 고려할 수 있을 정도로 충분히 설득력이 있습니까?

VBA와 VB.NET의 차이점은 VB.NET이 백그라운드에서 계속 컴파일되기 때문입니다.VBA를 컴파일할 때 오류가 발생합니다.

Jonathan이 말했듯이 프로그래밍할 때 VB.NET은 문자열 비교, XML 및 기타 몇 가지 상황을 제외하고 대소문자를 구분하지 않습니다.

제 생각에 당신은 후드 아래에 있는 것에 관심이 있는 것 같습니다..NET Common Language Runtime은 대소문자를 구분하며 VB.NET 코드는 런타임에 의존하므로 변수와 메서드를 검색할 때와 같이 런타임에 대소문자를 구분해야 합니다.

VB.NET 컴파일러 및 편집기를 사용하면 코드의 대소문자를 수정하므로 이를 무시할 수 있습니다.

동적 기능 또는 늦은 바인딩(옵션 엄격 해제)을 사용하는 경우 기본 런타임이 대소문자를 구분한다는 것을 증명할 수 있습니다.이를 확인하는 또 다른 방법은 C#과 같은 대/소문자 구분 언어가 동일한 런타임을 사용하므로 런타임이 대/소문자 구분을 분명히 지원한다는 것을 인식하는 것입니다.

EDIT 방정식에서 IDE를 제거하려면 항상 명령줄에서 컴파일할 수 있습니다.메모장에서 코드를 편집합니다.ss그리고.SS컴파일러가 수행하는 작업을 확인합니다.

.NET Framework Design Guidelines 45페이지의 Jeffrey Richter의 EDIT 인용문.

CLR은 사실 대소문자를 구분합니다.Visual Basic과 같은 일부 프로그래밍 언어는 대소문자를 구분하지 않습니다.Visual Basic 컴파일러가 C#과 같이 대소문자를 구분하는 언어로 정의된 형식의 메서드 호출을 해결하려고 할 때 컴파일러(CLR이 아닌)는 메서드 이름의 실제 대소문자를 파악하여 메타데이터에 포함합니다.CLR은 이것에 대해 아무것도 모릅니다.리플렉션을 사용하여 메서드에 바인딩하는 경우 리플렉션 API는 대소문자를 구분하지 않는 조회를 수행할 수 있는 기능을 제공합니다.이것은 CLR이 대소문자를 구분하지 않는 정도입니다.

여기서 문제의 일부는 IDE 경험에서 언어를 분리해야 한다는 것입니다.

언어적으로 VB.NET은 식별자에 대해 확실히 민감하지 않습니다.부르기DateTime.Parse그리고.datetime.parse동일한 코드에 바인딩됩니다.그리고 C#과 같은 언어와 달리, 경우에 따라서만 다른 방법이나 유형을 정의할 수 없습니다.

IDE VB입니다.NET은 코드 블록을 꽤 나열할 때 기존 식별자의 대소문자를 보존하려고 시도합니다.현재 코드의 논리적인 줄에서 벗어날 때마다 예쁜 목록이 나타납니다.에는 이경당신두번선벗서다어니납언에째 두 번째 .SS예쁜 리스터는 그 이름을 가진 기존 식별자가 있다는 것을 알고 일치하는 대소문자를 갖도록 수정합니다.

그러나 이 동작은 순수하게 사용자 가치 추가로 수행됩니다.그것은 핵심 언어의 일부가 아닙니다.

VB는 대부분 대소문자를 구분하지 않지만 예외가 있습니다.예를 들어 XML 리터럴과 이해는 대소문자를 구분합니다.문자열 비교는 일반적으로 T-SQL과 달리 대소문자를 구분하지만, 대소문자를 구분하지 않도록 하는 컴파일러 스위치가 있습니다.그리고 물론 상속, COM 및 동적 언어 런타임을 처리할 때 에지 사례가 있습니다.

예, VB.NET 컴파일러는 대소문자를 구분하지 않는 방식으로 식별자를 처리합니다.예, 다른 언어로 작성된 어셈블리를 사용하거나 COM 구성 요소를 사용할 때 문제가 발생할 수 있습니다.전자의 경우에는 공통 언어 사양이 적용됩니다.관련 규칙은 다음과 같습니다.

두 식별자가 서로 다른 것으로 간주되기 위해서는 각각의 경우 이상의 차이가 있어야 합니다.

COM 케이스는 형식 라이브러리 빌더에 의해 다소 조잡하게 처리되며, 동일한 이름의 식별자 케이스가 강제로 동일해집니다.이러한 식별자가 서로 다른 역할을 가질 때도 마찬가지입니다.즉, 이름이 "index"인 메서드 매개 변수는 메서드 이름 "Index"를 "index"로 강제 전환합니다.당신이 상상할 수 있듯이, 그것은 꽤 많은 머리 긁힘을 만들었습니다 :)

VB는 IDE에서 대소문자를 구분하지 않고 대소문자를 구분합니다.어떤 면에서는 Windows 파일 시스템과 비슷합니다.안녕하세요.txt 그리고 안녕하세요.txt는 동일한 파일 이름으로 간주됩니다.

IDE는 변수 선언이 해당 변수에 대한 "올바른" 대소문자라고 가정하고 해당 변수의 모든 인스턴스를 선언과 일치하도록 조정합니다.이 기능은 눈과 눈의 캔디와 일관성을 위해 수행되지만 기능성을 위해 수행되지는 않습니다.

선언문과 일치하도록 사례가 자동으로 변경되지 않은 사례를 여러 번 봤는데, 진술문도 똑같이 작동합니다.또한 텍스트 편집기를 사용하여 다른 경우에도 잘 컴파일되는 코드를 작성할 수 있습니다.

참고 사항:

대부분의 사람들은 대소문자를 구분하지 않는 방식으로 생각합니다.우리가 "개"라는 단어를 볼 때, 그 단어는 우리 마음속에서 의미로 번역됩니다.단어의 의미는 대소문자를 기반으로 하지 않습니다(즉, "DOG", "DOG" 또는 "DOG" 철자와 상관없이 여전히 짖습니다). 컴퓨터는 단어를 비트의 개별 백으로 봅니다.대문자와 소문자는 서로 다른 비트 패턴이므로 다릅니다.

대부분의 프로그래머가 인간이기 때문에 사례 불감증은 사람들이 생각하는 방식에 더 적응하는 것처럼 보이며 사례 불감증은 인간이 생각하는 방식을 기계의 제약에 적응시키는 것에 더 가깝습니다.

이는 사용 중인 편집기의 일부로, 사용자가 다르게 동작할 수 있지만 Visual Basic은 대소문자를 구분하지 않는 언어입니다.그렇게,ss그리고.SS똑같습니다.

자세한 내용은 VB.NET Basics 튜토리얼을 참조하십시오 :)

VB는 대소문자를 구분하지 않으므로 SS와 SS는 동일한 변수이므로 컴파일러는 변수를 다시 선언했다고 올바르게 불평합니다.

변수는 대소문자를 구분하지 않지만 함수 이름은 대소문자를 구분합니다.

예, VB는 대소문자를 구분하지 않습니다.그것은 때때로 익숙하지 않은 사람들을 약간 혼란스럽게 합니다.

VB.NET에서 식별자의 다른 대문자/ 소문자 "스펠링"으로 코드를 만들기 위해 그렇게 많은 노력을 할 필요는 없습니다.이름 바꾸기 기능을 사용하지 않고 파일에서 선언된 식별자의 케이스를 변경하면 다른 파일에서 이름이 업데이트되지 않지만 이름이 포함된 줄을 편집하면 현재 정의를 준수하게 됩니다.

이러한 방식으로 VB.NET은 대소문자를 구분하지 않지만 대소문자를 구분하는 방식으로 해당 정보를 사용할 수 있는 CLR에서 식별자의 대소문자를 사용할 수 있도록 합니다.

두 번째 질문에 대답해 보겠습니다.

"VB.NET 사례가 코드로 수행할 수 있는 작업을 제한하는 경우 C#로 이동하는 것을 고려할 수 있을 정도로 충분히 설득력이 있습니까?"

C#을 사용하여 WCF 웹 서비스를 만듭니다.데이터 계약(1개 클래스)을 생성합니다."문자열 전자 메일" 속성이 있는 것.다른 속성으로 "문자열 전자 메일"이 있는 다른 속성.개인 전자 메일 또는 사무실 전자 메일로 이해하기 위한 선택입니다.또는 두 개의 서로 다른 데이터 계약에 포함될 수 있습니다.

C#의 경우 이것은 괜찮습니다.웹 서비스가 정상적으로 생성됩니다.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_.NET http://www.vbrad.com/article.aspx?id=65

마지막에 귀하의 명시적인 두 번째 질문에 대해 언급한 사람을 본 적이 없습니다. "2: VB.NET 사례가 코드로 수행할 수 있는 작업을 제한한다면 C#로 이동하는 것을 고려할 만큼 충분히 설득력이 있습니까?"

저는 C#가 프로그래머의 옵션을 제한하는 것보다 프로그래머가 선택할 수 있도록 하는 더 많은 옵션 접근 방식을 선호합니다.저는 C#을 매우 선호하지만, 사례 민감도만 가지고는 언어 학습에 가깝다고 생각하지 않습니다. 단지 대소문자가 민감하다는 이유만으로 모든 기능이 중요합니다. 그리고 제가 C#과 VB.NET의 장점을 볼 때, 저는 C#을 매우 선호합니다. 하지만 저는 선호하기 때문에 당신에게 진정한 균형 잡힌 관점, 편향된 관점을 줄 것입니다.하지만 C#의 단점에 대해서도 솔직하게 말하겠습니다.

먼저, 두 언어 모두 장점과 단점이 있습니다.한 언어에서 할 수 있는 다른 언어에서는 할 수 없는 차이가 줄어들고 있습니다. 감사하게도, 마이크로소프트는 두 언어를 개선하고 있고, 두 언어 모두에 대해 불공평한 편애를 보이지 않는 것처럼 보이기 때문입니다.

C#이 처음 출시되었을 때, VB는 메서드 앞에 놓을 수 있는 XML 주석을 가지고 있지 않았습니다. C#에서는 너무 좋아했습니다. VB.NET에서는 싫어했습니다. 하지만 여러 해 동안 한 언어에 없는 많은 기능이 다른 언어에 추가되는 것을 보았습니다.(같은 MS 개발자 팀이 C#과 VB를 모두 개발하므로 기능이 상당히 유사해야 한다는 것이 타당합니다.)

하지만 당신은 C#에게 VB가 가지고 있지 않은 것을 요구했습니다.여기 제가 즉시 생각해 낼 수 있는 몇 가지가 있습니다.

1: C#은 더 간결하고 타이핑이 덜 걸립니다.여러 면에서! 저는 심지어 VB가 타이핑을 저장한다는 반대 주장이 제기될 때 바보 같은 말을 하는 것을 본 적이 있습니다. 하지만 그들이 두 언어를 모두 사용하고 둘 다 그들이 거의 사용하지 않는다고 말하는 사람들의 말을 들어주십시오.저는 에서 C#과 VB, C#을 모두 사용합니다. 왜냐하면 저는 그것을 좋아하기 때문입니다. (그리고 직장에서 C#과 함께 일할 때). 그리고 최근에 저는 C#이 아닌 VB를 사용하는 것을 더 많이 요청했습니다. 그래서 저는 지금 (현재 약 10개월 동안) VB를 더 자주 사용하고 있습니다. 하지만 제 개인적인 증언에 따르면, 저는 C#을 훨씬 더 선호하고 있고, 실제 타이핑 측면에서, VB는 훨씬 더 많이 타이핑합니다.제가 읽은 예 중 하나는 누군가가 실제로 VB가 더 간결하다고 말하려고 했던 것으로, 'with...' 예제를 With에 긴 변수가 있는 것입니다. 그래서 VB에서는 그냥 '.property'를 사용할 수 있습니다.이것은 VB가 타이핑을 덜 필요로 한다고 주장하는 어리석음입니다.VB가 더 짧은 몇 가지 사항(이 예뿐만 아니라)이 있지만 실제 C#이 더 간결할 때는 훨씬 더 많습니다.

하지만 제가 C#이 더 간결하다고 생각하는 가장 큰 이유는 VB의 장황한 "IF/THEN" 문장 때문입니다.진술이 일반적인 경우C#에는 입력할 'then' 단어가 없습니다! :) 또한 모든 'end...' 문은 입력을 받습니다. c#에서 일반적으로 하나의 닫는 괄호 '}'에 불과합니다. i는 몇몇 사람들이 VB에서 이러한 더 장황함을 주장하는 것을 읽었습니다. 왜냐하면 여러 개의 닫는 블록 문/기호가 서로 중첩되고 바로 옆에서 끝날 수 있기 때문입니다. NET은 VB에 VB에 이점입니다.하지만 저는 동의하지 않습니다. 한 사람이 다른 프로그래머보다 C#이나 VB로 프로그램을 더 잘 작성할 수 있습니다. 왜냐하면 다음 코드 개정은 더 잘 설계될 수 있기 때문입니다.이것은 'C#의 수많은 닫는 중괄호 혼동'에 적용되며 중첩된 블록이 여러 중첩된 IF와 같은 유형이면 VB에서 C#과 동일한 문제가 발생합니다. VB에서는 이점이 없습니다. 이러한 상황이 바로 내가 내 닫는 기호나 닫는 문장이 두 언어로 무엇과 함께 사용되는지 설명하고 싶은 이유입니다.네, 이것은 더 장황하지만, 두 언어 모두에서, 판단 기반의 상황별 사례에서 중요한 명확한 선택권이 있습니다.저는 코드 명확성이 꽤 중요하다고 생각합니다.

2: VB에는 다중 줄 주석이 없습니다.제가 VB와 일할 때 저는 개의치 않았습니다.그리고 나서 저는 몇 개의 C 스타일 언어로 갔습니다.이제 저는 주로 직장에서 VB.NET을 사용하고 돌아왔는데, 그들이 그립습니다.그것은 당신이 편리하다고 생각하고, 그리고 나서 잃어야 하는 것입니다.:(

3: VB의 'andalso'와 'orrese'는 C#에서 단순히 '&&'과 '|'일 때 입력하기가 다소 귀찮습니다.이것은 VB와 C# 모두에서 내 코드에서 드물지 않습니다. 기능적인 면에서 'OR' 대 'OrElse'는 보통 컴퓨터에 대해 'OrElse'가 더 빠르다는 것을 제외하고는 문제가 되지 않습니다. 따라서 프로그래머가 VB에서 'Or'와 'And'만 사용하면 코드의 명확성을 좋아하는 사람에게는 덜 최적의 코드를 생성합니다.'Or'은 'Or Else'보다 훨씬 스킵하기 쉽습니다.

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에서 입력하십시오.)

및 연산자: ++ -- 로: ++ 및 --와myVariable++또는++myVariable합니다...이것은 매우 유용합니다...은 C크게 입니다.다음은 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#이 더 간결하다는 충분한 증거일 것입니다.하지만 모든 프로그래머가 간결함을 좋아하는 것은 아닙니다.어떤 사람들은 "만약 a < b 그렇다면 ..."을 읽는 것을 선호합니다.왜냐하면 그것은 그들의 인간 언어에 더 자연스럽기 때문입니다.그리고 그것은 괜찮습니다.선호 사항은 괜찮습니다.저에게 있어서, 손으로 하는 노력은 하나의 요소 가치이고, 저는 누구나 그들이 선호하는 어떤 기호든 생각하는 것에 익숙해질 수 있다고 생각합니다. 왜냐하면 "만약"과 "그렇다면"은 알파벳의 상징이고, C#의 "만약 (조건) 진술;" 구문 또한 상징이기 때문입니다.하나는 다른 하나보다 비프로그래머의 구문에 더 가깝습니다. 저는 간결한 것을 선호합니다.

또한 문자열이 아닌 문자 리터럴로 만들기 위해 VB에서 문자 리터럴 뒤에 'c'를 사용해야 하는 것은 성가신 일이라고 생각합니다.C#문자 의 경우 길이로 사용해야 하는 경우.":"c이고, C#에서는 VB 서 C# 는있동그은것안에에▁v▁in그은것▁is동안▁in▁c▁v.':'나는 이것이 바보 같다고 생각합니다.

공정하게 말하자면, 나는 VB에 메소드 호출 후 빈 괄호를 넣지 않는 것과 같은 장점이 있다고 말할 것입니다.Dim nameUpper$ = name.ToUpperInvariant서 C합니다: 여서에 C#는빈 괄호필 요합니다가기.string nameUpper = name.ToUpperInvariant()두 로: 또는그것다것처두배럼로는듬을:Dim nameUpper$ = name.Trim.ToUpperInvariantstring nameUpper = name.Trim().ToUpperInvariant()한 VB의 간결한 이 마음에 듭니다.$#의 'As String'은 는 String,, 하는 단축키를 것이 VB는 String, Integer, Long, Decimal, Single 및 Double 유 형 에 지 가 있 만 가 기 것 단 지 므 로 이 점 이 은 하 하 다 여 사 용 니 는 합 주 의 명 선 한 로에 ▁never ▁but ▁v ▁code ▁double ▁concise 및 ▁string, ▁prefer , ▁integer ▁long b , 는 ▁single ▁i ▁decimal , 형 유 , 하지만 그럼에도 불구하고, 저는 간결한 코드를 선호합니다.

음, 그것은 이 노련한 프로그래머의 몇 가지 힌트일 뿐입니다. 제가 생각하기에, 이것은 C# 대 VB의 프로그래밍 '증언'입니다. 둘 다 제 생각에는 좋은 언어입니다. 하지만 네, 저는 여전히 C#을 훨씬 선호합니다.

p.s. 제 인생의 대부분을 프로그래밍할 계획이기 때문에, 저는 심지어 가장 효율적인 키보드인 드보락 키보드를 사용하여 타이핑하는 것을 다시 배웠습니다. 드보락 키보드는 쿼티 키보드보다 영어를 타이핑하는 데 약 1/3의 노력이 필요합니다.찾아보세요. 아마 당신도 바꾸고 싶을 거예요.;) 제 타이핑이 67% 더 쉬워졌습니다! :) 저는 누구나 틀 밖에서 생각하고 당신의 일에서 더 나은 효율성을 평가할 것을 권장합니다.Dvorak Simplified Keyboard Layout과 C#은 저를 위해 이것을 해주었습니다.:)

추신: i는 Qwerty 키보드 레이아웃과 반대로 Dvorak 및 C#을 메트릭과 비교하고 VB를 경험적 측정과 비교합니다.드보락, 미터법, C#은 '깨끗함'일 뿐입니다. 하지만 VB는 크게 뒤떨어지지 않습니다.그러나 'Or' 대 'OrElse' 및 'IIF()'와 같은 이전 VB6 코드 및 .NET 코드와 역호환해야 하는 어려움이 있습니다.

저는 주의해서 끝냅니다.그들이 무슨 말을 하는지 정말 모르는 사람들의 말을 듣는 것은 좀 더 신중해야 합니다.VB와 C# 모두에 대한 모든 단점의 절반은 더 이상 문제가 되지 않으며, 사람들은 여전히 그들이 언어에 실제로 존재하는 단점에 대해 무지하다고 게시합니다.제가 생각할 수 있는 가장 좋은 예는 VB의 트리플 아포스트로피 또는 C#의 트리플 슬래시 주석 기호를 사용하는 메서드에 대한 XML 주석입니다.그러나 사람이 무지에서 말하는 것인지 경험에서 말하는 것인지 스스로 분별해 보십시오.개인적인 증언은 그들이 실제 경험을 통해 알 수 있다는 것을 의미합니다.그리고 누군가가 그것에 대해 많은 경험을 한 후에, 여러분의 귀에 활기를 불어넣으세요.저는 C#과 VB 모두에서 10년 이상의 경력을 가지고 있습니다.그리고 이것으로 요약하면, 둘 다 (매우) 좋은 언어입니다.그리고 대부분의 차이점은 코드를 읽고 5분 이내에 바로 알 수 있습니다.하지만 네, 다른 특징들은 핸디캡을 찾는 데 몇 년이 걸릴 수도 있습니다.그리고 (C#에서) 제가 알고 있는 한 가지 핸디캡은, 그것이 유용한 실제 삶의 상황에 대해서는 생각조차 할 수 없습니다.그래서 아마도 그것은 결국 핸디캡이 아닐 것입니다.

해피 코딩!

기호 숨기기(예: 로컬 숨김 필드)도 대소문자를 구분하지 않습니다.

다음은 예입니다.

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필드를 두 번 통과했습니다.로컬은 대소문자에 관계없이 숨겨집니다.언어는 대소문자를 구분하지 않습니다.

해야 합니다.Me:

Return String.Equals(name, Me.Name) ' differentiate field from local

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

이 모든 코드는 컴파일 타임 오류를 발생시킵니다.

첫 번째 예에서는 "로컬 변수 'A'가 현재 블록에서 이미 선언되었습니다."라는 오류가 표시됩니다.

두 번째와 세 번째 예에서는 각각 "Public Sub()"에 동일한 서명을 가진 여러 정의가 있습니다."라는 오류가 표시되고 "Public Function c() As Integer"에 동일한 서명을 가진 여러 정의가 있습니다."라는 오류가 표시됩니다.

이러한 오류에서 오류는 변수와 절차/함수에 대해 서로 다른 위치에 던져집니다.변수의 경우 두 번째 선언에 오류가 발생하고 절차/함수의 경우 동일한 코드의 첫 번째 선언/정의에 오류가 발생합니다.

VB.NET 코드는 VIDE의 "Error List" 창에서 볼 수 있으며, 이 오류는 VB.NET 코드가 백그라운드에서 지속적으로 확인 및/또는 수정됩니다.그리고 이것경고가 아닌 오류이므로 오류가 해결될 때까지 코드는 컴파일되지 않습니다.

언급URL : https://stackoverflow.com/questions/2300983/is-vb-really-case-insensitive

반응형