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