IT

VB.NET의 숨겨진 기능?

lottoking 2020. 7. 12. 09:05
반응형

VB.NET의 숨겨진 기능?


VB.NET과 C #의 숨겨진 기능을 통해 배웠습니다.

숨겨 지거나 알려지지 않은 기능은 무엇입니까?


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

사용자 Enum

VB의 숨겨진 기능 중 하나는 확장 된 기능으로 completionlist고유 한 Enum유형 을 작성하는 데 사용할 수있는 XML 문서 태그입니다 . 그러나 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

이제로 선언 된 변수에 값을 할당 할 때 RuleIDE는 가능한 값의 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*"

타입 정의

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. 나는 이것이 반대된다고 주장한다. 마다 가능할 때 DirectCast보다 일반적인 CType운영자 보다 선호 한다 . 코드가 훨씬 명확 해집니다. CType반면에 의도 된 경우, 즉 축소 CType연산자 (예 : 연산자 등장 )를 호출해야하는 경우 호출해야합니다.


1) 가이드 라인에 대한 링크를 만들 수 없지만 Paul Vick 이이를 수행 한 것을 발견 했습니다 (VB 팀의 수석 개발자).

CType, CInt 사용 가능한 변환 연산자를 사용할 수 있습니다.


(Zack에 의해 편집 : 자세한 내용은 여기 에서 VB.NET에서 캐스팅해야합니까? )


If 조건부 및 통합 연산자

어떻게 숨길 지 모르겠지만 Iif ([표현식], [값이면 참], [값이면 거짓]) As Object 함수는 셀 수 있습니다.

사용되지 더 이상 않는 것처럼 숨겨져 있지 않습니다 ! VB 9에는 If연산자가 더 좋으며 C #의 조건부 및 병합 연산자와 동일하게 작동합니다 (원하는 내용에 따라 다름).

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.Net의 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.VisualBasic에 대한 참조를 추가하면 다른 .Net 언어 (예 : C #)로 사용할 수 있습니다.


  • AndAlso / OrElse 논리 연산자

(편집 : 항상 AndAlso 및 OrElse 연산자를 사용하고 있습니까? )


메소드의 정적 멤버

예를 들면 다음과 같습니다.

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.Computer.Network, My.Computer.FileSystem 및 My를 여러 가지 중요한 리소스에 액세스 할 수 있습니다. 컴퓨터 프린터
  • My.Application : 이름, 버전, 현재 수신 같은 특정 응용 프로그램과 관련된 정보에 액세스
  • 사용자 : 현재 인증 된 사용자와 관련된 정보에 액세스합니다.
  • My.Resources : 리소스 파일에 상주 하는 응용 프로그램에서 사용하는 리소스에 대한 강력한 형식의 액세스
  • My.Settings : 강력한 형식으로 응용 프로그램의 구성 설정에 액세스합니다.

맞춤 이벤트

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

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 의 기사에서 발췌 한 내용은 다음과 있습니다.

의 버전! operator는 "사전 조회 연산자"입니다. 사전은 영어 사전의 항목을 정의하려는 단어로 색인하는 방식과 같이 숫자가 아닌 키로 색인되는 컬렉션 유형입니다. 사전 유형의 가장 일반적인 예는 System.Collections.Hashtable입니다.이를 통해 해시 테이블에 (키, 값) 쌍을 추가 한 다음 키를 사용하여 값을 검색 할 수 있습니다. 예를 들어 다음 코드는 해시 테이블에 세 개의 항목을 추가하고 "돼지"키를 사용하여 그 중 하나를 찾습니다.

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 및 웹과 관련하여 많은로 인덱싱 된 수많은 컬렉션이있는 경우에 사용할 수 있습니다. 불행한 한계 중 하나는! 여전히 유효한 식별자 사용 가능한 식별자입니다. 운영자. (예를 $는 식별자에서 유효하지 않으므로 "Table! AB $ CD = 5"라고 말할 수 없습니다.) VB6 이전에는 괄호를 사용하여 잘못된 식별자를 사용할 수 있습니다. (예 : "Table! [AB $ CD]") 를 사용하지만 키워드를 이스케이프하기 위해 대괄호를 사용하기 시작했을 때이를 수행 할 수 없습니다. 그러나 대부분의 경우 이는 제한이 아닙니다.

실제로 기술적으로 표현하기 위해 x! y는 x에 String 또는 Object를 사용하는 기본 속성이있는 경우 작동합니다. 이 경우 x! y가 x.DefaultProperty ( "y")로 변경됩니다. 흥미로운 규칙은 언어의 어휘 문법 에이 모든 것이 작동하도록하는 특별한 규칙이 있습니다. ! 문자는 또한 언어에서 유형 문자로 사용 종료 유형 문자는 연산자보다 먼저 먹습니다. 특별한 규칙이 있기는하지만 x! y는 "x! y"대신 "x! y"로 스캔됩니다. 다행스럽게도, 한 행에 두 개의 개의 식별자가 유효한 언어에는 자리가 없기 때문에 다음 문자가! 식별자의 시작입니다. 우리는! 유형 문자가 아닌 연산자입니다.


이 내장되어 있고 C #에 비해 확실한 이점입니다. 동일한 이름을 사용하지 않는 인터페이스 방법을 구현할 수있는 기능

같은 :

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

End Sub

ByVal 강제

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")

문은 VB 사용하기 8부터 새로 도입 한 C #은 처음부터 시작했습니다. 자동으로 dispose를 호출합니다.

예 :

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


키워드와 일치하는 변수 이름이 필요한 경우 대괄호로 묶으십시오. 필요하지 않습니다. 모범 사례-그러나 현명하게 사용할 수 있습니다.

예 :

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 리터럴에 대한 몇 가지 대답이 예시에 말할 것입니다.

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>물론 태그 를 사용할 필요는 없으며 원하는 태그를 사용할 수 있습니다.)


#로 날짜를 초기화 할 수 있습니다.

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.Net의 타이틀 케이스는 오래된 VB6 fxn으로 달성 할 수 있습니다.

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

매개 변수가있는 특성

나는 C # 프로그래밍을하고 VB.Net에없는 기능을 발견했지만 여기에 언급되지 않았습니다.

이 작업을 수행하는 방법 (및 C # 제한)의 예는 다음에서 확인할 수 있습니다. C #에서 일반적인 get set 속성 사용 ...

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

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

반응형