답변:
이 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
sVB 의 진짜 숨겨진 기능 중 하나는 확장 된 기능을 가진 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
이제으로 선언 된 변수에 값을 할당 할 때 Rule
IDE는에서 가능한 값의 IntelliSense 목록을 제공합니다 RuleTemplates
.
이것은 IDE에 의존하는 기능이기 때문에 이것을 사용할 때 어떻게 보이는지보기는 어렵지만 스크린 샷 만 사용하겠습니다.
작업 완료 목록 http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png
실제로 IntelliSense는 .NET Framework를 사용할 때 얻는 것과 100 % 동일합니다 Enum
.
friend
하거나 enum : Rule
대신 동일한 클래스를 사용하여 이를 방지 할 수 있습니다 RuleTemplate
.
Like 비교 연산자를 보셨습니까?
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)
Imports
그것은해야한다. ;-) 어쨌든,이 오류는 거의 1 년 동안 감지되지 않고 28 개의 찬성표를 얻었습니다.
Imports Assert = xUnit.Assert
오! XML 리터럴을 잊지 마세요 .
Dim contact2 = _
<contact>
<name>Patrick Hines</name>
<%= From p In phoneNumbers2 _
Select <phone type=<%= p.Type %>><%= p.Number %></phone> _
%>
</contact>
<string>This string contains "quotes" and it's OK.</string>.Value
. (나는이 모든 필드가 따옴표로했다 CSV 파일을 구문 분석에 대한 테스트를 작성할 때 특히 유용 그것은 것 발견 되지 에서 손으로 모든 따옴표를 탈출 할 수 있었다 재미를 내 테스트 라인.)
객체 초기화도 거기에 있습니다!
Dim x as New MyClass With {.Prop1 = foo, .Prop2 = bar}
DirectCast
DirectCast
놀랍습니다. 표면적 CType
으로는 객체를 한 유형에서 다른 유형으로 변환한다는 점 에서 연산자 와 유사하게 작동합니다 . 그러나 훨씬 더 엄격한 규칙에 따라 작동합니다. CType
따라서의 실제 동작은 종종 불투명하며 어떤 종류의 변환이 실행되는지 전혀 분명하지 않습니다.
DirectCast
다음 두 가지 작업 만 지원합니다.
다른 모든 캐스트는 작동하지 않으며 (예 :에서 Integer
에 대한 unbox를 시도하는 경우 Double
) 컴파일 시간 / 런타임 오류가 발생합니다 (상황 및 정적 유형 검사로 감지 할 수있는 항목에 따라 다름). 따라서 DirectCast
가능한 한 항상 사용 합니다. 이것이 내 의도를 가장 잘 포착하기 때문입니다. 상황에 따라 알려진 유형의 값을 풀거나 업 캐스트를 수행하고 싶습니다. 이야기의 끝.
CType
반면에를 사용하면 사용자 정의 코드 호출을 포함하여 모든 종류의 다른 작업으로 해결되기 때문에 코드 독자는 프로그래머가 실제로 무엇을 의도했는지 궁금해하게됩니다.
이것이 숨겨진 기능인 이유는 무엇입니까? VB 팀은 코드를 더 균일하게 만들기 위해 (실제로 더 빠르더라도!) 사용을 권장하지 않는 지침 1 을 발표했습니다 DirectCast
. 나는 이것이 역전되어야하는 나쁜 가이드 라인이라고 주장한다 : 가능 DirectCast
하면 더 일반적인 CType
연산자 보다 선호하라 . 코드를 훨씬 더 명확하게 만듭니다. CType
반면에는 실제로 의도 한 경우에만 호출해야합니다. 즉, 축소 CType
연산자 ( 연산자 오버로딩 참조 )를 호출해야하는 경우에만 호출해야합니다.
1) 가이드 라인에 대한 링크를 찾을 수 없지만 Paul Vick의 의견을 찾았 습니다 (VB 팀의 수석 개발자).
실제 세계에서는 그 차이를 거의 알아 차리지 못하므로 CType, CInt 등과 같은보다 유연한 변환 연산자를 사용하는 것이 좋습니다.
(Zack 편집 : 여기에서 자세히 알아보기 : VB.NET에서 어떻게 캐스트해야합니까? )
TryCast
나는 주로 .NET을 널리 사용하여 골라 낼 뼈가 있었기 때문에 그 당시에 언급하지 않은 것은 부끄러운 일 입니다 CType
.
TryCast
문서에 따라 참조 유형에서만 작동하기 때문입니다.
If
조건부 및 통합 연산자어떻게 숨겨 졌는지 모르겠지만 Iif ([expression], [value if true], [value if false]) 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
Select Case True
이 때문이다 보인다 는 평가 것처럼 각각 의 Case
진술 및 사실 각각의 코드를 실행합니다. 그러나 실제로는 하나씩 평가하고 사실 인 첫 번째 코드에 대해서만 코드를 실행 합니다. 의 구문 If
은 이와 관련하여 훨씬 더 명확합니다 ( If...Else If...Else If...Else
).
내가 항상 사용하는 주요 시간 절약 방법 중 하나는 With 키워드입니다.
With ReallyLongClassName
.Property1 = Value1
.Property2 = Value2
...
End With
나는 내가해야하는 것보다 더 많이 입력하는 것을 좋아하지 않는다!
가장 쉽고 간편한 CSV 파서 :
Microsoft.VisualBasic.FileIO.TextFieldParser
Microsoft.VisualBasic에 대한 참조를 추가하면 다른 .Net 언어 (예 : C #)에서 사용할 수 있습니다.
(편집 : 여기에서 자세히 알아보기 : 항상 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
또한 이것은 단순히 클래스의 Shared 멤버로 선언하는 것과 동일하지 않습니다. 이 방법으로 선언 된 항목도 스레드로부터 안전합니다. 이 시나리오에서는 표현이 절대 변경되지 않기 때문에 문제가되지 않지만 다른 경우가있을 수 있습니다.
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 는 여러 정보 및 기능 그룹에 대한 바로 가기입니다. 다음 유형의 정보에 대한 빠르고 직관적 인 액세스를 제공합니다.
거의 유용하지는 않지만 이벤트 처리는 크게 사용자 정의 할 수 있습니다.
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 의 기사에서 발췌 한 것입니다.
!의 기술적 이름입니다. 연산자는 "사전 조회 연산자"입니다. 사전은 영어 사전의 항목이 정의하려는 단어로 인덱싱되는 방식과 같이 숫자가 아닌 키로 인덱싱되는 컬렉션 유형입니다. 딕셔너리 형식의 가장 일반적인 예는 System.Collections.Hashtable로, 해시 테이블에 (키, 값) 쌍을 추가 한 다음 키를 사용하여 값을 검색 할 수 있습니다. 예를 들어, 다음 코드는 3 개의 항목을 해시 테이블에 추가하고 "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과 웹의 경우 문자열로 인덱싱되는 수많은 컬렉션이있는 경우에 사용할 수 있습니다. 한 가지 안타까운 제한은! 여전히 유효한 식별자 여야하므로 키로 사용하려는 문자열에 유효하지 않은 식별자 문자가 포함되어있는 경우! 운영자. (예를 들어 "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")
Using 문은 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>
물론 태그 를 사용할 필요는 없습니다 . 원하는 태그를 사용할 수 있습니다.)
<q>
Perl / Ruby에서 사용하는 것과 유사한 좋은 태그가 될 것입니다. 어쨌든, 그것은 꽤 좋은 관용구입니다. 처럼!
한 줄에 두 줄의 코드를 만들 수 있습니다. 그 후:
Dim x As New Something : x.CallAMethod
Call (New Something).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