不明显的数组索引

时间:2011-11-17 14:41:50

标签: c# arrays casting

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

String usedAlphabet = "x3w4tnu34urgbgierg";

byte c = // (something initialized earlier)

return usedAlphabet[(int)(c / 16)];

现在,访问相应数组时使用(int)强制转换的原因可能是什么?

对我而言,这似乎是多余的,但我可能错了,或者我可能缺乏关于类型铸造机制的知识。

5 个答案:

答案 0 :(得分:6)

你是对的;这里多余。有时冗余的强制转换可以使用户对更明显,但这取决于上下文。

答案 1 :(得分:5)

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

但是,c本身缺少上下文(特别是如果没有定义接近此用法),因为这可能不是显而易见的byte / int。可能会添加演员作为可读性辅助工具。

答案 2 :(得分:2)

由于cbyte16int,因此除法的结果是int,这使得转换成为冗余。但是,c的声明在某一时刻可能是longdouble,并且需要演员。当声明被更改时,演员表从未被删除。

答案 3 :(得分:1)

我猜测来自开发人员的演员不清楚该语言的打字规则,因此采用了“更安全而不是抱歉”的方法。我怀疑我们大多数人在某些时候已经这样做了。话虽如此 - 演员阵容是不必要的,甚至没有澄清。

答案 4 :(得分:1)

正如您已经发现的那样,演员表是多余的。它有助于提高可读性吗?也许,取决于具体情况。可以做些什么真的有助于这种“不明显的数组索引”的可读性?好的名字我告诉你(当然,作者应该找到传达他意图的正确的名称,我刚刚在这里做了):

int sectionSize = 16;

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

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