使用字节将“256”作为参数传递的解决方法

时间:2014-04-26 10:57:25

标签: c# arrays byte

我正在创建一个包含私有数组的类,我用它来缓存计算值。我想将元素的数量限制为最大 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; }
}

4 个答案:

答案 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)

  1. _values的初始化程序错误。您应该添加1 spritesToIndex
  2. Rectangle的构造函数args是int
  3. 所以以下内容应该有效:

    _values = new Rectangle[(int)spritesToIndex + 1];
    

    @hvd有一个好点。构造函数应该接受int类型并且只接受throw ArgumentOutOfRange

答案 3 :(得分:1)

C#Byte类型是一个8位容器,可以容纳0到255范围内的值,这意味着它具有256值容量。如果您的应用程序需要跟踪256个索引项,那么这就足够了,因为数组的第一个元素是“零”和“零”。 element(即foo [0]是第一个元素)。

但是,如果您确实需要跟踪256个具有正标识符值且零不适合作为第一个值的离散项目,则Byte将不够。您将不得不使用容量较大的类型,例如ShortInt,并在代码中添加边界检查以将其值范围限制为1-256。