使用C#中的典型get set属性...带参数

Jav*_*ier 9 c# vb.net properties

我想在C#中做同样的事情.有没有在C#中使用参数的属性,就像我在这个VB.NET示例中使用参数'Key'一样?

Private Shared m_Dictionary As IDictionary(Of String, Object) = New Dictionary(Of String, Object)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

谢谢

Kon*_*lph 14

无论如何在C#中使用带参数的属性

不可以.您只能在C#中使用参数提供默认属性,以建模索引访问(如在字典中):

public T this[string key] {
    get { return m_Dictionary[key]; }
    set { m_Dictionary[key] = value; }
}
Run Code Online (Sandbox Code Playgroud)

其他属性不能有参数.请改用功能.顺便说一句,它建议在VB中执行相同操作,以便其他.NET语言(C#...)可以使用您的代码.

顺便说一句,您的代码不必要地复杂化.四件事:

  • 您无需转义String标识符.直接使用关键字.
  • 为什么不用""
  • 使用TryGetValue,它更快.您查询字典两次.
  • 您的setter不必测试该值是否已存在.

Public Shared Property DictionaryElement(ByVal Key As String) As Object
    Get
        Dim ret As String
        If m_Dictionary.TryGetValue(Key, ret) Then Return ret
        Return "" ' Same as String.Empty! '
    End Get
    Set(ByVal value As Object)
        m_Dictionary(Key) = value
    End Set
End Property
Run Code Online (Sandbox Code Playgroud)

  • @ Stimul8d:我不跟随.怎么"不"明确?我在两者之间看到的唯一区别(而且,恕我直言,程序员*应该*看到)是`String.Empty`是六倍长,因此它需要六倍的空间并且需要大约六倍的时间来读取它使代码差六倍.作为比较,就好像我们会使用`Int32.Zero`而不是'0`. (5认同)