VB.NET带参数属性实现及C#同类写法报错问题咨询
在C#中实现VB.NET风格的带参数属性
嗨,我来帮你搞定这个问题!C#里没有VB.NET那种直接给普通属性附加参数的语法,但我们有**索引器(Indexer)**来实现完全相同的功能——它允许你像访问数组那样,通过参数来读取或设置类内部的对应数据。
先看看你写的C#代码里的几个明显问题:
- 语法错误:
public string[int x] address完全不符合C#的语法规则,索引器的核心关键字是this,不是属性名加参数 - 逻辑错误:你在
get里返回了整个m_address数组,而不是对应索引的元素;赋值的时候也直接把整个数组替换了,这和VB的逻辑不符 - 变量问题:
index没有定义,index.length应该是m_address.Length(而且C#里数组长度是Length属性,不是小写的length)
正确的C#实现(完全对应你的VB.NET代码逻辑)
public class Geek { // 注意:VB里的m_Address(2)是创建一个下标0-2的数组,对应C#里长度为3的数组 private string[] m_address = new string[3]; // 这就是C#的索引器:用this关键字,后面跟参数列表 public string this[int index] { get { if (index >= 0 && index < m_address.Length) { return m_address[index]; } // 超出范围可以返回null,或者抛出ArgumentOutOfRangeException,看你需求 return null; } set { if (index >= 0 && index < m_address.Length) { m_address[index] = value; } // 同样,超出范围可以选择忽略或者抛异常 } } }
使用方式(和VB.NET几乎一样)
var hassn = new Geek(); // 赋值的时候直接用实例+[索引]的形式 hassn[0] = "National Street"; hassn[1] = "Imbaba neighborhood"; hassn[2] = "Giza"; // 读取也是一样的写法 for (int counter = 0; counter < 3; counter++) { MessageBox.Show(hassn[counter]); }
额外小技巧:多个索引器的区分
如果你的类需要多种不同的带参数"属性"(比如一个按索引取地址,一个按键名取配置),可以用[IndexerName]特性给索引器命名,方便在反射等场景下区分:
using System.ComponentModel; public class Geek { private string[] m_address = new string[3]; private Dictionary<string, string> m_config = new Dictionary<string, string>(); [IndexerName("Address")] public string this[int index] { get { /* 地址相关逻辑 */ } set { /* 地址相关逻辑 */ } } [IndexerName("Config")] public string this[string key] { get => m_config.TryGetValue(key, out var val) ? val : null; set => m_config[key] = value; } }
不过日常使用的时候,还是直接用实例[参数]的语法就好啦。
内容的提问来源于stack exchange,提问作者Mohamed Hassan
相关产品推荐
相关产品推荐

