对于.NET字段和属性,根据定义只包含单个字符,将它们定义为char而不是字符串有什么好处?或者是对char数据类型的错误使用?
我正在考虑一个字段,可以保存M或F的性别,或中间的初始,或存储在数据库中的指标为Y或N.我通常将这些定义为字符串,但我想知道我是否应该将它们定义为char。
答案 0 :(得分:12)
是的,char
是正确的数据类型。一般的经验法则是:始终在上下文中选择最窄(最严格)的数据类型。这意味着如果偶然输入任何无效(或超出范围)数据,将无法接受,因此您的程序/数据库将不易出错。
从另一个角度考虑:当想在代码中使用整数值时,是否要创建一个大小为1的整数数组?当然不是,因为虽然它可以完成这项工作,但却完全不需要。即比较:
int[] value = new int[1] { 123 };
value[0] = 456;
为:
int value = 123;
value = 456;
第一个是简单的荒谬,我相信你会看到。确实,这在数据库的上下文中并不那么明显(如果选择string
数据类型,使用情况就这么简单了),但我认为这个类比有助于解释选择背后的逻辑。
此外,当涉及到操作代码中的值时,您应该发现在更合适的数据类型中使用该字段(即char
)会使得在代码中适当地使用它会更加直接。
就性能而言,我不认为使用string
会给你带来任何重大开销。好的,所以它占用略微更多内存,但这可能不是问题。不过我认为我刚刚提出的其他原因解释了为什么应该选择char
。
答案 1 :(得分:4)
Char
和1个字符String
在性能方面不会有太大差异。 CLR将为您实习生字符串,因此需要考虑(但我再也无法想象性能优势会很明显)。
请记住,编程语言是 astraction 的有用工具。始终创建有用的抽象。换句话说,我会定义你的字段:
enum Gender { Male, Female }
class Foo
{
Gender gender;
Char middleInitial;
Boolean indicator;
}
此类在语义上很有价值,因为数据类型表明它们的用途。始终使用正确的工具。
答案 2 :(得分:2)
字符串是字符数组,所以除非你相信你可能需要数组附带的属性/方法(例如长度和子字符串函数),我会说坚持使用一个字符,因为你确定它只是一个角色。
答案 3 :(得分:1)
字符串类会有一些开销。如果你有char,你需要用0x00或<space>
或其他一些未知指标表示空吗?这是来自或来自数据库,你会在那里使用什么约定?
我通常更喜欢应用程序层中的enums / bools / native语义,从而转换为需要的数据库约定。毕竟Person.Gender == Female
和if (!Person.IsDeceased) {}
更具可读性和清晰度。