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

本文关键字:参数传递 解决 方法 字节 | 更新日期: 2023-09-27 18:00:21

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

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

我可以看到的另一种选择是使用 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以回应理查德施耐德的评论,他完全可以理解地以不同的方式解释变量名称的含义。其中的"索引"一词可以理解为暗示该值必须是索引,而不是精灵的总数。

我建议你让你的构造函数将计数作为int参数,并通过文档和参数命名清楚地表明这不应该超过 256。您可以通过为超出该范围的值抛出ArgumentOutOfRangeException来保证这一点。

就个人而言,无论如何,我更习惯于提供范围参数作为ints - 在这里使用byte感觉不正统,至少对我来说是这样。

  1. 您的_values初始化器是错误的。 您应该添加 1 spritesToIndex
  2. 构造函数参数 Rectangle 是一个int

因此,以下内容应该有效:

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

@hvd说得有道理。 构造函数应接受 int 类型,并且只接受 throw ArgumentOutOfRange .

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

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