如何实现数组Getter/Setter无异常处理索引越界,如越界返回指定值?
嗨,我来帮你搞定这个问题!
你当前的代码没法正常工作,核心原因有两个:
- 你写的是普通的
Board属性,但普通属性的get/set方法里根本没有index参数——这是语法上的错误,编译器根本认不出这个index是哪来的。 - 就算忽略语法问题,你在
get里写return Board[index]会触发无限递归,因为调用Board[index]又会回到这个get方法里。
要实现你想要的「通过Board[1]访问合法索引值、Board[-1]返回3」的效果,你需要用C#索引器(Indexer),而不是普通属性。下面是正确的实现方式:
基础实现(直接通过实例索引访问)
首先我们需要一个私有字段来存储实际的数组数据,然后定义索引器:
// 私有字段:存储实际的棋盘数据,这里可以根据你的需求初始化长度 private byte[] _board = new byte[8]; // 索引器:让类的实例可以像数组一样用[index]访问 public byte this[int index] { get { // 检查索引是否在合法范围内 if (index >= 0 && index < _board.Length) return _board[index]; // 越界时返回指定的3 else return 3; } set { // 只有合法索引才执行赋值操作 if (index >= 0 && index < _board.Length) _board[index] = value; // 越界时可以选择什么都不做,或者添加日志提示,根据你的需求来 } }
使用的时候直接像操作数组一样:
var game = new YourGameClass(); // 这里替换成你的类名 byte validValue = game[1]; // 获取索引1的合法值 byte outOfRangeValue = game[-1]; // 返回3 game[5] = 10; // 给索引5赋值 game[-2] = 20; // 越界,赋值操作会被忽略
如果你一定要用Board[xxx]的语法(命名索引器)
如果你希望严格按照Board[1]、Board[-1]的方式访问,C# 7.0及以上版本支持命名索引器,只需要加一个特性即可:
using System.ComponentModel; // 私有字段依然保留 private byte[] _board = new byte[8]; // 添加IndexerName特性,指定索引器的名称为Board [IndexerName("Board")] public byte this[int index] { get { if (index >= 0 && index < _board.Length) return _board[index]; else return 3; } set { if (index >= 0 && index < _board.Length) _board[index] = value; } }
这时候你就可以用你期望的语法访问了:
var game = new YourGameClass(); byte val = game.Board[1]; // 获取合法索引值 game.Board[3] = 5; // 合法赋值 byte outVal = game.Board[-1]; // 返回3
关键要点总结:
- 必须用索引器(
this[int index])来实现数组式的索引访问,普通属性做不到 - 一定要用私有字段存储实际数据,避免递归调用
- 越界判断逻辑要放在索引器的
get和set块里,确保不会触发系统自带的索引越界异常
内容的提问来源于stack exchange,提问作者Tau
相关产品推荐
相关产品推荐

