为什么字符串类型允许用作常量?
因为字符串在堆中初始化,所以它们如何用作常量。 编译器如何知道字符串的大小?什么是字符串表?用于计算字符串长度。
如果我在应用程序中使用字符串常量很多位置,是否会增加内存消耗?
答案 0 :(得分:6)
.NET团队可以继续前进并允许任意表达式用作常量 - 例如new Vector2(0, 0)
如果已知Vector2
构造函数没有外部副作用,并且已知该类型是结构或其他不可变的。但是他们根本没有花时间去做这件事,也许是因为找出这些要求对于编译器来说是额外的工作(记住,C#还没有immutable
或pure
个关键字。
string
类型对于编译器和运行时来说是特殊的:它从一开始就被设计为不可变的,并且它的构造函数没有外部可观察的副作用,因此.NET运行时的创建者烘焙了这些知识进入编译器。这就是string
有文字并得到特殊待遇的原因。
尽管如此,他们可能还是希望避免在基础设施上教授太多特殊类型 - 只有少数几种基本类型,即基元和字符串。仅仅DateTime
被认为不够重要,不能被包括在内。
答案 1 :(得分:3)
常量可以是数字,布尔值,字符串或空引用。
常量表达式是一个可以在编译时完全计算的表达式。因此,引用类型常量的唯一可能值是字符串和空引用。
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/const
可以在编译时完全评估字符串。 DateTime
不能。
答案 2 :(得分:1)
因为const字符串不被视为引用,所以它变为文字。