【问题标题】:Why string type allows to use as constant?为什么字符串类型允许用作常量?
【发布时间】:2017-07-14 04:19:36
【问题描述】:

为什么字符串类型允许用作常量?

因为字符串在堆中被初始化,所以它们如何用作常量。 编译器如何知道字符串的大小?什么是字符串表?是用来计算字符串长度的。

如果我在应用中多处使用字符串常量,会不会增加内存消耗?

【问题讨论】:

  • C# 中的常量只是逐字编译。所以,当你有const string something = "testing";,然后你写Console.WriteLine(something),编译器用Console.WriteLine("testing")替换它。字符串在 C# 中被实习,所以不,重复的常量字符串不会占用更多内存。见stackoverflow.com/questions/16636363/…
  • 谢谢@Rob,但为什么他们允许使用常量,因为没有引用类型用作常量。
  • 它们是不可变的。常量可以是数字、布尔值、字符串或空引用。
  • @AnkitRana 字符串是一种特殊的引用类型,与其他引用类型不同,它们可以在编译时构建。因此,它们可以标记为constant
  • 那为什么不允许 dateTime 声明为常量?

标签: c# string constants


【解决方案1】:

.NET 团队本可以继续并允许将任意表达式用作常量——例如new Vector2(0, 0) 如果已知 Vector2 构造函数没有外部副作用并且已知类型是结构或其他不可变的类型。但他们根本没有花时间来做这件事,也许是因为弄清楚这些要求对编译器来说是额外的工作(请记住,C# 还没有 immutablepure 关键字)。

string 类型对于编译器和运行时来说是特殊的:它从一开始就被设计为不可变的,并且它的构造函数没有外部可观察到的副作用,因此 .NET 运行时的创建者将这些知识融入到编译器。这就是为什么string 有文字并得到特殊处理的原因。

不过,他们可能还是希望避免向基础架构教授太多特殊类型——只是少数基本类型,即原语和字符串。 DateTime 根本被认为不够重要,不能被包括在内。

【讨论】:

  • 谢谢你的回复,使用float作为常量会增加内存消耗吗?
  • @AnkitRana 您有什么理由专门询问float 吗?对于所有类型的常量都应该如此。
【解决方案2】:

常量可以是数字、布尔值、字符串或空引用。

常量表达式是可以在编译时完全计算的表达式。因此,引用类型常量的唯一可能值是字符串和空引用。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/const

可以在编译时对字符串进行全面评估。 DateTimes 不能。

【讨论】:

  • 那么他们如何在编译时找到字符串长度?
  • 这是一个字符串文字。编译器能够计算字符数。这与在运行时计算字符串长度的方式相同。但这与您最初的问题无关。
【解决方案3】:

因为 const 字符串不被视为引用,所以它变成了文字。

【讨论】:

    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多