参考值:字符串还是整数?

时间:2013-08-23 11:47:00

标签: c# database strong-typing

我们有从数据库中的Sequence创建的引用值,这意味着它们都是整数。 (这是不可想象的 - 尽管不太可能 - 他们将来可能会改变以包括字母,例如R12345。)

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

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

我已经搜索了这个问题的答案,但无法在Google或StackOverflow上找到任何内容,因此非常感谢您的投入。

6 个答案:

答案 0 :(得分:9)

还有其他一些差异:

领先的零点:

你需要考虑这些吗?如果你有一个ID字符串,则需要

<强>分拣:

排序顺序因类型而异:

Integer:

1
2
3
10
100

String

1
10
100
2
3

那么你是否需要按顺序排列序列(或者两种方式)?

相同的参数也适用于您在DB本身中应用的输入,因为其中的要求可能相同。理想情况下,克里斯说,他们应该保持一致。

答案 1 :(得分:3)

以下是需要考虑的一些事项:

  1. 前导零是重要的,即01010不同。如果是,请使用string
  2. 排序顺序是否重要?即200之前或之后应该30排序?
  3. 排序和/或平等检查的速度是否重要?如果是,请使用int
  4. 你的内存或磁盘空间有限吗?如果是这样,int s为4个字节,string s,每个字符至少1个字节。
  5. int会提供足够的唯一值吗?字符串可以支持可能无限制的唯一值。
  6. 系统中是否存在任何不保证可靠的链接(网络,用户输入等)?如果它是文本媒体,则int值更安全(所有非数字字符都是错误的),如果它是二进制的,则字符串可以更容易地进行目视检查(如果您的ID只是字母数字,R13_55显然是错误的,但是{ {1}}?)

答案 2 :(得分:2)

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

而且,就像我的电话号码一样,我建议将其存储为字符串。前导零似乎不是一个问题,但考虑到你将它们视为字符串,你也可以存储它们并为自己提供未来的灵活性。 / p>

答案 3 :(得分:2)

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

答案 4 :(得分:0)

有充分的理由不在代码中使用intstringlong等使用类型。在其他问题中,这允许像

这样的愚蠢错误
  • 在与另一个表相关的查询中使用一个表的键
  • 对一个键进行算术运算并使用无意义的结果进行清理
  • 将索引或其他完整数量与键混淆

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

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

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

答案 5 :(得分:0)

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

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