我正在创建一个包含私有数组的类,我用它来缓存计算值。我想将元素的数量限制为最大 256 ,因为这是使用byte
索引的索引器可以访问的元素的最大数量;我还需要这个数字相当小,所以这很有用。
然而!它必须作为构造函数中的参数传递,因为客户端代码将确定它有多大。但是,如果我以byte
作为参数,则最大值为255;我理解为什么以及如何做到这一点,但我无法弄清楚最好的解决方法。
public class Spritesheet
{
private Rectangle[] _values;
public Spritesheet(byte spriteCount)
{
_values = new Rectangle[spriteCount]; // But this needs to store 256 values at most...
}
}
我可以将它设为字节?,如果它为null,则使用256个元素,但这似乎是任意的(虽然它肯定会起作用)。我能看到的另一个替代方法是使用 int 并以某种方式限制值,但将其暴露为int可能会给用户错误的代码意图。
编辑:将“spritesToIndex”更改为“spriteCount”以使其更清晰。对于它的价值,这是我正在实施的界面:
public interface ISpritesheet
{
Texture2D Texture { get; }
byte Sprites { get; }
byte SpritesPerRow { get; }
Point Size { get; }
Point Spacing { get; }
Point Offset { get; }
Rectangle this[byte index] { get; }
}
答案 0 :(得分:6)
我能看到的另一种选择是使用 int 并以某种方式钳制值
使用int
正是我要做的。
但是将它暴露为int可能会给用户错误的代码意图。
因此,要使意图明确,以至于用户不可能得到错误的想法:
public class Spritesheet
{
public Spritesheet(int spriteCount)
{
if (spriteCount < 0 || spriteCount > 256)
throw new ArgumentOutOfRangeException ("spriteCount", "Number of sprites must be between 0 and 256 (inclusive)");
// ...
}
}
即使用户在任何时候都认为spriteCount
可以是1000,但在尝试之后,这个想法会很快消失 。
我重新命名spriteToIndex
以回应Richard Schneider的评论,他们可以理解地以不同方式解释变量名称的含义。其中的“索引”一词可以理解为该值必须是一个索引,而不是精灵的总数。
答案 1 :(得分:2)
我建议您让构造函数将计数作为int
参数,并通过文档和参数命名使其明显不应超过256.您可以保证通过抛出{{ 1}}表示超出该范围的值。
就个人而言,我更习惯于提供范围参数ArgumentOutOfRangeException
- 使用ints
这里感觉非正统,至少对我而言。
答案 2 :(得分:2)
_values
的初始化程序错误。您应该添加1 spritesToIndex
。 Rectangle
的构造函数args是int
。 所以以下内容应该有效:
_values = new Rectangle[(int)spritesToIndex + 1];
@hvd有一个好点。构造函数应该接受int
类型并且只接受throw ArgumentOutOfRange
。
答案 3 :(得分:1)
C#Byte
类型是一个8位容器,可以容纳0到255范围内的值,这意味着它具有256值容量。如果您的应用程序需要跟踪256个索引项,那么这就足够了,因为数组的第一个元素是“零”和“零”。 element(即foo [0]是第一个元素)。
但是,如果您确实需要跟踪256个具有正标识符值且零不适合作为第一个值的离散项目,则Byte
将不够。您将不得不使用容量较大的类型,例如Short
或Int
,并在代码中添加边界检查以将其值范围限制为1-256。