C# 不明显的数组索引

C# 不明显的数组索引,c#,arrays,casting,C#,Arrays,Casting,最近,我在一个项目中看到了许多类似的代码块,它们是按以下方式编写的: String usedAlphabet = "x3w4tnu34urgbgierg"; byte c = // (something initialized earlier) return usedAlphabet[(int)(c / 16)]; 现在,在访问相应数组时使用(int)强制转换的原因可能是什么 对我来说,这似乎是多余的,但我可能错了,或者我可能缺乏有关类型铸造机械的知识。你是对的;这是多余的。有时,一个多余

最近,我在一个项目中看到了许多类似的代码块,它们是按以下方式编写的:

String usedAlphabet = "x3w4tnu34urgbgierg";

byte c = // (something initialized earlier)

return usedAlphabet[(int)(c / 16)];
现在,在访问相应数组时使用
(int)
强制转换的原因可能是什么


对我来说,这似乎是多余的,但我可能错了,或者我可能缺乏有关类型铸造机械的知识。

你是对的;这是多余的。有时,一个多余的强制转换可以使读者更清楚地了解其用法,但这取决于上下文。

你是对的-除法是整数除法,它总是会产生一个整数,因此不需要强制转换


然而,
c
本身缺乏上下文(特别是如果它的定义不接近此用法),因为这可能不是一个明显的
byte/int
。有可能将强制转换添加为可读性辅助。

由于
c
字节
16
int
,因此除法的结果是
int
,使强制转换冗余。然而,有可能在某一点上,
c
的声明类似于
long
double
,需要进行转换。当声明被更改时,强制转换从未被删除。

我猜,该强制转换来自一位开发人员,他不清楚该语言的键入规则,因此采用了“安全比抱歉更好”的方法。我怀疑我们大多数人都曾在某个时候这样做过。话虽如此,演员阵容是多余的,甚至不需要澄清。

正如你已经发现的,演员阵容是多余的。它有助于可读性吗?也许,取决于上下文。如何才能真正帮助这种“不明显的数组索引”的可读性?好名字我告诉你(当然,作者应该找到正确的名字来表达他的意图,我只是在这里编出来的):

int sectionSize = 16;

String usedAlphabet = "x3w4tnu34urgbgierg";
byte sectionIndex = // (something initialized earlier)

int alphabetIndex = sectionIndex / sectionSize;
return usedAlphabet[alphabetIndex]; // not so puzzling anymore