Tôi đã tìm hiểu khá kỹ về cách duyệt qua Các tính năng ẩn của C # và rất ngạc nhiên khi tôi không thể tìm thấy thứ gì đó tương tự cho VB.NET.
Vậy một số tính năng ẩn hoặc ít được biết đến của nó là gì?
Tôi đã tìm hiểu khá kỹ về cách duyệt qua Các tính năng ẩn của C # và rất ngạc nhiên khi tôi không thể tìm thấy thứ gì đó tương tự cho VB.NET.
Vậy một số tính năng ẩn hoặc ít được biết đến của nó là gì?
Câu trả lời:
Các Exception When
khoản chưa được biết đến.
Xem xét điều này:
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
sMột trong những tính năng ẩn thực sự của VB là completionlist
thẻ tài liệu XML có thể được sử dụng để tạo Enum
các kiểu giống riêng với chức năng mở rộng. Tuy nhiên, tính năng này không hoạt động trong C #.
Một ví dụ từ mã gần đây của tôi:
'
''' <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
Bây giờ, khi gán giá trị cho một biến được khai báo là Rule
, IDE cung cấp danh sách IntelliSense về các giá trị có thể từ đó RuleTemplates
.
Vì đây là một tính năng phụ thuộc vào IDE, thật khó để hiển thị nó trông như thế nào khi bạn sử dụng nó nhưng tôi sẽ chỉ sử dụng ảnh chụp màn hình:
Danh sách hoàn thành đang hoạt động http://page.mi.fu-berlin.de/krudolph/stuff/completionlist.png
Trên thực tế, IntelliSense giống 100% với những gì bạn nhận được khi sử dụng Enum
.
friend
hoặc bằng cách sử dụng cùng một lớp với enum: Rule
thay vì RuleTemplate
.
Bạn có nhận thấy toán tử so sánh Like không?
Dim b As Boolean = "file.txt" Like "*.txt"
Thêm từ 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 biết một loại nguyên thủy typedef
thông qua Import
bí danh:
Imports S = System.String
Dim x As S = "Hello"
Điều này hữu ích hơn khi được sử dụng kết hợp với các loại chung:
Imports StringPair = System.Collections.Generic.KeyValuePair(Of String, String)
Imports
nó nên được. ;-) Bằng cách nào đó, lỗi này đã không bị phát hiện (và thu được 28 lượt bình chọn) trong gần một năm.
Imports Assert = xUnit.Assert
Oh! và đừng quên 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
(Tôi thấy điều này đặc biệt hữu ích khi viết các bài kiểm tra về phân tích cú pháp tệp CSV trong đó mọi trường đều nằm trong dấu ngoặc kép. Sẽ không vui nếu thoát tất cả các dấu ngoặc kép đó bằng tay trong đường kiểm tra.)
Khởi tạo đối tượng cũng ở trong đó!
Dim x as New MyClass With {.Prop1 = foo, .Prop2 = bar}
DirectCast
DirectCast
là một điều kỳ diệu. Bề ngoài, nó hoạt động tương tự như CType
toán tử ở chỗ nó chuyển đổi một đối tượng từ kiểu này thành kiểu khác. Tuy nhiên, nó hoạt động theo một bộ quy tắc chặt chẽ hơn nhiều. CType
Do đó, hành vi thực tế của nó thường không rõ ràng và hoàn toàn không rõ ràng loại chuyển đổi nào được thực hiện.
DirectCast
chỉ hỗ trợ hai hoạt động riêng biệt:
Bất kỳ quá trình ép kiểu nào khác sẽ không hoạt động (ví dụ: cố gắng mở hộp một Integer
đến a Double
) và sẽ dẫn đến lỗi thời gian biên dịch / thời gian chạy (tùy thuộc vào tình huống và những gì có thể được phát hiện bằng cách kiểm tra kiểu tĩnh). Do đó tôi sử dụngDirectCast
bất cứ khi nào có thể, vì điều này nắm bắt được ý định của tôi tốt nhất: tùy thuộc vào tình huống, tôi muốn mở hộp một giá trị thuộc loại đã biết hoặc thực hiện một upcast. Kết thúc câu chuyện.
CType
Mặt khác, việc sử dụng khiến người đọc mã băn khoăn không biết lập trình viên thực sự có ý định gì vì nó giải quyết tất cả các loại hoạt động khác nhau, bao gồm cả việc gọi mã do người dùng xác định.
Tại sao đây là một tính năng ẩn? Nhóm VB đã xuất bản một hướng dẫn 1 không khuyến khích sử dụng DirectCast
(mặc dù nó thực sự nhanh hơn!) Để làm cho mã thống nhất hơn. Tôi cho rằng đây là một hướng dẫn tồi cần được đảo ngược: Bất cứ khi nào có thể, hãy ưu tiên toán tử DirectCast
tổng quát hơn CType
. Nó làm cho mã rõ ràng hơn nhiều. CType
, mặt khác, chỉ nên được gọi nếu điều này thực sự được dự định, tức là khi một CType
toán tử thu hẹp (xem quá tải toán tử ) nên được gọi.
1) Tôi không thể tìm ra liên kết đến hướng dẫn nhưng tôi nhận thấy Paul Vick đã thực hiện nó (nhà phát triển trưởng của nhóm VB):
Trong thế giới thực, bạn hầu như không nhận ra sự khác biệt, vì vậy bạn cũng có thể sử dụng các toán tử chuyển đổi linh hoạt hơn như CType, CInt, v.v.
(EDIT bởi Zack: Tìm hiểu thêm tại đây: Tôi nên truyền như thế nào trong VB.NET? )
TryCast
hồi đó vì tôi chủ yếu phải lấy xương với việc sử dụng phổ biến CType
.
TryCast
chỉ hoạt động trên các kiểu tham chiếu, theo tài liệu.
If
nhà điều hành có điều kiện và liên kếtTôi không biết bạn gọi nó là ẩn như thế nào, nhưng hàm Iif ([biểu thức], [giá trị nếu đúng], [giá trị nếu sai]) As Object có thể đếm được.
Nó không bị ẩn nhiều đến mức không được dùng nữa ! VB 9 có If
toán tử tốt hơn nhiều và hoạt động chính xác như toán tử điều kiện và liên kết của C # (tùy thuộc vào những gì bạn muốn):
Dim x = If(a = b, c, d)
Dim hello As String = Nothing
Dim y = If(hello, "World")
Đã chỉnh sửa để hiển thị một ví dụ khác:
Điều này sẽ hoạt động với If()
, nhưng gây ra một ngoại lệ vớiIIf()
Dim x = If(b<>0,a/b,0)
:?
toán tử C và Perl , nó không chỉ là một phiên bản đơn giản hóa.
Cái này là một cái tốt. Câu lệnh Select Case trong VB.Net rất mạnh mẽ.
Chắc chắn có tiêu chuẩn
Select Case Role
Case "Admin"
''//Do X
Case "Tester"
''//Do Y
Case "Developer"
''//Do Z
Case Else
''//Exception case
End Select
Nhưng còn nhiều ...
Bạn có thể làm phạm vi:
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
Va thậm chi nhiêu hơn...
Bạn có thể (mặc dù có thể không phải là một ý kiến hay) thực hiện kiểm tra boolean trên nhiều biến:
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
là nó trông như thể nó đánh giá mỗi của Case
báo cáo và chạy mã cho mỗi người đó là sự thật. Nhưng trên thực tế, nó đánh giá từng cái một và chỉ chạy mã cho cái đầu tiên đúng. Cú pháp cho If
rõ ràng hơn nhiều về vấn đề này ( If...Else If...Else If...Else
).
Một trình tiết kiệm thời gian chính mà tôi sử dụng mọi lúc là từ khóa Với :
With ReallyLongClassName
.Property1 = Value1
.Property2 = Value2
...
End With
Tôi chỉ không thích gõ nhiều hơn tôi phải!
Trình phân tích cú pháp CSV tốt nhất và dễ dàng:
Microsoft.VisualBasic.FileIO.TextFieldParser
Bằng cách thêm một tham chiếu đến Microsoft.VisualBasic, điều này có thể được sử dụng trong bất kỳ ngôn ngữ .Net nào khác, ví dụ: C #
(CHỈNH SỬA: Tìm hiểu thêm tại đây: Tôi có nên luôn sử dụng toán tử AndAlso và OrElse không? )
Các thành viên tĩnh trong các phương thức.
Ví dụ:
Function CleanString(byval input As String) As String
Static pattern As New RegEx("...")
return pattern.Replace(input, "")
End Function
Trong hàm trên, biểu thức chính quy mẫu sẽ chỉ được tạo một lần cho dù hàm được gọi bao nhiêu lần.
Một cách sử dụng khác là giữ một trường hợp "ngẫu nhiên" xung quanh:
Function GetNextRandom() As Integer
Static r As New Random(getSeed())
Return r.Next()
End Function
Ngoài ra, điều này không giống như chỉ đơn giản khai báo nó là thành viên được chia sẻ của lớp; các mục được khai báo theo cách này cũng được đảm bảo an toàn theo chuỗi. Nó không quan trọng trong trường hợp này vì biểu thức sẽ không bao giờ thay đổi, nhưng có những người khác ở nơi nó có thể.
Trong vb có sự khác biệt giữa các toán tử này:
/
đang Double
\
được Integer
bỏ qua phần còn lại
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
Tôi thực sự thích Không gian tên "của tôi" được giới thiệu trong Visual Basic 2005. My là một lối tắt đến một số nhóm thông tin và chức năng. Nó cung cấp quyền truy cập nhanh chóng và trực quan vào các loại thông tin sau:
Mặc dù hiếm khi hữu ích, việc xử lý sự kiện có thể được tùy chỉnh rất nhiều:
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
Điều này sau đó có thể được kiểm tra theo cách sau:
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
Tôi vừa tìm thấy một bài báo nói về dấu "!" toán tử, còn được gọi là "toán tử tra cứu từ điển". Đây là đoạn trích từ bài viết tại: http://panopticoncentral.net/articles/902.aspx
Tên kỹ thuật cho! toán tử là "toán tử tra cứu từ điển." Từ điển là bất kỳ loại tập hợp nào được lập chỉ mục bằng một khóa chứ không phải số, giống như cách mà các mục nhập trong từ điển tiếng Anh được lập chỉ mục theo từ bạn muốn định nghĩa. Ví dụ phổ biến nhất về kiểu từ điển là System.Collections.Hashtable, cho phép bạn thêm các cặp (khóa, giá trị) vào bảng băm và sau đó truy xuất các giá trị bằng các khóa. Ví dụ: mã sau đây thêm ba mục nhập vào bảng băm và tìm một trong số chúng bằng cách sử dụng phím "Pork".
Dim Table As Hashtable = New Hashtable
Table("Orange") = "A fruit"
Table("Broccoli") = "A vegetable"
Table("Pork") = "A meat"
Console.WriteLine(Table("Pork"))
Các ! toán tử có thể được sử dụng để tra cứu các giá trị từ bất kỳ loại từ điển nào lập chỉ mục các giá trị của nó bằng cách sử dụng chuỗi. Định danh sau dấu! được sử dụng làm chìa khóa trong thao tác tra cứu. Vì vậy, mã trên thay vào đó có thể được viết:
Dim Table As Hashtable = New Hashtable
Table!Orange = "A fruit"
Table!Broccoli = "A vegetable"
Table!Pork = "A meat"
Console.WriteLine(Table!Pork)
Ví dụ thứ hai hoàn toàn tương đương với ví dụ đầu tiên, nhưng trông đẹp hơn rất nhiều, ít nhất là đối với mắt tôi. Tôi thấy rằng có rất nhiều nơi mà! có thể được sử dụng, đặc biệt khi nói đến XML và web, nơi có rất nhiều bộ sưu tập được lập chỉ mục theo chuỗi. Một hạn chế đáng tiếc là điều sau! vẫn phải là một số nhận dạng hợp lệ, vì vậy nếu chuỗi bạn muốn sử dụng làm khóa có một số ký tự nhận dạng không hợp lệ trong đó, bạn không thể sử dụng! nhà điều hành. (Ví dụ: bạn không thể nói "Bảng! AB $ CD = 5" vì $ không hợp pháp trong số nhận dạng.) Trong VB6 trở về trước, bạn có thể sử dụng dấu ngoặc để thoát các số nhận dạng không hợp lệ (tức là "Bảng! [AB $ CD] "), nhưng khi chúng tôi bắt đầu sử dụng dấu ngoặc để thoát từ khóa, chúng tôi đã mất khả năng làm điều đó. Trong hầu hết các trường hợp,
Để thực sự mang tính kỹ thuật, x! Y hoạt động nếu x có thuộc tính mặc định lấy Chuỗi hoặc Đối tượng làm tham số. Trong trường hợp đó, x! Y được đổi thành x.DefaultProperty ("y"). Một lưu ý phụ thú vị là có một quy tắc đặc biệt trong ngữ pháp từ vựng của ngôn ngữ để làm cho tất cả điều này hoạt động. Các ! ký tự cũng được sử dụng như một ký tự kiểu trong ngôn ngữ và các ký tự kiểu được sử dụng trước các toán tử. Vì vậy, không có quy tắc đặc biệt, x! Y sẽ được quét dưới dạng "x! Y" thay vì "x! Y". May mắn thay, vì không có nơi nào trong ngôn ngữ mà hai định danh trong một hàng là hợp lệ, chúng tôi chỉ giới thiệu quy tắc nếu ký tự tiếp theo sau! là phần bắt đầu của một định danh, chúng tôi coi là! là một toán tử và không phải là một ký tự kiểu.
Điều này được tích hợp sẵn và là một lợi thế nhất định so với C #. Khả năng thực hiện một Phương thức giao diện mà không cần phải sử dụng cùng một tên.
Nhu la:
Public Sub GetISCSIAdmInfo(ByRef xDoc As System.Xml.XmlDocument) Implements IUnix.GetISCSIInfo
End Sub
Buộc ByVal
Trong VB, nếu bạn đặt các đối số của mình trong một tập hợp thêm dấu ngoặc đơn, bạn có thể ghi đè khai báo ByRef của phương thức và biến nó thành một ByVal. Ví dụ: mã sau tạo ra 4, 5, 5 thay vì 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
Xem đối số không được sửa đổi bởi lệnh gọi thủ tục - Biến cơ bản
Truyền các tham số theo tên và do đó sắp xếp lại chúng
Sub MyFunc(Optional msg as String= "", Optional displayOrder As integer = 0)
'Do stuff
End function
Sử dụng:
Module Module1
Sub Main()
MyFunc() 'No params specified
End Sub
End Module
Cũng có thể được gọi bằng cách sử dụng đặc tả tham số ": =" theo bất kỳ thứ tự nào:
MyFunc(displayOrder:=10, msg:="mystring")
Câu lệnh Sử dụng là mới kể từ VB 8, C # đã có nó ngay từ đầu. Nó gọi là xử lý tự động cho bạn.
Ví dụ
Using lockThis as New MyLocker(objToLock)
End Using
Bí danh nhập khẩu cũng hầu như không được biết đến:
Import winf = System.Windows.Forms
''Later
Dim x as winf.Form
Hãy xem xét khai báo sự kiện sau
Public Event SomethingHappened As EventHandler
Trong C #, bạn có thể kiểm tra người đăng ký sự kiện bằng cú pháp sau:
if(SomethingHappened != null)
{
...
}
Tuy nhiên, trình biên dịch VB.NET không hỗ trợ điều này. Nó thực sự tạo ra một trường thành viên riêng ẩn không hiển thị trong IntelliSense:
If Not SomethingHappenedEvent Is Nothing OrElse SomethingHappenedEvent.GetInvocationList.Length = 0 Then
...
End If
Thêm thông tin:
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
Nếu bạn cần một tên biến để khớp với tên của từ khóa, hãy đặt nó trong dấu ngoặc. Không bị hoại tử. thực hành tốt nhất mặc dù - nhưng nó có thể được sử dụng một cách khôn ngoan.
ví dụ
Class CodeException
Public [Error] as String
''...
End Class
''later
Dim e as new CodeException
e.Error = "Invalid Syntax"
ví dụ: Ví dụ từ nhận xét (@Pondidum):
Class Timer
Public Sub Start()
''...
End Sub
Public Sub [Stop]()
''...
End Sub
Có một số câu trả lời về XML Literals, nhưng không phải về trường hợp cụ thể này:
Bạn có thể sử dụng XML Literals để bao gồm các ký tự chuỗi mà nếu không thì cần phải thoát. Ví dụ: chuỗi ký tự chứa dấu ngoặc kép.
Thay vì điều này:
Dim myString = _
"This string contains ""quotes"" and they're ugly."
Bạn có thể làm được việc này:
Dim myString = _
<string>This string contains "quotes" and they're nice.</string>.Value
Điều này đặc biệt hữu ích nếu bạn đang thử nghiệm một nghĩa đen để phân tích cú pháp 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>
Tất nhiên, bạn không phải sử dụng thẻ; bạn có thể sử dụng bất kỳ thẻ nào bạn thích.)
<q>
sẽ là một thẻ tốt, tương tự như cách sử dụng trong Perl / Ruby. Dù sao, đó là một thành ngữ khá hay. GIỐNG!
DateTime có thể được khởi tạo bằng cách đặt ngày của bạn bằng #
Dim independanceDay As DateTime = #7/4/1776#
Bạn cũng có thể sử dụng kiểu suy luận cùng với cú pháp này
Dim independanceDay = #7/4/1776#
Điều đó đẹp hơn rất nhiều so với việc sử dụng hàm tạo
Dim independanceDay as DateTime = New DateTime(1776, 7, 4)
Bạn có thể có 2 dòng mã chỉ trong một dòng. vì thế:
Dim x As New Something : x.CallAMethod
Call (New Something).CallAMethod()
Các thông số tùy chọn
Các tùy chọn dễ dàng hơn nhiều so với việc tạo quá tải mới, chẳng hạn như:
Function CloseTheSystem(Optional ByVal msg AS String = "Shutting down the system...")
Console.Writeline(msg)
''//do stuff
End Function
Trường hợp tiêu đề trong VB.Net có thể đạt được bằng VB6 fxn cũ:
StrConv(stringToTitleCase, VbStrConv.ProperCase,0) ''0 is localeID
Thuộc tính có tham số
Tôi đã thực hiện một số lập trình C # và phát hiện ra một tính năng bị thiếu mà VB.Net có, nhưng không được đề cập ở đây.
Có thể xem ví dụ về cách thực hiện điều này (cũng như giới hạn của c #) tại: Sử dụng các thuộc tính get set điển hình trong C # ... với các tham số
Tôi đã trích đoạn mã từ câu trả lời đó:
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