枚举如何在编程语言中“幕后”工作?我猜每种语言都有不同的表示这些数据类型的方式。
在java中,您可以使用==运算符,例如:
public class TestEnum {
private enum Test {
foo, bar
}
public static void main(String[] args) {
System.out.println(Test.foo == Test.foo); // returns true
}
}
在==期间是否将枚举类型转换为基元?或者枚举值是单身人士吗? C#是否以与java相同的方式利用枚举?与编程语言相比,数据库枚举类型的处理方式是否不同?
答案 0 :(得分:2)
Java enum
使用 lot 技巧仍然是对象但与==
一起使用。原始的typesafe enum pattern(另请参阅 Effective Java )可以提供一些见解,但Enum.java source会告诉您他们现在是如何做到的。
答案 1 :(得分:1)
Java中的枚举类型实际上是一个特殊的编译器生成的类而不是算术类型:枚举值表现为全局预生成的实例,以便比较引用代替equals
。
您可以验证它是否正在反汇编.class文件:
Code: 0: getstatic #2; //Field YourEnum.BAR:LYourEnum; 3: getstatic #3; //Field YourEnum.FOO:LYourEnum; 6: if_acmpne 17
它应该大致相当于以下Java代码:
enum YourEnum {
FOO,
BAR
}
// ...
if (YourEnum.BAR == YourEnum.FOO)
为简单起见,您可以将其视为字符串实习的特例。
答案 2 :(得分:0)
我认为大多数语言会在幕后将枚举转换为int
- 尽管这当然不是必需的。
例如 - 在上面的示例中,编译器当然可能会意识到这两个值是相等的,而不会将它们转换为某个中间表示,只会发出true
值。
答案 3 :(得分:0)
.Net语言以整数的形式表示它们。 如果你这样做
如果1 == foo,则应返回true
我通常更容易理解的是:
public enum Test
foo = 1
bar = 2
end enum
尝试一下,用字符串更改1和2。这应该会给你一个编译错误。
答案 4 :(得分:0)
我认为枚举只是const整数。
所以你有
const int foo = 0;
const int bar = 1;
等等,编译器将命名空间'Test'添加到它们