programing

VB의 숨겨진 특징.NET?

linuxpc 2023. 5. 16. 22:13
반응형

VB의 숨겨진 특징.NET?

저는 C#의 숨겨진 기능을 통해 검색하는 것을 꽤 많이 배웠고 VB와 유사한 것을 찾지 못했을 때 놀랐습니다.그물.

그렇다면 숨겨진 특징이나 덜 알려진 특징은 무엇일까요?

Exception When절은 대체로 알 수 없습니다.

고려 사항:

Public Sub Login(host as string, user as String, password as string, _
                            Optional bRetry as Boolean = False)
Try
   ssh.Connect(host, user, password)
Catch ex as TimeoutException When Not bRetry
   ''//Try again, but only once.
   Login(host, user, password, True)
Catch ex as TimeoutException
   ''//Log exception
End Try
End Sub

정의 »Enums

VB의 진짜 숨겨진 기능 중 하나는completionlist고유한 XML 문서 데할 수 있는 태그입니다.Enum-확장 기능이 있는 유사 유형입니다.그러나 이 기능은 C#에서 작동하지 않습니다.

최근 내 코드의 한 예:

'
''' <completionlist cref="RuleTemplates"/>
Public Class Rule
    Private ReadOnly m_Expression As String
    Private ReadOnly m_Options As RegexOptions

    Public Sub New(ByVal expression As String)
        Me.New(expression, RegexOptions.None)
    End Sub

    Public Sub New(ByVal expression As String, ByVal options As RegexOptions)
        m_Expression = expression
        m_options = options
    End Sub

    Public ReadOnly Property Expression() As String
        Get
            Return m_Expression
        End Get
    End Property

    Public ReadOnly Property Options() As RegexOptions
        Get
            Return m_Options
        End Get
    End Property
End Class

Public NotInheritable Class RuleTemplates
    Public Shared ReadOnly Whitespace As New Rule("\s+")
    Public Shared ReadOnly Identifier As New Rule("\w+")
    Public Shared ReadOnly [String] As New Rule("""([^""]|"""")*""")
End Class

할 때는 변수에 값을 할당합니다.Rule 가능값의 IntelliSense의 가능한 값 합니다.RuleTemplates.

/편집:

이것은 IDE에 의존하는 기능이기 때문에 사용할 때 이것이 어떻게 보이는지 보여주기는 어렵지만 스크린샷을 사용하겠습니다.

http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png 작업의 완료 목록

는 'IntelliSense'를 동일하게 할 수 있습니다.Enum.

좋아요 비교 연산자를 알아챘습니까?

Dim b As Boolean = "file.txt" Like "*.txt"

MSDN에서 더 많은 정보

Dim testCheck As Boolean

' The following statement returns True (does "F" satisfy "F"?)'
testCheck = "F" Like "F"

' The following statement returns False for Option Compare Binary'
'    and True for Option Compare Text (does "F" satisfy "f"?)'
testCheck = "F" Like "f"

' The following statement returns False (does "F" satisfy "FFF"?)'
testCheck = "F" Like "FFF"

' The following statement returns True (does "aBBBa" have an "a" at the'
'    beginning, an "a" at the end, and any number of characters in '
'    between?)'
testCheck = "aBBBa" Like "a*a"

' The following statement returns True (does "F" occur in the set of'
'    characters from "A" through "Z"?)'
testCheck = "F" Like "[A-Z]"

' The following statement returns False (does "F" NOT occur in the '
'    set of characters from "A" through "Z"?)'
testCheck = "F" Like "[!A-Z]"

' The following statement returns True (does "a2a" begin and end with'
'    an "a" and have any single-digit number in between?)'
testCheck = "a2a" Like "a#a"

' The following statement returns True (does "aM5b" begin with an "a",'
'    followed by any character from the set "L" through "P", followed'
'    by any single-digit number, and end with any character NOT in'
'    the character set "c" through "e"?)'
testCheck = "aM5b" Like "a[L-P]#[!c-e]"

' The following statement returns True (does "BAT123khg" begin with a'
'    "B", followed by any single character, followed by a "T", and end'
'    with zero or more characters of any type?)'
testCheck = "BAT123khg" Like "B?T*"

' The following statement returns False (does "CAT123khg" begin with'
'    a "B", followed by any single character, followed by a "T", and'
'    end with zero or more characters of any type?)'
testCheck = "CAT123khg" Like "B?T*"

유형ef

는 VB의 인 종류를 있습니다.typedef경유로Import별칭:

Imports S = System.String

Dim x As S = "Hello"

이는 일반 유형과 함께 사용할 때 더욱 유용합니다.

Imports StringPair = System.Collections.Generic.KeyValuePair(Of String, String)

아! 그리고 XML 리터럴도 잊지 마세요.

Dim contact2 = _
        <contact>
          <name>Patrick Hines</name>
          <%= From p In phoneNumbers2 _
            Select <phone type=<%= p.Type %>><%= p.Number %></phone> _
          %>
        </contact>

개체 초기화도 이 안에 있습니다!

Dim x as New MyClass With {.Prop1 = foo, .Prop2 = bar}

DirectCast

DirectCast놀라운 일입니다.표면적으로는, 그것은 다음과 유사하게 작동합니다.CType연산자는 객체를 한 유형에서 다른 유형으로 변환합니다.그러나, 그것은 훨씬 더 엄격한 규칙에 의해 작동합니다. CType따라서 의 실제 동작은 종종 불투명하며 어떤 종류의 변환이 실행되는지 전혀 분명하지 않습니다.

DirectCast에서는 두 만 지원합니다.

  • 값 유형의 상자 해제 및
  • 클래스 계층에서 업캐스팅.

다른 캐스트는 작동하지 않습니다(예: 박스를 풀려고 시도).IntegerDouble(상황과 정적 유형 검사를 통해 감지할 수 있는 내용에 따라) 컴파일 시간/오류가 발생합니다.그러므로 나는 사용합니다.DirectCast가능할 때마다, 이것이 제 의도를 가장 잘 포착하기 때문입니다. 상황에 따라 알려진 유형의 값을 상자에서 꺼내거나 업캐스트를 수행하고 싶습니다.이야기의 끝.

용사를 합니다.CType반면에, 사용자 정의 코드 호출을 포함한 모든 종류의 다른 작업으로 해결되기 때문에 프로그래머가 정말로 의도한 것이 무엇인지 코드의 독자들에게 의문을 남깁니다.

이것이 숨겨진 기능인 이유는 무엇입니까?VB 팀은 사용을 금지하는 지침을1 발표했습니다.DirectCast(실제로는 더 빠르지만!) 코드를 더 균일하게 만들기 위해.저는 이것이 번복되어야 하는 나쁜 지침이라고 주장합니다.가능할 때마다 더 일반적인 연산자보다 선호합니다.그것은 코드를 훨씬 더 명확하게 만듭니다. CType반면에, 이것이 정말 의도된 경우에만, 즉 좁혀질 때에만 호출되어야 합니다.CType연산자(연산자 오버로드)를 호출해야 합니다.


1) 가이드라인에 대한 링크를 찾을 수는 없지만 폴 빅의 견해를 확인했습니다(VB 팀의 수석 개발자).

실제 환경에서는 차이를 거의 눈치채지 못할 것이기 때문에 CType, CInt 등과 같은 유연한 변환 연산자를 사용하는 것이 좋습니다.


(편집: 잭: 여기서 자세히 알아보기:VB에서 어떻게 캐스팅해야 하나요?NET?)

If 연산자

얼마나 숨겼을지 모르겠지만 Iif([표현식], [참이면 값], [거짓이면 값])객체 함수가 셀 수 있는 것처럼.

그것은 사용되지 않는 것만큼 숨겨져 있지 않습니다!VB 9에는 다음이 있습니다.IfC#의 조건부 연산자 및 병합 연산자와 정확히 동일하게 작동하는 연산자(원하는 항목에 따라 다름):

Dim x = If(a = b, c, d)

Dim hello As String = Nothing
Dim y = If(hello, "World")

다른 예를 표시하도록 편집:

이 기능은 다음과 같습니다.If() 지만예외일다니으킵으로 예외를 시킵니다.IIf()

Dim x = If(b<>0,a/b,0)

이것은 좋은 것입니다.VB 내의 Select Case 문.그물은 매우 강력합니다.

물론 기준이 있습니다.

Select Case Role
  Case "Admin"
         ''//Do X
  Case "Tester"
         ''//Do Y
  Case "Developer"
         ''//Do Z
  Case Else
       ''//Exception case
End Select

하지만 더 많은...

범위를 지정할 수 있습니다.

Select Case Amount
 Case Is < 0
    ''//What!!
 Case 0 To 15
   Shipping = 2.0
 Case 16 To 59
    Shipping = 5.87
 Case Is > 59
    Shipping = 12.50
 Case Else
    Shipping = 9.99
 End Select

그리고 더욱더...

여러 변수에 대해 부울 검사를 수행할 수 있습니다(좋은 생각은 아닐 수도 있음).

Select Case True
 Case a = b
    ''//Do X
 Case a = c
    ''//Do Y
 Case b = c
    ''//Do Z
 Case Else
   ''//Exception case
 End Select

항상 사용하는 주요 시간 절약 기능 중 하나는 With 키워드입니다.

With ReallyLongClassName
    .Property1 = Value1
    .Property2 = Value2
    ...
End With

저는 타자 치는 것을 필요 이상으로 좋아하지 않습니다!

쉽고 최고의 CSV 파서:

Microsoft.VisualBasic.FileIO.TextFieldParser

Microsoft에 대한 참조를 추가합니다.Visual Basic은 다른 모든 곳에서 사용할 수 있습니다.넷 언어(예: C#)

  • 및/또는 다른 논리 연산자

(편집: 여기서 자세히 알아보기:AndAlsoOrElse 연산자를 항상 사용해야 합니까?)

메서드의 정적 멤버입니다.

예:

Function CleanString(byval input As String) As String
    Static pattern As New RegEx("...")

    return pattern.Replace(input, "")
End Function

위 함수에서 패턴 정규식은 함수가 호출되는 횟수에 관계없이 한 번만 만들어집니다.

또 다른 용도는 "임의" 인스턴스를 다음과 같이 유지하는 것입니다.

Function GetNextRandom() As Integer
    Static r As New Random(getSeed())

    Return r.Next()
End Function 

또한 이는 단순히 클래스의 공유 멤버로 선언하는 것과 같지 않으며, 이렇게 선언되는 항목도 스레드 안전하게 보호됩니다.이 시나리오에서는 표현이 절대 변하지 않기 때문에 상관없지만, 표현이 바뀔 수 있는 다른 부분도 있습니다.

vb에서는 다음 연산자 간에 차이가 있습니다.

/이라Double
\이라Integer

Sub Main()
    Dim x = 9 / 5  
    Dim y = 9 \ 5  
    Console.WriteLine("item x of '{0}' equals to {1}", x.GetType.FullName, x)
    Console.WriteLine("item y of '{0}' equals to {1}", y.GetType.FullName, y)

    'Results:
    'item x of 'System.Double' equals to 1.8
    'item y of 'System.Int32' equals to 1
End Sub

저는 Visual Basic 2005에 도입된 "내" 네임스페이스를 정말 좋아합니다.My는 여러 그룹의 정보 및 기능에 대한 바로 가기입니다.다음과 같은 유형의 정보에 빠르고 직관적으로 액세스할 수 있습니다.

  • 내 컴퓨터:파일 시스템, 네트워크, 장치, 시스템 정보 등 컴퓨터와 관련된 정보에 액세스합니다.My.Computer를 포함하여 매우 중요한 리소스에 액세스할 수 있습니다.네트워크, 내 컴퓨터파일 시스템, 그리고 내 컴퓨터.프린터.
  • 내.응용 프로그램:이름, 버전, 현재 디렉토리 등 특정 응용프로그램과 관련된 정보에 액세스합니다.
  • My.User: 현재 인증된 사용자와 관련된 정보에 대한 액세스 권한입니다.
  • 내.리소스:리소스 파일에 있는 응용 프로그램이 강력한 형식으로 사용하는 리소스에 액세스합니다.
  • 내. 설정:강력한 형식으로 응용프로그램의 구성 설정에 액세스합니다.

사용자 지정 이벤트

이벤트 처리는 거의 유용하지 않지만 다음과 같이 크게 사용자 지정할 수 있습니다.

Public Class ApplePie
    Private ReadOnly m_BakedEvent As New List(Of EventHandler)()

    Custom Event Baked As EventHandler
        AddHandler(ByVal value As EventHandler)
            Console.WriteLine("Adding a new subscriber: {0}", value.Method)
            m_BakedEvent.Add(value)
        End AddHandler

        RemoveHandler(ByVal value As EventHandler)
            Console.WriteLine("Removing subscriber: {0}", value.Method)
            m_BakedEvent.Remove(value)
        End RemoveHandler

        RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
            Console.WriteLine("{0} is raising an event.", sender)
            For Each ev In m_BakedEvent
                ev.Invoke(sender, e)
            Next
        End RaiseEvent
    End Event

    Public Sub Bake()
        ''// 1. Add ingredients
        ''// 2. Stir
        ''// 3. Put into oven (heated, not pre-heated!)
        ''// 4. Bake
        RaiseEvent Baked(Me, EventArgs.Empty)
        ''// 5. Digest
    End Sub
End Class

그런 다음 다음과 같은 방법으로 테스트할 수 있습니다.

Module Module1
    Public Sub Foo(ByVal sender As Object, ByVal e As EventArgs)
        Console.WriteLine("Hmm, freshly baked apple pie.")
    End Sub

    Sub Main()
        Dim pie As New ApplePie()
        AddHandler pie.Baked, AddressOf Foo
        pie.Bake()
        RemoveHandler pie.Baked, AddressOf Foo
    End Sub
End Module

저는 방금 "사전 검색 연산자"라고도 알려진 "!" 연산자에 대해 이야기하는 기사를 발견했습니다.다음은 http://panopticoncentral.net/articles/902.aspx 의 기사에서 발췌한 것입니다.

! 연산자의 기술 이름은 "사전 조회 연산자"입니다.사전은 영어 사전의 항목이 정의할 단어로 인덱싱되는 것과 마찬가지로 숫자가 아닌 키로 인덱싱되는 모든 컬렉션 유형입니다.사전 유형의 가장 일반적인 예는 시스템입니다.컬렉션.해시 테이블 - 해시 테이블에 (키, 값) 쌍을 추가한 다음 키를 사용하여 값을 검색할 수 있습니다.예를 들어, 다음 코드는 해시 테이블에 세 개의 항목을 추가하고 "Pork" 키를 사용하여 그 중 하나를 찾습니다.

Dim Table As Hashtable = New Hashtable
Table("Orange") = "A fruit"
Table("Broccoli") = "A vegetable"
Table("Pork") = "A meat" 
Console.WriteLine(Table("Pork"))

! 연산자를 사용하여 문자열을 사용하여 값을 인덱싱하는 모든 사전 유형에서 값을 검색할 수 있습니다.! 뒤의 식별자는 조회 작업에서 키로 사용됩니다.따라서 위의 코드가 대신 작성되었을 수 있습니다.

Dim Table As Hashtable = New Hashtable
Table!Orange = "A fruit"
Table!Broccoli = "A vegetable"
Table!Pork = "A meat"
Console.WriteLine(Table!Pork)

두 번째 예시는 첫 번째 예시와 완전히 동일하지만, 적어도 제 눈에는 훨씬 더 멋져 보입니다.!를 사용할 수 있는 곳이 많다는 것을 알게 되었습니다. 특히 XML과 웹의 경우 문자열로 색인화된 컬렉션이 아주 많습니다.한 가지 유감스러운 제한 사항은! 뒤에 오는 것이 여전히 유효한 식별자여야 하므로 키로 사용하려는 문자열에 잘못된 식별자 문자가 포함되어 있으면! 연산자를 사용할 수 없습니다. (예를 들어, "표!"라고 말할 수 없습니다.)$는 식별자에 유효하지 않으므로 AB$CD = 5"입니다.)VB6 이전 버전에서는 괄호를 사용하여 잘못된 식별자(예: "표![AB$CD])에서 괄호를 사용하여 키워드를 이스케이프하기 시작했을 때 이를 수행할 수 있는 기능을 상실했습니다.그러나 대부분의 경우 이는 큰 제한이 아닙니다.

x!y는 x에 문자열 또는 개체를 매개 변수로 사용하는 기본 속성이 있는 경우에 실제로 기술적으로 사용됩니다.이 경우 x!y는 x로 바뀝니다.기본 속성("y").흥미로운 부수적인 사항은 언어의 어휘 문법에 이것을 모두 작동시키기 위한 특별한 규칙이 있다는 것입니다.! 문자는 언어에서 형식 문자로도 사용되며, 형식 문자는 연산자 앞에 놓입니다.따라서 특별한 규칙이 없으면 x!y는 "x!y"가 아닌 "x!y"로 스캔됩니다.다행히 언어에서 한 줄에 있는 두 개의 식별자가 유효한 곳이 없기 때문에! 뒤에 있는 다음 문자가 식별자의 시작일 경우!를 형식 문자가 아닌 연산자로 간주한다는 규칙을 도입했습니다.

이 기능은 기본 제공되며 C#에 비해 확실한 이점이 있습니다.동일한 이름을 사용하지 않고 인터페이스 메서드를 구현할 수 있는 기능입니다.

예:

Public Sub GetISCSIAdmInfo(ByRef xDoc As System.Xml.XmlDocument) Implements IUnix.GetISCSIInfo

End Sub

밸브로 강제 적용

VB에서 인수를 추가 괄호 집합으로 묶으면 메서드의 ByRef 선언을 재정의하고 ByVal로 바꿀 수 있습니다.예를 들어, 다음 코드는 4,5,6 대신 4,5,5를 생성합니다.

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim R = 4
    Trace.WriteLine(R)
    Test(R)
    Trace.WriteLine(R)
    Test((R))
    Trace.WriteLine(R)
End Sub
Private Sub Test(ByRef i As Integer)
    i += 1
End Sub

절차 호출에 의해 수정되지 않는 인수 - 기본 변수 참조

이름별로 매개 변수 전달 및 매개 변수 순서 변경

Sub MyFunc(Optional msg as String= "", Optional displayOrder As integer = 0)

    'Do stuff

End function

용도:

Module Module1

    Sub Main()

        MyFunc() 'No params specified

    End Sub

End Module

":=" 매개 변수 사양을 사용하여 다음과 같은 순서로 호출할 수도 있습니다.

MyFunc(displayOrder:=10, msg:="mystring")

Using 문은 VB 8부터 새로워졌으며, C#은 처음부터 사용했습니다.자동 폐기를 호출합니다.

예.

Using lockThis as New MyLocker(objToLock)

End Using

가져오기 별칭도 대부분 알 수 없습니다.

Import winf = System.Windows.Forms

''Later
Dim x as winf.Form

다음 이벤트 선언을 고려합니다.

Public Event SomethingHappened As EventHandler

C#에서 다음 구문을 사용하여 이벤트 가입자를 확인할 수 있습니다.

if(SomethingHappened != null)
{
  ...
}

하지만, VB는.NET 컴파일러는 이를 지원하지 않습니다.실제로 IntelliSense에는 표시되지 않는 숨겨진 개인 구성원 필드를 만듭니다.

If Not SomethingHappenedEvent Is Nothing OrElse SomethingHappenedEvent.GetInvocationList.Length = 0 Then
...
End If

추가 정보:

http://jelle.druyts.net/2003/05/09/BehindTheScenesOfEventsInVBNET.aspx http://blogs.msdn.com/vbteam/archive/2009/09/25/testing-events-for-nothing-null-doug-rothaus.aspx

키워드 이름과 일치하는 변수 이름이 필요한 경우 괄호로 묶습니다.nec가 아닙니다.하지만 최선의 관행 - 그러나 그것은 현명하게 사용될 수 있습니다.

예.

Class CodeException
Public [Error] as String
''...
End Class

''later
Dim e as new CodeException
e.Error = "Invalid Syntax"

예: 댓글(@Pondidum)의 예:

Class Timer
Public Sub Start()
''...
End Sub

Public Sub [Stop]()
''...
End Sub

XML Literals에 대한 몇 가지 답변이 있지만, 이 특정 사례에 대한 답변은 다음과 같습니다.

XML 리터럴을 사용하여 이스케이프해야 하는 문자열 리터럴을 포함할 수 있습니다.예를 들어 이중 따옴표를 포함하는 문자열 리터럴입니다.

이 대신:

Dim myString = _
    "This string contains ""quotes"" and they're ugly."

다음을 수행할 수 있습니다.

Dim myString = _
    <string>This string contains "quotes" and they're nice.</string>.Value

CSV 구문 분석을 위해 리터럴을 테스트하는 경우 특히 유용합니다.

Dim csvTestYuck = _
    """Smith"", ""Bob"", ""123 Anywhere St"", ""Los Angeles"", ""CA"""

Dim csvTestMuchBetter = _
    <string>"Smith", "Bob", "123 Anywhere St", "Los Angeles", "CA"</string>.Value

((으ㄹ<string>물론 태그입니다. 원하는 태그를 사용할 수 있습니다.)

날짜를 #로 둘러싸서 DateTime을 초기화할 수 있습니다.

Dim independanceDay As DateTime = #7/4/1776#

이 구문과 함께 유형 추론을 사용할 수도 있습니다.

Dim independanceDay = #7/4/1776#

그것은 건설자를 사용하는 것보다 훨씬 좋습니다.

Dim independanceDay as DateTime = New DateTime(1776, 7, 4)

한 줄에 두 줄의 코드를 사용할 수 있습니다.따라서:

Dim x As New Something : x.CallAMethod

선택적 매개변수

옵션은 다음과 같은 새 오버로드를 만드는 것보다 훨씬 쉽습니다.

Function CloseTheSystem(Optional ByVal msg AS String = "Shutting down the system...")
   Console.Writeline(msg)
   ''//do stuff
End Function

제목 케이스 인 VB.이전 VB6 fxn을 사용하면 네트를 달성할 수 있습니다.

StrConv(stringToTitleCase, VbStrConv.ProperCase,0) ''0 is localeID

매개 변수가 있는 속성

저는 C# 프로그래밍을 좀 하다가 VB에 누락된 기능을 발견했습니다.넷은 있었지만, 여기서 언급되지 않았습니다.

이를 수행하는 방법의 예는 (c# 제한뿐만 아니라) 에서 확인할 수 있습니다: C#...의 일반적인 getset 속성을 매개 변수와 함께 사용

저는 그 답변에서 코드를 발췌했습니다.

Private Shared m_Dictionary As IDictionary(Of String, Object) = _
             New Dictionary(Of String, Object)

Public Shared Property DictionaryElement(ByVal Key As String) As Object
    Get
        If m_Dictionary.ContainsKey(Key) Then
            Return m_Dictionary(Key)
        Else
            Return [String].Empty
        End If
    End Get
    Set(ByVal value As Object)
        If m_Dictionary.ContainsKey(Key) Then
            m_Dictionary(Key) = value
        Else
            m_Dictionary.Add(Key, value)
        End If

    End Set
End Property

언급URL : https://stackoverflow.com/questions/102084/hidden-features-of-vb-net

반응형