【发布时间】:2011-10-20 15:03:40
【问题描述】:
我想声明一个 C# 值类型,它只允许特定长度的字符串。所述长度应在编译时进行验证。这在 Delphi 中是可行的:
type
TString10 = string[10];
如果我使用上述 tyoe 作为:
var
sTen : TString10;
sTen := '0123456789A'; //This generates a compile time error
现在据我了解,您不能在 C# 中声明固定长度的字符串类型。我见过的各种解决方案不提供 编译时间 检查 C#。当我准备声明我自己的 C# 值类型结构时,这是我可以用.Format() 实现的吗?
非常感谢所有帮助和指点。
附言。我真的想实现字符串长度分配的编译时检查,所以请不要“你为什么....?”
【问题讨论】:
-
您为什么如此热衷于编译时检查?尽管您可以在 Delphi 中执行此操作,但它是一个非常过时的功能,早已被弃用。大约 15 年前,Delphi 短弦已经过时了。
-
马克给了你一个很好的答案。现在请您满足我的好奇心并解释原因吗?
-
@David:您可能指的是 ShortString,这与 Delphi 的长字符串支持不同,后者是字符串关键字所代表的。
-
@Jacek:我不想依靠单元测试来修复可能在编译时发现的明显错误。还说我有一个名为 TCountryCode 的类型,它是一个 3 个字符的字符串,出于某种原因,我决定将其更改为 2 个字符的字符串,在任何我错误地使用 AUS 而不是 AU 的地方(我确信我永远不会使用更多超过 2 个字符)将被编译器捕获。我认为与 Delphi 相比,C# 中的类型系统严重缺乏。您不能为类型加上别名这一事实是一个弱点恕我直言
-
@TheEdge 你显然不太了解Delphi。我指的是短字符串,实际上
string[10]是一个固定长度的短字符串。阅读有关它的所有信息here。 Delphi 中的短字符串是一种时代错误,在现代代码中从未使用过。我不明白你为什么把它当作美德的典范。不是。
标签: c# compile-time string-length