2009-09-28 17 views
2

저는 C# 배경에서 왔지만 현재는 VB.Net을 주로 사용하고 있습니다. 위의 함수들 (그리고 다른 함수들 - 예 : UCase, LCase) 등은 VB6에서 이전과 같은 것입니다. 이러한 함수의 사용은 VB.Net에서 눈살을 찌푸 리지 않습니까? 아니면 순전히 개인의 취향에 달려 있습니까?VB.Net에서 Mid(), Instr(), LBound(), UBound() 등의 사용이 권장되지 않습니까?

내 개인적인 취향은 그들로부터 멀리 떨어져있는 것이지만, 그것이 내 C# 편견인지 궁금해하고 있습니다.

몇 가지 문제, 특히 VB6에서 VB.Net으로 변환 된 코드의 경우, 컬렉션의 0 인덱싱이 버그가 코드에 도입 된 것을 의미하며 따라서주의해야합니다.

+0

비슷한 토론 http://stackoverflow.com/questions/241822/vb-runtime-functions-in-vb-net-for-vb6-programmers – MarkJ

+0

여기 또 다른 하나 http://stackoverflow.com/questions/ 226517/is-the-microsoft-visualbasic-namespace-true-net-code – MarkJ

답변

1

이러한 옵션은 이전 버전과의 호환성을위한 것입니다.

하지만 사람들이 프레임 워크 클래스/메소드를 사용하여 일관성을 유지하는 것이 좋습니다.
VB6 기능은 이해하기 쉽습니다. VB 배경을 가진 사람에게는 문제가되지 않습니다.

편집 : 또한 프레임 워크 클래스에서 사용할 수있는 오버로드 중 일부는 간단한 VB6 유사 문과 동일한 기능을 사용할 수 없습니다. 지금 당장은 기억이 나지 않습니다.하지만 이것은 제가 생각하기에 프레임 워크 클래스/메소드를 사용하는 더 좋은 이유입니다.

6

이러한 기능은 처음에 있다는 것을 이유는 그들이 VB 언어의 일부인 물론이고, 6

그러나, 그들은 프레임 워크의 방법 단지 래퍼 없습니다 VB에서 상속, 일부 그들 중 일부는 여러면에서 다른 점을 만드는 몇 가지 추가적인 논리를 가지고 있습니다. 예를 들어 Mid 함수를 사용하면 문자열 밖에있는 범위를 지정할 수 있으며 범위를 자동으로 줄이고 남아있는 문자열 부분을 반환합니다. String.Substring 메서드는 문자열 외부에 범위를 지정하면 예외를 throw합니다.

그래서 함수는 래퍼가 아니라 프로그래밍에서 Visual Basic에 더 많은 다른 접근 방식을 나타냅니다. Visual Basic에서는 함수에 대해 거의 모든 것을 던져 넣을 수 있으며 거의 ​​항상 뭔가를 얻을 수 있습니다. 더 쉬운 방법은 모든 특별한 경우에 대해 생각할 필요가 없지만, 다른 한편으로는 함수에 불합리한 것을 공급할 때 결과를 얻지 않고 예외를 얻고 싶을 수도 있습니다. 디버깅 할 때 오류 값의 출처를 추적하는 대신 가능한 빨리 예외를 얻는 것이 더 쉽습니다.

+0

"함수에서 거의 모든 것을 던져 거의 항상 뭔가를 얻는다"고 말할 때 어떤 함수를 생각하고 있습니까? CDbl과 같은 캐스팅/변환 함수에 적용되지만 지금 당장 생각할 수있는 다른 함수에는 적용되지 않습니다. – MarkJ

+0

예를 들어 Mid (Nothing, 4,2)를 호출 할 수 있으며 문자열이 아닌 문자열에 대해 불평하지 않습니다 ... – Guffa

0

나는 그것을 피할 것이다. VB.NET 프로젝트로 변환되었을 가능성이있는 VB6 코드를 상속받은 것처럼 들었으므로 말입니다. 그렇지 않으면 새로운 VB.NET 프로젝트라면 VB6 메서드를 사용할 가치가 없습니다.

저는 VB6에서 VB.NET으로의 변환 프로젝트를 몇 차례했습니다. 이름과 0 기반 색인 생성의 차이점에 익숙하지만, 필자가 만난 모든 코드는 리팩토링되어 .NET 동등 물을 사용합니다. 이것은 부분적으로 일관성을 유지하고 프레임 워크에 익숙한 해당 프로젝트에서 VB6 프로그래머를 얻는 것이 었습니다. 그러나 리팩토링에서 다른 이점은 메서드 호출을 함께 연결할 수 있다는 것입니다. 당신이 알고

Dim input As String = "hello world" 

Dim result As String = input.ToUpper() ' .NET 
Dim result As String = UCase(input) ' VB6 

다음 일, 나는 다른 요구 사항을 충족하기 위해 더 많은 작업을 수행해야합니다

는 다음과 같은 고려하십시오.명확하고 수정하는 것이 더 쉽습니다

Dim result As String = input.ToUpper().Substring(0, 5) ' .NET 
Dim result As String = Mid(UCase(input), 1, 5)   ' VB6 

: 코드에서 어떤 결과 "안녕하세요"의 내가 문자열을 얻을 필요가 있다고 가정 해 봅시다은 업데이트하기? . NET에서 나는 단지 그것을 묶어. VB6에서는 메서드의 시작 부분에서 시작하고 마지막으로 이동하여 닫는 괄호를 추가해야했습니다. 다시 변경하거나 .NET에서 제거해야하는 경우 .NET의 끝에서 잘라냅니다.하지만 VB6에서는 시작과 끝까지 되돌아 가야합니다.

나는 나중에 프로젝트에 참여하는 다른 .NET 개발자, 특히 C# 배경의 사람들이 쉽게 가져올 수 있기 때문에 .NET 방법을 사용하는 것이 가치 있다고 생각합니다.

+1

실제로 함수 목록에서 최종 함수를 보는 것의 이점 중 하나는 식의 형식이 무엇인지 명확히 알 수 있기 때문입니다. ".NET"접근 방식은 수정하기가 더 쉽지만 VB6 접근 방식에서는 추가 선택/삭제 작업이 필요하지만 기능적 접근 방식보다 나은 체인 연결을 정당화 할 수있을 것으로 확신합니다. 특히 fnB (fnA (x))가 다시 일반적인 함수 언어로 작업하기 시작하면. – AnthonyWJones

+0

VB6 접근법도 더 명확합니다. AnthonyWJones와 동의합니다. 경험이 부족한 프로그래머들은 .NET 접근 방식을 사용하여이를 추가 할 것입니다. 종종 프로그래머들은'input.ToUpper'가 새로운 문자열을 만드는 대신'input'을 변경했다고 생각합니다. 예, 모두 문자열을 변경할 수 없다는 것을 알고 있어야하지만 여전히 일반적인 실수입니다. VB6 구문을 사용하면 입력 문자열이 변경되지 않습니다. – MarkJ

+0

의견 녀석, 재미있는 관점을 주셔서 감사합니다. @ MarkJ : 게시 한 링크가 도움이되었습니다. 첫 번째 링크에서 Joel Coehoorn의 답변에 더 의지합니다. –

1

특수한 경우가 있습니다 만, 손을 뗀 상태에서 문자열이 "Nothing"과 Nothing이 아닌 경우 차이가 없으면 VB6 버전을 사용하십시오.

저는 두 가지 방법을 사용하는 다른 프로그래머, 'Mid (MyString, 2)'가 작동하는 동안 사람들이 'MyString.SubString (1)'을 사용하는 코드가 불어 나는 큰 프로젝트를 진행하고있었습니다.

이 예제의 두 가지 주요 오류는 다음과 같습니다. (1) 문자열은 아무 것도 아니며 메서드를 실행하기 전에 확인해야합니다. OO 표기법의 제한 : '아무것도'또는 (빈 객체)를 원한다고해도 객체가 아무것도없는 경우 멤버 메소드를 호출 할 수 없습니다. 문자열에 nullable/stub 객체 (""또는 string.empty를 사용할 수있는)를 사용하여이 문제가 해결 되었더라도 여전히 올바르게 초기화되었는지 확인해야합니다. 예를 들어 Nothing 우리가 통제 할 수없는 라이브러리 호출에서 문자열을받을 때 ""사용합니다.

너는 아무것도 아닌 문자열을 갖게 될 것입니다. 시간의 90 %는 ""을 의미합니다. .SubString을 사용하면 항상 아무것도 확인하지 않아도됩니다. VB 버전에서는 약 10 % 만 신경 써야합니다.

(2) 특히 중간 예제에서 다시 한 번, 2 char 문자열 중 chars 3 ~ 10을 원한다면 다시 90 %가 반환됩니다. 실제로, 당신은 거의 예외를 원할 것입니다 : 당신은 적절한 길이와 코드가 어떻게 행동해야 하는지를 먼저 체크해야 할 것입니다. (적어도 정의 된 행동, 적어도 데이터 입력 오류가 있습니다. 예외를 던지고 싶지 않습니다.)

.Net 버전에서는 100 %의 시간을 확인하고 VB 버전에서는 거의 사용하지 않습니다.

.Net은 모든 것을 객체 지향 철학에 집중하고자했습니다. 그러나 문자열은 미묘한 방식으로 사용되는 대부분의 개체와 약간 다릅니다. MS-Basic은 함수를 만들 때 이것을 생각하지 않았습니다. 단지 운이 좋았습니다. 함수의 강점 중 하나는 null 객체를 처리 할 수 ​​있다는 것입니다.

프로젝트의 경우, 처음에는 '아무것도 없음'문자열이 우리의 흐름에 어떻게 도달했는지 물어볼 수 있습니다. 그러나 .Net 기능을 사용하려는 일부 프로그래머의 결정은 피할 수없는 서비스 호출, 응급 버그 수정 및 패치를 의미했습니다. 문제를 스스로 해결하십시오.

관련 문제