【问题标题】:How to tell what value types are initialized to by the CLR如何判断 CLR 初始化了哪些值类型
【发布时间】:2009-01-06 21:34:01
【问题描述】:

这与 C# 和 .NET 框架有关。

最好不要在 .NET 框架中初始化以下类型,因为 CLR 会为您初始化它们:

int, 布尔等

将对象设置为 null 也是如此(我相信)。

例如,您不需要这样做,实际上它会影响性能(不管是否是杯水车薪):

int Myvar = 0;

只需要int Myvar; 就可以了。 CLR 会将其初始化为 int。

我显然只是从编程中“知道” int 默认设置为 0 并且 bool 设置为 false。

并且还将对象设置为 null,因为 CLR 会为您执行此操作。 但是你怎么知道这些原始类型被设置成什么。我尝试打开 Reflector 来查看 int32 和 bool 但无法弄清楚它们是如何默认初始化的。

我在 msdn 上查看过,也没有看到它。也许我只是想念它。

【问题讨论】:

    标签: c#


    【解决方案1】:

    如果你想要一张桌子,MSDN 是你的朋友:Default Values Table (C# Reference)

    【讨论】:

      【解决方案2】:

      您想要像this one 这样的列表吗?

      【讨论】:

        【解决方案3】:

        您可以轻松地制作一个程序,为所有感兴趣的 T 打印 default(T)。

        【讨论】:

        • 是的,所有值类型都会得到 0。
        【解决方案4】:

        基本上一切都归零了,所以从那里拿走它。 int/Double/etc 0.String,或者其他结构,可能是String.Empty,Guid.Empty等bool,false(其他语言为0)

        非常直观。

        【讨论】:

        • 引用(包括字符串引用)被初始化为 null。 String.Empty != null。
        • String 不是一个结构,它是一个类。与任何其他引用类型一样,默认值为 null。否则这是正确的:所有值类型都清零,任何引用类型的成员都将为空。
        【解决方案5】:

        对于 C#,这里是所有值类型的列表 - 单击每个值类型的链接以了解其默认值:

        Value Types Table (C# Reference)

        【讨论】:

        • 好的,但是它在哪里声明了 CLR 设置的默认值(如果有的话)?
        • 我不是在追求“what”是一个int,uint,我已经知道“what”了。如果您没有明确分配,那么它在哪里正式声明 CLR 将分配的默认值......这是性能影响的最佳实践。
        • 或者如果 MSDN 说明我如何才能找到(使用反射器查看它是如何初始化的,如果你没有明确地将它初始化为零或你有什么)等等。我在说关于编译器未明确说明时的默认初始化,这就是我所追求的。
        【解决方案6】:

        这可能是一个很长的镜头,但我会这么说

        default( T )
        

        会给你非常准确的结果。

        【讨论】:

          【解决方案7】:

          尝试调试应用并检查更改之前的初始值。那里可能有更好的答案,但为了关闭这个线程,我只是发布一个快速而肮脏的解决方案。

          static void Main(string[] args) { int iTest; string sTest; double dTest; bool bTest; float fTest; // stop debugger here Console.WriteLine(); iTest = 0; sTest = ""; dTest = 0.0; bTest = false; fTest = 0; }

          【讨论】:

            【解决方案8】:

            http://www.codeproject.com/KB/dotnet/DontInitializeVariables.aspx

            我们开始吧。很简单:值类型初始化为0,引用类型初始化为null

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-08-20
              • 2018-08-05
              • 2010-10-26
              相关资源
              最近更新 更多