2

我们有从数据库中的序列创建的参考值,这意味着它们都是整数。(这不是不可想象的——尽管极不可能——它们将来可能会改变以包括字母,例如 R12345。)

在我们的 [C#] 代码中,这些应该输入为字符串还是整数?

对这些值执行任何算术运算(例如将它们加在一起)没有意义这一事实是否意味着它们应该被视为字符串文字?如果不是,它们应该被输入为整数(/longs),那么这背后的基本原理/原因是什么?

我已经搜索了这个问题的答案,但在 Google 或 StackOverflow 上都没有找到任何东西,因此非常感谢您的意见。

4

6 回答 6

9

还有一些其他差异:

前导零:

你需要允许这些。如果你有一个 ID 字符串,那么它将是必需的

排序:

排序顺序会因类型而异:

Integer:

1
2
3
10
100

String

1
10
100
2
3

那么您是否需要将序列按顺序排列(无论哪种方式)?

同样的论点也适用于您在数据库本身中应用的类型,因为那里的要求可能是相同的。正如克里斯所说,理想情况下,它们应该是一致的。

于 2013-08-23T11:54:08.830 回答
3

这里有几点需要考虑:

  1. 前导零重要吗,即010不同于10. 如果是这样,请使用string.
  2. 排序顺序重要吗?即应该200在之前还是之后排序30
  3. 排序和/或相等性检查的速度重要吗?如果是这样,请使用int.
  4. 您的内存或磁盘空间是否受到限制?如果是这样,ints 是 4 个字节,strings 每个字符至少 1 个字节。
  5. int提供足够多的独特价值吗?字符串可以支持潜在的无限唯一值。
  6. 系统中是否有任何类型的链接不能保证可靠(网络、用户输入等)?如果它是文本介质,int 值更安全(所有非数字字符都是错误的),如果它是二进制的,则字符串更易于视觉检查(R13_55如果您的 id 只是字母数字,则显然是一个错误,但是12372?)
于 2013-08-23T11:58:25.373 回答
2

从您描述的声音来看,这些是当前恰好由一系列数字表示的值;它们本身实际上并不是数字。顺便说一句,这就像我的电话号码:它不是一个数字,而是一组数字。

而且,就像我的电话号码一样,我建议将其存储为字符串。前导零在这里似乎不是问题,但考虑到您它们视为字符串,您不妨将它们存储起来并为自己提供未来的灵活性。

于 2013-08-23T11:52:31.460 回答
2

它们应该被键入为整数,原因很简单:尽可能保留相同的类型定义以避免开销或类型转换的意外副作用。

于 2013-08-23T11:57:22.927 回答
0

有充分的理由不在您的代码中使用诸如int,string之类的使用类型。long除其他问题外,这还允许出现愚蠢的错误,例如

  • 在与另一个表相关的查询中使用一个表的键
  • 在一个键上做算术并以一个无意义的结果结束
  • 将索引或其他整数与键混淆

并且传达的信息很少:给定int id,这指的是什么表,它表示什么样的实体?您需要在参数/变量/字段/方法名称中对此进行编码,编译器不会帮助您。

由于这些值很可能总是整数,因此使用整数类型应该更有效并且减少 GC 的负载。但是为了防止上述错误,您可以使用struct包含单个字段的(当然是不可变的)。除了id的构造函数和getter之外,它不需要支持任何东西,这足以解决上述问题,除了需要键的实际值的几段代码(例如,构建查询)。

也就是说,使用适当的 ORM 也可以解决这些问题,而您的工作量更少。他们有自己的缺点,但他们真的没有那么糟糕。

于 2013-08-23T12:00:00.363 回答
0

如果您不需要对序列执行一些数学计算,您可以轻松选择字符串。

但是考虑一下排序:整数和字符串之间的生成顺序会有所不同,例如1, 2, 10对于整数和1, 10, 2字符串。

于 2013-08-23T12:01:52.777 回答