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


122

여기에서 인수를 시작하려고하는 것은 아니지만 어떤 이유로 든 일반적으로 Visual Basic은 대소 문자를 구분하지 않고 C 언어는 그렇지 않다고 말하고 있습니다.

그러나 여기에 내 질문이 있습니다. Visual Basic의 대소 문자를 정확히 구분하지 않는 곳은 어디입니까? 입력 할 때 ...

Dim ss As String
Dim SS As String

... Visual Studio 2008 또는 Visual Studio 2010 IDE의 두 번째 IDE에는 " 로컬 변수 SS가 현재 블록에서 이미 선언되었습니다 "라는 경고가 표시 됩니다. 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 #으로 이동하는 것을 고려하기에 충분히 설득력이 있습니까?

5
+1 이전에도 똑같은 것에 대해 궁금해했습니다.
NakedBrunch 2010

7
음, 어디 ... 아니 당신이 무엇을 대소 문자를 이해 에서 중요한 의미합니다. VB는 실제로 대소 문자를 구분하지 않기 때문에 SS와 ss 동일한 이름이지만 C에서는 그렇지 않습니다.
Ed S.

1
@ed : VB SSssVB에서 둘 다 사용할 수 없습니다 . 먼저 사용하는 것이 편집기가 사용하는 것입니다.
Todd Main

1
Otaku, VB가 대소 문자를 구분하지 않는다는 의미와 구현 방법에 정확히 초점을 맞추는 것이 좋습니다. 언어가 대소 문자를 구분하지 않는 것이 더 나은지에 대한 질문은 슬프게도 화염 전쟁을 시작할 수 있습니다. 정말로 궁금하다면 다른 질문을 해보세요. (그렇게하지 말라고 권하지만, 주관적으로 태그를 지정하고 커뮤니티 위키로 만들어야한다면)
MarkJ

16
당신은 이것에 대해 거꾸로 생각하고 있습니다. 그것은 정확하게이다 때문에 컴파일러 오류가 '이미 선언 된 변수 SS'를 읽는 소문자를 구분하지 않습니다. 대소 문자를 구분하는 경우 'ss 변수가 사용되지 않음'또는 전혀 오류가 발생하지 않고 버그가 발생합니다.
Adriano Varoli Piazza

답변:


108

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

마찬가지로 조나단 말한다 프로그래밍 할 때, 당신은 대소 문자를 구분 문자열 비교, XML, 그리고 몇 가지 다른 상황에서 떨어져로 VB.NET 생각할 수 ...

나는 당신이 내부에있는 것에 관심이 있다고 생각합니다. .NET 공용 언어 런타임은 대소 문자를 구분 하고 VB.NET 코드는 런타임에 의존하므로 런타임시, 예를 들어 변수와 메서드를 찾을 때 대소 문자를 구분해야 함을 알 수 있습니다.

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

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

편집 IDE를 방정식에서 제외하려면 항상 명령 줄에서 컴파일 할 수 있습니다 . 당신의 코드를 수정 메모장 이 가지고 있도록 ss하고 SS컴파일러가 무엇을 참조하십시오.

편집 에서 견적 제프리 리히터 에서 .NET 프레임 워크 디자인 지침 45 페이지.

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


지금까지 들었던 최고의 답변입니다. VB.Net 컴파일러와 편집기가이를 무시할 수 있다는 점을 증명할 방법이 있습니까? 자동 수정을 끄는 방법이 있습니까? 또는되는 SLN 컴파일 할 수있는 방법이 없는 용도 모두 있음은 MSBuild에서 VS IDE로 작성 ss하고 SS그것을 컴파일 작업이 예상대로는?
Todd Main

5
속임수로 자동 수정을 끌 수 있습니다. vb 파일을 마우스 오른쪽 버튼으로 클릭하고 "연결 프로그램"을 선택합니다. 그런 다음 "XML (텍스트) 편집기"와 같은 것을 선택하십시오. 자동 수정과 같은 모든 VB 관련 기능을 잃게됩니다.
Jonathan Allen

+1 멋진 대답, 잘 오타쿠 같은 좋은 질문 (난 당신이 이미 알고 있지만 좋은 정의를 끌어 싶어 생각 헤이?)
익명 유형

VB.NET 컴파일러 / IDE는 100 % 대소 문자를 구분하지 않습니다. 예를 들어 Dim pdfWriter As PDFWriter완전히 유효합니다. VB.NET을 사용하면 대소 문자를 완전히 구분하는 언어에서 일반적으로 사용되는 방식이므로 클래스 이름과 변수 이름을 구분할 수 있습니다.
성분

VB 방식은 상호 운용성에 적합합니다. 예 : inotifypropertychanged 이벤트가 포함 된 이메일을 String으로, Email ()을 속성으로 사용하여 C #에서 DLL을 만듭니다. C #이 잘 컴파일되고 DLL이 생성됩니다. 이 DLL을 VB 또는 유사한 언어로 참조하십시오. 라이브러리의 가변 이메일 / 이메일에 충돌이 있다고 표시됩니다. 코드 분석 도구는이를 VB 컴파일러가 아닌 C # 컴파일러의 문제로 지적합니다.
Venkat

22

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

언어로서 VB.NET 은 확실히 식별자와 관련하여 대소 문자를 구분하지 않습니다. 호출 DateTime.Parsedatetime.parse똑같은 코드에 바인딩됩니다. 그리고 C #과 같은 언어와 달리 대소 문자 만 다른 메서드 나 유형을 정의하는 것은 불가능합니다.

IDE로서 VB.NET은 코드 블록을 예쁘게 나열 할 때 기존 식별자의 대소 문자를 유지하려고합니다. 예쁜 목록은 현재 논리적 코드 줄에서 벗어날 때마다 발생합니다. 이 경우 두 번째 선언에서 벗어나 SS예쁜 리스터는 해당 이름을 가진 기존 식별자가 있음을 확인하고 대소 문자가 일치하도록 수정합니다.

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


1
감사합니다 Jared, 그것이 단지 IDE라는 것을 아는 것은 흥미 롭습니다. 나는 여전히 이름의 대소 문자 차이로 인해 하나 이상의 이름이 다른 것을 나타내는 것이 왜 좋은지 이해하지 못하지만 다른 날이 될 것 같습니다.
Todd Main

1
나는 Jared가 그것이 단지 IDE 임을 의미한다고 생각하지 않습니다 . 나는 그가 컴파일러가 대소 문자를 구분하지 않는다고 말했다고 생각한다. 그래서 그것은. ss와 동일 하다고 생각 SS하지만, IDE를 읽는 데 도움이 SS되기 ss때문에 입력 할 때 수정 된다 . 따라서 IDE가 대소 문자를 수정하지 않더라도 컴파일러는 여전히 두 식별자를 동일한 것으로 간주합니다.
MarkJ

2
"이름의 대소 문자 차이만으로 여러 이름이 다른 것을 나타내는 것이 왜 좋은지 이해하지 못합니다."<-VBA / VB6 / VB.NET에서 C #으로 전환하기 전에도 같은 방식으로 느꼈습니다. , 케이스에 따라서 만 이름이 달라지는 것이 위험하다고 생각했습니다. 그러나 실제로는 매우 유용하며 놀랍게도 오류가 전혀 발생하지 않습니다.
Mike Rosenblum 2011

2
@Mike 나는 그 점에 매우 동의하지 않습니다. 나는 혼동을 일으키지 않는 대소 문자 혼합 이름을 본 적이 없습니다.
JaredPar

2
정말? 나는 void SetColor (color Color) {this.color = color}와 같은 것을 의미합니다; 위험 해 보일 수 있지만 원활하게 작동하고 컴파일러는 실수를 허용하지 않으며 IntelliSense는 "색상"뒤에 올바른 멤버를 제공합니다. 대 "색상." 여기서 나를 괴롭히는 것은 "this"의 사용이 필요 하지 않다는 것입니다. FxCop 및 / 또는 StyleCop에 의해 시행됩니다 (나는 잊어 버림).하지만 클래스에 액세스 할 때 IDE가 항상이를 시행하도록하는 설정이 있었으면합니다. 잠재적으로 범위가 우연히 섀도 잉되는 것을 허용하는 대신 멤버.
Mike Rosenblum 2011

16

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


3
XML 리터럴 및 문자열 비교와 같이 대소 문자가 중요한 위치에 대한 좋은 점입니다. 그러나 대부분 대소 문자를 구분하지 않는다고 말할 때 정확히 무엇에 대해 이야기하고 있습니까? 내가 입력하면 Outlook에서 VBA까지 이동, 단지 예로서, Dim mi as mailitemsubject = mi.subject, 개체 이름은 자동 수정을 얻을 것이다 MailItemmi.Subject. 컴파일러가 신경 쓰나요 ( 항상 자동 수정 되므로 ) 아니면이 예쁜 코드인가요 ...?
Todd Main

1
컴파일러는 상관하지 않습니다. 메모장에서 파일을 편집하고 명령 줄 컴파일러를 사용하여이를 테스트 할 수 있습니다.
Jonathan Allen

9

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

두 식별자가 구별되는 것으로 간주 되려면 대 / 소문자 이상으로 달라야합니다.

COM 대소 문자는 형식 라이브러리 작성기에 의해 다소 조잡하게 처리되며 동일한 이름을 가진 식별자의 대 / 소문자를 동일하게 만듭니다. 이러한 식별자의 역할이 다른 경우에도 마찬가지입니다. 즉, 이름이 "index"인 메서드 매개 변수는 메서드 이름 "Index"가 "index"로 변경되도록 강제합니다. 그것은 당신이 상상할 수 있듯이 오히려 많은 머리 긁힘을 일으켰습니다. :)


6

VB는 대소 문자를 유지 하지만 (IDE에서) 대소 문자를 구분하지 않습니다. . 어떤면에서는 Windows 파일 시스템과 같습니다. Hello.txt와 hello.txt는 동일한 파일 이름으로 간주됩니다.

IDE는 변수 선언이 해당 변수에 대해 "올바른"경우라고 가정하고 해당 변수의 모든 인스턴스가 선언과 일치하도록 조정합니다. 눈에 띄고 일관성을 유지하기 위해이 작업을 수행하지만 기능은 아닙니다.

케이스가 선언과 일치하도록 자동으로 변경되지 않은 몇 가지 경우를 보았습니다. 그리고 명령문은 똑같이 작동합니다. 텍스트 편집기를 사용하여 다양한 경우에 잘 컴파일되는 코드를 작성할 수도 있습니다.

참고 :

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

대부분의 프로그래머는 인간이기 때문에 대소 문자 무감각은 사람들이 생각하는 방식에 더 잘 적응하는 것 같고 대소 문자 구분은 인간이 기계의 제약에 어떻게 생각하는지 적응하는 것에 더 가깝습니다.


4
프로그래머가 객체와 클래스를 구별해야하고 전통적으로 그렇게하기 위해 변경 사항을 사용했다는 점을 제외하고는 필요하지 않습니다. 그래서 object.method()Object.Method()(당신이 코딩 규칙을 준수하는 경우) 즉시 객체와 클래스 참조 및 방법으로 인식하고 있습니다. 영어와 마찬가지로 고유 명사와 문장의 시작을 대문자로 구분합니다. 그래서 읽기 나 프로그래밍을 할 때 대소 문자를 구분하지 않는다고 생각하지 않습니다. 그렇지 않으면 어떤 의미를 놓치고있을 것입니다.
Jason S

@Jason, 그것은 당신이 익숙한 것에 관한 모든 것입니다. 새로운 C 프로그래밍 학생들은 처음에는 대소 문자 구분에 대해 무수히 많은 불만을 제기 한 다음 몇 가지 과정을 마치고 익숙해집니다. object.method () 및 Object.Method ()는 관례 일 뿐이며 대소 문자 구분에 대한 가장 강력한 사례입니다. 같은 범위에서 temp와 Temp라는 두 개의 변수를 가진 다른 사람이 작성한 프로그램을 수정해야했고, 그것들을 내 머리 속에 똑바로 두는 것이 매우 어려웠습니다. 그리고 우리는 대문자로 일반 명사를 인식 할 수 있지만 "bob"과 "Bob"이라는 단어는 우리 뇌에서 같은 의미입니다.
Andrew Neely 2011-08-24

이 경우 IDE가 대소 문자를 유지하는 이유는 무엇입니까? (죄송합니다). 나는 IDE가 케이스를 보존한다고 생각한다. MS 디자이너는 케이스가 뇌에 의미가 있다고 생각하기 때문이다. 그러나 실제로 VB IDE는 고려 form하고 Form똑같습니다. 어쨌든 저에게는 혼란 스럽습니다. 경우 (죄송합니다 다시)의 temp그리고 Temp당신은 쉽게 이름을 C #으로 리팩토링 도구를 사용할 수 있습니다 TempbobTemp또는 무엇 이건. 그러나 나는 일부 VB를 유지하고 있으며 누군가가 갔다 Dim form As Form. 이제 이름을 바꾸면 클래스 및 개체 참조의 이름이 모두 바뀝니다. 블리 아!
Jason S

@Jason, VB에서 나는 항상 "Dim aform as Form"이라고 말하지만 나는 빗나 갔다. VB는 검색시 대소 문자 구분을 지원합니다. 또한 "As Form"을 검색하여 "somethingstupid"로 바꾼 다음 form의 이름을 합리적인 이름으로 바꾼 다음 "somethingstupid"의 이름을 다시 "As Form"으로 바꿉니다. 나는 실제로 대소 문자를 바꾸는 것을 좋아합니다. 왜냐하면 변수 이름을 꼼꼼하게 다루지 않았 음을 확인하기 때문입니다.
Andrew Neely 2011-08-25

예, 그러나 이것은 이름이 동일 할 때 (또는 VB에서 대소 문자 만 다를 때) 클래스와 인스턴스 참조를 구별하는 리팩토링 도구를 대체 할 수 없습니다. C # 리팩토링 도구는 그렇게 할 수있는 것 같습니다. 클래스와 인스턴스의 이름을 동일하게 지정하지 않습니다. C #에서는 구분을 위해 대소 문자를 사용하지만 VB에서는 그렇게 할 수 없으므로 앞에 추가 할 문자를 사용합니다. 분명히 내 문제는 같은 이름을 사용하는 다른 사람의 코드를 유지하고 있다는 것입니다. 하지만이 토론은 댓글이 너무 많아서 여기에 남겨 두겠습니다.
Jason S

5

이것은 사용중인 편집기의 일부이며 다르게 동작 할 수 있지만 실제로 Visual Basic 대소 문자를 구분하지 않는 언어입니다. 그래서 ssSS동일합니다.

자세한 내용은 VB.NET 기본 자습서를 참조하십시오. :)


오, 흥미 롭군요. 이 세부 사항을 찾아 볼 곳이 있나요? 나는 아직 테스트하지 않았지만 VBScript에 대해 생각하면 당신이 옳을 수 있습니다.
Todd Main

@Otaku : 내 대답을 다시 참조하십시오. 지금 링크를 제공했습니다. 감사합니다
Sarfraz

저는 VB에 대해 잘 알고 있습니다. 감사합니다. :) 그 페이지에서 제가 무엇을 보길 바라는지 잘 모르겠습니다.
Todd Main

3

내가 당신을 이해하는지 잘 모르겠어요? VB는 대소 문자를 구분하지 않으므로 ss와 SS는 동일한 변수이므로 컴파일러는 변수를 다시 선언했다고 올바르게 불평합니다.

나는 변수가 대소 문자를 구분하지 않는다고 생각하지만 함수 이름은 있습니다.


그러나 내가 사용 ss하고 나중에 type을 입력 SS하면으로 자동 수정되어 ss컴파일러가 실제로 대소 문자를 관리한다고 믿습니다.
Todd Main

5
@oTAKU : 컴파일러가 아닌 IDE가 케이스를 변경하는 것입니다.
John Saunders

2
VB는 여전히 케이스에 대해 신경 쓰지 않습니다. IDE는 변수가 전체적으로 동일하게 유지되도록 코드를 정리하려고합니다.
guitarthrower

1

예, VB는 대소 문자를 구분하지 않습니다. 때로는 익숙하지 않은 것들을 약간의 루프 동안 던집니다.


1

식별자의 대문자 / 소문자 "맞춤법"이 다른 코드를 만들기 위해 VB.NET에서 그렇게 열심히 노력할 필요가 없습니다. "이름 바꾸기"기능을 사용하지 않고 선언 된 파일에서 식별자의 대 / 소문자를 변경하면 이름이 포함 된 줄을 편집하면 현재 정의를 따르게되지만 다른 파일에서 이름이 업데이트되지 않습니다.

이런 식으로 VB.NET이 대부분 대소 문자를 구분하지 않는다는 것을 확인할 수 있지만 CLR에서 해당 정보를 대소 문자를 구분하는 방식으로 사용할 수있는 식별자의 대소 문자를 사용할 수 있습니다.


1

80 년대 초반의 프로그래밍 교과서에서 기억할 수 있듯이, 그 당시에는 컴파일 시간 오류를 줄이기 위해 엄격하게 의도 된 대소 문자에 민감한 언어 만 제공 할 수 있습니다. 즉, "엄격함"은보다 정확한 코딩 분야를 개발하기위한 것입니다. 변수, 클래스, 메서드, 함수 및 여기에 던져 넣고 싶은 모든 항목에 대한 적절한 레이블링이 추가됨에 따라 발전했습니다.

거의 모든 책에 대문자 사용, 소문자 등의 권장 패턴이 포함되어있는 것을 기억합니다. 우리 모두 알다시피, 대부분은 폐기되었거나 실제로 무시하고 고급 프로덕션 하우스를 위해 저장해야합니다. CASE 솔루션 또는 더 높은 기술 수준에 도달 한 경우. 모두가이 학습 곡선을 경험한다고 생각합니다.

이러한 langauges와 IDE의 발전을 감안할 때 더 나은 질문은 어떤 언어가 내 개발 시간을 개선합니까? 물론 다양한 언어에 익숙하지 않은 경우 옵션이 제한됩니다.


1

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

"VB.NET 사례가 코드로 수행 할 수있는 작업을 제한하는 경우 C #으로의 전환을 고려하기에 충분히 설득력이 있습니까?"

C #을 사용하여 WCF WebService를 만듭니다. DataContract (1 클래스)를 만듭니다. "문자열 이메일"속성이있는 하나. 또 다른 속성으로 "문자열 이메일"이있는 또 다른. 개인 이메일 또는 사무실 이메일로 이해하기위한 선택. 또는 두 개의 다른 DataContract에있을 수 있습니다.

C #의 경우 괜찮습니다. 웹 서비스가 잘 생성됩니다. AC # 프로그램은 WSDL을 쉽게 만들 수 있으며 모든 것이 정상입니다.

이제 VB (모든 버전)로 WSDL을 만들어보십시오. "이메일"이 이미 선언되었으며 WSDL 생성에 실패했다고 표시됩니다.

모두와 마찬가지로 이것이 VB 언어의 단점이라고 생각했습니다. 그러나!!!

FxCOP를 사용하고 원본 C # 코드를 분석합니다. FxCOP는 이메일 / 이메일 사용이 문제라고 말합니다. 대소 문자를 구분하지 않는 다른 이름을 사용하는 것이 좋습니다. 또한 현재 .NET 프레임 워크에는 106 개의 프로그래밍 언어가 있으며 대소 문자 구분이 ON 인 많은 언어가 있습니다. 우리는 모두 클라우드로 이동하고 있으며 모든 프로그래밍 플랫폼 / 언어에서 서비스에 액세스 할 수 있기를 원합니다.

따라서 대소 문자를 구분하는 것은 프로그램 내에서 선택하는 것이며 C 사람이라면 원할 것입니다. C가 아닌 다른 프로그램에서 프로그램을 사용 / 접근하려면 대소 문자 구분을 지원해야하지만 언어는 선택 사항입니다.

http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Visual_Basic_.NET http://www.vbrad.com/article.aspx?id=65


클라우드는 대소 문자를 구분하는 URI를 사용합니다 (특히 프록시 및 캐시 서버에 중요).
binki 2017

1

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

다음은 예입니다 .

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

0

마지막에 귀하의 명시적인 두 번째 질문에 대해 언급 한 사람을 본 적이 없습니다. "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 #의 간결함을 훨씬 더 좋아합니다. 메서드에 문자 리터럴이 필요한 경우 한 문자 길이의 문자열이 아닌 문자를 제공해야하므로 ":"cVB 에서는 강제로 사용 하지만 C #에서는 ':'. 나는 이것이 nit-picking tho라고 생각합니다.

공정하게 말하면, Dim nameUpper$ = name.ToUpperInvariantC #에 빈 괄호가 필요한 경우 와 같이 메서드 호출 후에 빈 괄호를 넣지 않아도되는 등 VB에 좋아하는 이점이 있다고 말할 것 string nameUpper = name.ToUpperInvariant()입니다. : 너무 그것을 트리밍과 같이 그 배 Dim nameUpper$ = name.Trim.ToUpperInvariantstring 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 #에서), 유용 할 실제 상황을 생각조차하지 마십시오. 그래서 아마도 그것은 결국 핸디캡이 아닐 것입니다.

즐거운 코딩 되세요!


모든 세부 사항에 감사하지만, 귀하의 예제는 C #이 "더 나은"이유를 보여주기 위해 대소 문자 구분 / 무감각 (내가 말할 수있는 한)을 사용하지 않습니다.
Todd Main

두 번째 질문에 직접적인 예를 들어 답하려고했습니다.
Venkat

@ToddMain, 맞습니다. 그리고 내 예에서는 대소 문자 구분을 사용하여 C #이 더 나은 이유 를 보여 주지 않습니다. 왜냐하면 질문은 대소 문자 구분이 더 나은 이유를 묻지 않기 때문 입니다. 게다가이 기능이 그 자체로 말하고 있다고 생각합니다. 그리고 저는 그 논리가 대부분의 사람들이 스스로 추론 할 수있는 기본이라고 믿습니다. 하지만 누군가 요청하면 논리를 통해 단계를 밟도록 도와 드리겠습니다. 하지만 제 친구는 다른 질문이라고 생각합니다. )
숀 코바치

사실, 그것은 원래 게시물에서 묻는 두 가지 질문 중 하나였습니다. 자명하지 않기 때문에 내가 물었다. 그러나 문제를 해결하지 않는 것에 대해 걱정할 필요가 없습니다.
Todd Main

@ToddMain, 나는 당신의 요점을 봅니다. 참으로 매우 공정한 지적입니다. :) 내 눈을 열어 주셔서 감사합니다. :)
Shawn Kovac

0

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

삼.

Function c() As Integer
    'Some statement(s) here
End Function
Function C() As Integer
    'Some statement(s) here
End Function

이 모든 코드는 COMPILE-TIME ERROR를 발생 시킵니다.

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

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

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

사용자가 위의 주석에서 말했듯이 VB.NET 코드는 백그라운드에서 지속적으로 확인 및 / 또는 수정됩니다. VS IDE의 "오류 목록"창에서이 오류를 볼 수 있습니다. 그리고 이것은 AN ERROR 이고 NOT A WARNING 이므로 오류가 해결 될 때까지 코드가 컴파일되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.