如何CompilationRelaxations.NoStringInterning实际工作?(Ho

2019-07-23 02:10发布

我有证明NoStringInterning问题

[assembly: System.Runtime.CompilerServices.CompilationRelaxations(System.Runtime.CompilerServices.CompilationRelaxations.NoStringInterning)]

    class Program
    {
        static void Main(string[] args)
        {
            String s1 = "Friday";
            String s2 = "Friday";
            String s3 = "Friday";
            String s4 = "Friday";
            String s5 = "Friday";
            String s6 = "Friday";
            String s7 = "Friday";
            String s8 = "Friday";
            String s9 = "Friday";
            // etc...
            Console.WriteLine(Object.ReferenceEquals(s1, s2));
            Console.WriteLine(Object.ReferenceEquals(s1, s3));
            Console.WriteLine(Object.ReferenceEquals(s1, s4));
            Console.WriteLine(Object.ReferenceEquals(s1, s5));
            Console.WriteLine(Object.ReferenceEquals(s1, s6));
            Console.WriteLine(Object.ReferenceEquals(s1, s7));
            Console.WriteLine(Object.ReferenceEquals(s1, s8));
            Console.WriteLine(Object.ReferenceEquals(s1, s9));
            // etc...

我试着用.NET CLR 2,3,4 ..作为输出我得到的是一堆真。 我期待一堆假的!

Answer 1:

The documentation states that the attribute:

Marks an assembly as not requiring string-literal interning.

In other words, it does not prevent the compiler from doing string interning, just providing a hint that it is not required. The documentation is a little bit sparse in this area, but this also seems to be the conclusion in this MSDN forum post.



Answer 2:

在打开的门没踢,但很明显的属性没有做什么,你认为它。 它的文档是相当差,无论是在MSDN和CLI规范。 这是显而易见的,以我从它的CLR内部使用的唯一的事情是,当它打开时,编译器只需要确保相同的字符串在模块级实习。 这具有许多副作用有关的内联,NGEN-ED和混合模式组件。

这将迫使旁边我解释模块和组件之间准确的区别。 我不能,模块是有共同.NET编程没有实际使用奇兽。 最好忘记,这个属性是相关的。 除非你有运行C#编译器与/目标自定义生成系统:模块选项,C#编译器总是在组件级别实习生所以你的测试总是会产生“真”。



Answer 3:

在MSDN描述为NoStringInterning说

“标记的组件为不需要字串文本实习”。

话说一个组件不需要实习是不一样的话称,该功能应该关闭。 AFAIK有没有办法做到这一点(除NGEN)。



文章来源: How does CompilationRelaxations.NoStringInterning actually work?