请教一段 vb代码至c# 代码转换问题

JDD1997 2018-08-04 09:27:39
在vb.net中可以很轻松的用以下代码创建一个带有参数的属性


Public Property XXX(i As Integer) As Integer
Get
End Get
Set(value As Integer)
End Set
End Property



那么对应的功能在C#中如何实现呢?
网上很多都说用索引器,比如这样

public int this[int i]
{
get { }

set { }
}


但问题是
1用索引器的方法实际上是将该属性当成了所在类的默认属性,而我并不想这么做
2我的类中有多个类似的属性且参数类型,数量都相同,所以索引器的重载无法区分我是要访问哪个属性

求指教,谢谢
...全文
104 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
JDD1997 2018-08-05
  • 打赏
  • 举报
回复
to: caozhy

谢谢,明白了
threenewbee 2018-08-05
  • 打赏
  • 举报
回复
一个在IL层面不等价,但是基本上模拟了你的语法的代码是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace T392426871
{
class Class1
{
int[] arr = { 3, 7, 4, 6, 4, 5 };

public class XXXCollection
{
Class1 _instence;
public XXXCollection(Class1 ins)
{
_instence = ins;
}

public int this[int index]
{
get
{
return _instence.arr[index];
}
set
{
_instence.arr[index] = value;
}
}
}

public XXXCollection XXX { get { return new XXXCollection(this); } }
}
class Program
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
Console.WriteLine(c1.XXX[1]);
c1.XXX[1] = 2;
Console.WriteLine(c1.XXX[1]);
}
}
}
threenewbee 2018-08-05
  • 打赏
  • 举报
回复
不过需要指出的是,在C#里反过来定义get_属性名(int i)和 set_属性名(int i, int value),在VB里并不能看到属性,因为VB编译器还是加了属性的元数据上去的,这个可以在ILSpy看到:


总结起来就是,无能为力。

C#只是实现了IL的一个子集,C#不能做的事情还有很多。
比如IL层面,可以通过返回值的不同来重载函数(即使参数是一样的),但是C#就不行。
再比如,C#中有typeof(一个类型),但是IL层面,还有“methodof”"propertyof"
threenewbee 2018-08-05
  • 打赏
  • 举报
回复
这个是VB的语法糖,在C#层面没办法实现



在C#层面,只能转换为 get_属性名(int i)和 set_属性名(int i, int value)两个方法。
xuzuning 2018-08-05
  • 打赏
  • 举报
回复
多个属性就是多个集合,或是属性对应类型的索引器

你在一致 vb.net 代码是存在一个问题:
vb.net 代码中的 XXX 是有名属性
而 C# 中你却把他变成了匿名属性(索引器)

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧