在D中使用枚举字符串优于字符串的优点是什么?

时间:2015-03-16 16:49:39

标签: enums constants d

D中的

enum可以用作常量,如下所示:

import std.stdio;

void main()
{
    enum secondsPerDay = 60 * 60 * 24;
    // enum int secondsPerDay = 60 * 60 * 24;
    writeln(secondsPerDay * 1024);

    enum fileName = "list.txt";
    writeln(fileName, typeof(fileName).stringof);

    auto fileName2 = "list.txt";
    writeln(fileName2, typeof(fileName2).stringof);
}

然后,当字符串不可变时,使用enum over auto(string)的优点是什么?这些是返回的结果。

88473600
list.txtstring
list.txtstring

3 个答案:

答案 0 :(得分:4)

与字符串没有太大区别。但一般来说,不可变和枚举之间的区别在于枚举总是在编译时进行评估。不可变值只是在静态上下文中计算的编译时间。

另一个区别是枚举有点像复制/粘贴到使用网站。观察:

enum array = [1,2,3];
void main() {
      auto arr = array; // this actually allocates a new array [1,2,3]
      static immutable arr2 = array; // this doesn't
}

真正的区别在于static而不是immutable,它将数据放在静态数据段中,但它仍然只与创建编译时值的enum形成对比。

无论如何,使用普通字符串,这没有任何区别。当你在函数结果或可变数组上使用它时,enum会更多地发挥作用,其中编译时间位可能意味着在运行时删除了函数调用,或者“粘贴常量”位可能意味着在运行时。

答案 1 :(得分:1)

它是immutable(char)[](又名字符串)和immutable(char [])(枚举字符串)之间的区别:

void main() 
{ 
   string s = "string1";
   enum e = "enum1";

   s = e; // allowed
   e = s; // error
}

答案 2 :(得分:0)

从此处的文档:http://dlang.org/enum.html

清单常量

如果只有一个匿名枚举成员,则可以省略{}

enum i = 4;      // i is 4 of type int
enum long l = 3; // l is 3 of type long

此类声明不是左值,表示不能使用其地址。它们只存在于编译器的内存中。

enum size = __traits(classInstanceSize, Foo);  // evaluated at compile-time

使用清单常量是一种惯用的D方法,用于强制对表达式进行编译时评估。