4

我使用 Visual Basic 已经有一段时间了,最​​近决定开始学习 C# 作为学习更复杂语言的一步。

作为这次跳跃的一部分,我决定将我的一些旧 VB 项目手动转换为 C#。我遇到的问题是使用带有参数/索引的属性转换具有类的库。

该属性在 VB 中是这样的:

Friend Property Aproperty(ByVal Index As Integer) As AClass
        Get
            Return Alist.Item(Index)
        End Get
        Set(ByVal value As KeyClass)
            Alist.Item(Index) = value
        End Set
    End Property

当我使用该属性时,它将像这样使用:

Bclass.Aproperty(5) = new AClass

这是我想在 C# 中实现的这种事情,但我一生都无法弄清楚如何做到这一点,因为 C# 似乎无法做到这一点。

4

3 回答 3

4

索引器允许类或结构的实例像数组一样被索引。索引器类似于属性,只是它们的访问器带有参数。

http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx

索引器是使用如下this关键字定义的:

public T this[int i]
{
    get
    {
        // This indexer is very simple, and just returns or sets
        // the corresponding element from the internal array.
        return arr[i];
    }
    set
    {
        arr[i] = value;
    }
}

.NET 类库设计指南建议每个类只有一个索引器。

您可以根据索引参数类型重载索引器

public int this[int i]
public string this[string s]

但不是基于返回值

// NOT valid
public int this[int i]
public string this[int i]
于 2012-07-29T18:05:58.217 回答
4

由于 C# 不支持参数化属性(这是您所显示的),因此您需要将此代码转换为两个函数,一个 GetAProperty(index) 和一个 SetAProperty(index)。

我们将一个超过 50,000 个 LOC 的应用程序从 VB 转换为 C#,由于对参数化属性的依赖,它需要像这样的大量修改。然而,它是可行的,它只是需要一种不同的方式来考虑这样的属性。

于 2012-07-29T18:49:54.877 回答
1

我认为您不能指定只能通过索引访问的属性,但您可以只返回一个可索引的值(如数组或List)并[]在结果上使用:

public List<Aclass> Aproperty
{
    get 
    {
         return this.theList;
    }
}

Aclass foo = this.Apropety[0];

当然,任何带有索引器的东西都可以代替List.

或者,你可以用另一种方式来做:定义一个索引器(在类本身上),它返回一个具有属性的对象Aproperty,使用如下Aclass foo = this[0].Aproperty

于 2012-07-29T18:42:35.557 回答