C# - 索引属性?

时间:2012-07-29 18:03:52

标签: c# vb.net c#-4.0

我已经使用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#似乎不能做到这一点。

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:4)

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

我们将50,000+ LOC应用程序从VB转换为C#,由于依赖于参数化属性,因此需要进行大量修改。但是,它是可行的,它只需要一种不同的方式来思考这样的属性。

答案 2 :(得分:1)

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

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

Aclass foo = this.Apropety[0];

当然,任何带有索引器的东西都会起作用而不是List

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