ฉันได้เรียนรู้การเรียกดูผ่านคุณสมบัติที่ซ่อนอยู่ของ C # มาบ้างแล้วและรู้สึกประหลาดใจเมื่อไม่พบสิ่งที่คล้ายกันสำหรับ VB.NET
คุณลักษณะที่ซ่อนอยู่หรือที่รู้จักน้อยกว่าคืออะไร?
ฉันได้เรียนรู้การเรียกดูผ่านคุณสมบัติที่ซ่อนอยู่ของ C # มาบ้างแล้วและรู้สึกประหลาดใจเมื่อไม่พบสิ่งที่คล้ายกันสำหรับ VB.NET
คุณลักษณะที่ซ่อนอยู่หรือที่รู้จักน้อยกว่าคืออะไร?
คำตอบ:
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
sหนึ่งในคุณสมบัติที่ซ่อนอยู่ของ 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
ที่ IDE เสนอรายการ IntelliSense RuleTemplates
ค่าที่เป็นไปได้จาก
เนื่องจากนี่เป็นคุณสมบัติที่อาศัย IDE จึงเป็นการยากที่จะแสดงให้เห็นว่าสิ่งนี้มีลักษณะอย่างไรเมื่อคุณใช้งาน แต่ฉันจะใช้ภาพหน้าจอ:
รายการดำเนินการเสร็จสิ้น http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png
ในความเป็นจริง IntelliSense นั้นเหมือนกัน 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
มันควรจะเป็น. ;-) อย่างไรก็ตามข้อผิดพลาดนี้ไม่ถูกตรวจพบ (และได้รับ 28 upvotes) เป็นเวลาเกือบทั้งปี
Imports Assert = xUnit.Assert
Oh! และอย่าลืมXML Literalsตัวอักษร
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
รองรับการดำเนินการสองอย่างเท่านั้น:
การแคสต์อื่น ๆ จะไม่ทำงาน (เช่นการพยายาม unbox an Integer
to a Double
) และจะส่งผลให้เกิดข้อผิดพลาดเวลาคอมไพล์ / รันไทม์ (ขึ้นอยู่กับสถานการณ์และสิ่งที่ตรวจพบได้โดยการตรวจสอบประเภทคงที่) ฉันจึงใช้DirectCast
ทุกครั้งที่เป็นไปได้เนื่องจากสิ่งนี้จับจุดประสงค์ของฉันได้ดีที่สุด: ขึ้นอยู่กับสถานการณ์ฉันต้องการแกะกล่องค่าของประเภทที่รู้จักหรือทำการอัปแคสต์ ตอนจบของเรื่อง.
การใช้ CType
บนมืออื่น ๆ ที่ออกจากผู้อ่านของรหัสสงสัยว่าสิ่งที่โปรแกรมเมอร์ตั้งใจจริงๆเพราะมันหายไปทุกชนิดของการดำเนินงานที่แตกต่างกันรวมทั้งการเรียกรหัสผู้ใช้กำหนด
เหตุใดจึงเป็นคุณลักษณะที่ซ่อนอยู่ ทีมงาน VB ได้เผยแพร่แนวทางที่1ที่ไม่สนับสนุนการใช้งานDirectCast
(แม้ว่าจะเร็วกว่าก็จริง!) เพื่อให้โค้ดมีความสม่ำเสมอมากขึ้น ฉันยืนยันว่านี่เป็นแนวทางที่ไม่ดีที่ควรย้อนกลับ: เมื่อใดก็ตามที่เป็นไปได้ให้DirectCast
เลือกCType
ผู้ปฏิบัติงานทั่วไปมากกว่า ทำให้โค้ดชัดเจนขึ้นมาก CType
ในทางกลับกันควรเรียกก็ต่อเมื่อสิ่งนี้มีจุดมุ่งหมายจริง ๆ เท่านั้นเช่นเมื่อควรเรียกตัวCType
ดำเนินการจำกัด(เทียบกับตัวดำเนินการมากเกินไป )
1)ฉันไม่สามารถหาลิงค์ไปยังแนวทางได้ แต่ฉันพบว่าPaul Vick รับไปแล้ว (หัวหน้าผู้พัฒนาของทีม VB):
ในโลกแห่งความเป็นจริงคุณแทบจะไม่สังเกตเห็นความแตกต่างดังนั้นคุณอาจใช้ตัวดำเนินการแปลงที่ยืดหยุ่นกว่าเช่น CType, CInt และอื่น ๆ
(แก้ไขโดย Zack: เรียนรู้เพิ่มเติมที่นี่: ฉันจะแคสต์ใน VB.NET ได้อย่างไร )
TryCast
CType
TryCast
ใช้ได้เฉพาะกับประเภทการอ้างอิงเท่านั้นตามเอกสารประกอบ
If
ตัวดำเนินการตามเงื่อนไขและรวมตัวกันฉันไม่รู้ว่าคุณจะเรียกมันว่าซ่อนอย่างไร แต่ Iif ([expression], [value if true], [value if false]) เนื่องจากฟังก์ชัน 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)
:?
ตัวดำเนินการของ C และ Perl อย่างสมบูรณ์ไม่ใช่แค่เวอร์ชันที่เรียบง่าย
นี่เป็นสิ่งที่ดี คำสั่ง Select Case ภายใน VB.Net มีประสิทธิภาพมาก
แน่นอนว่ามีมาตรฐาน
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 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
นอกจากนี้ยังไม่เหมือนกับการประกาศว่าเป็นสมาชิกที่ใช้ร่วมกันของชั้นเรียน รายการที่ประกาศด้วยวิธีนี้รับประกันว่าปลอดภัยต่อเกลียวเช่นกัน มันไม่สำคัญในสถานการณ์นี้เนื่องจากนิพจน์จะไม่มีวันเปลี่ยนแปลง แต่มีบางอย่างที่อาจเกิดขึ้นได้
ใน 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 มากฉันเป็นทางลัดไปยังกลุ่มข้อมูลและฟังก์ชันต่างๆ ให้การเข้าถึงข้อมูลประเภทต่อไปนี้อย่างรวดเร็วและใช้งานง่าย:
แม้ว่าจะไม่ค่อยมีประโยชน์ แต่การจัดการเหตุการณ์สามารถปรับแต่งได้มาก:
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 ซึ่งช่วยให้คุณสามารถเพิ่มคู่ (คีย์ค่า) ลงในแฮชแท็กจากนั้นดึงค่าโดยใช้คีย์ ตัวอย่างเช่นรหัสต่อไปนี้จะเพิ่มรายการลงในแฮชแท็กสามรายการและค้นหาหนึ่งในนั้นโดยใช้คีย์ "หมู"
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, 5 แทนที่จะเป็น 4,5,6
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 # มีตั้งแต่เริ่มต้น มันเรียกการกำจัดโดยอัตโนมัติสำหรับคุณ
เช่น
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 Literals แต่ไม่เกี่ยวกับกรณีเฉพาะนี้:
คุณสามารถใช้ XML Literals เพื่อใส่สตริงลิเทอรัลที่จำเป็นต้องใช้ Escape สตริงลิเทอรัลที่มีเครื่องหมายอัญประกาศคู่
แทนสิ่งนี้:
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 อย่างไรก็ตามนั่นเป็นสำนวนที่ดีทีเดียว ชอบ!
DateTime สามารถเริ่มต้นได้โดยล้อมรอบวันที่ของคุณด้วย #
Dim independanceDay As DateTime = #7/4/1776#
คุณยังสามารถใช้การอนุมานประเภทร่วมกับไวยากรณ์นี้ได้
Dim independanceDay = #7/4/1776#
ดีกว่าการใช้ตัวสร้างมาก
Dim independanceDay as DateTime = New DateTime(1776, 7, 4)
คุณมีโค้ดได้ 2 บรรทัดในบรรทัดเดียว ด้วยเหตุนี้:
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
Title Case ใน VB.Net สามารถทำได้โดย VB6 fxn รุ่นเก่า:
StrConv(stringToTitleCase, VbStrConv.ProperCase,0) ''0 is localeID
คุณสมบัติที่มีพารามิเตอร์
ฉันได้ทำการเขียนโปรแกรม C # และค้นพบคุณลักษณะที่ขาดหายไปที่ VB.Net มี แต่ไม่ได้กล่าวถึงที่นี่
ตัวอย่างวิธีการทำเช่นนี้ (รวมถึงข้อ จำกัด c #) สามารถดูได้ที่: การใช้คุณสมบัติ get set ทั่วไปใน C # ... ด้วยพารามิเตอร์
ฉันได้ตัดตอนรหัสจากคำตอบนั้น:
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