首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >"int myInt;“和"int myInt =0”之间的区别是什么?

"int myInt;“和"int myInt =0”之间的区别是什么?
EN

Stack Overflow用户
提问于 2014-11-20 06:27:09
回答 3查看 1.1K关注 0票数 0

哪一条C#语句等价于以下内容:

代码语言:javascript
运行
复制
int myInt = new int();

我在http://smarterer.com上发现了这个问题。smarterer.com网站提供了三个答案:

  • int myInt = NULL;
  • int myInt;
  • int myInt = 0;

我知道第一个命题是错误的。那另外两个人呢。我现在的问题是,int myInt;int myInt = 0;之间有什么区别?对我来说是一样的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-20 06:29:29

第二个语句取决于上下文。如果它是一个字段声明,那么它与赋值0没有什么不同,因为类型成员总是被初始化的。如果它是一个局部变量,那么第二条语句不会初始化该变量;在您使用它之前,需要对它进行初始化。

您不能将NULL分配给int类型的东西,所以很明显,第一个答案不是正确的。:)

我会选择第三个答案,因为它是最可靠的使用new int()

票数 9
EN

Stack Overflow用户

发布于 2014-11-20 06:35:43

int是一个结构,所以当您在C#中定义一个int时,它从技术上被初始化为它的默认值(零)。但是,在字段上初始化值是最佳实践,因此您列出的三个选项中最等价的是第三个选项: int myInt = 0

不能将结构(值类型)分配给null,因为它是不可空的类型。

有一些方法可以使用可空结构(Nullable<T>),但这不是您想要的。

关于默认值的MSDN

更新

由于我的帖子中有一些评论分享了不同的结果,所以我想,当你在delcaration上初始化值类型时,而不是当你需要它们时,我会详细阐述那些令人毛骨悚然的表现。

当优化构建( IL代码中没有nop命令)时,如果将初始化设置为默认值,则不会看到初始化,这是测试代码:

代码语言:javascript
运行
复制
class initfield
{
    public int mynum = 0;
}

class noinitfield
{
    public int mynum;
}

这是类的IL并调用它们(如果超出了问题范围,很抱歉):

初始化时:

代码语言:javascript
运行
复制
.class private auto ansi beforefieldinit test.initfield
extends [mscorlib]System.Object
{
// Fields
.field public int32 mynum

// Methods
.method public hidebysig specialname rtspecialname 
    instance void .ctor () cil managed 
{
    // Method begins at RVA 0x2087
    // Code size 7 (0x7)
    .maxstack 8

    IL_0000: ldarg.0
    IL_0001: call instance void [mscorlib]System.Object::.ctor()
    IL_0006: ret
} // end of method initfield::.ctor

} // end of class test.initfield

没有初始化:

代码语言:javascript
运行
复制
.class private auto ansi beforefieldinit test.noinitfield
extends [mscorlib]System.Object
{
// Fields
.field public int32 mynum

// Methods
.method public hidebysig specialname rtspecialname 
    instance void .ctor () cil managed 
{
    // Method begins at RVA 0x208f
    // Code size 7 (0x7)
    .maxstack 8

    IL_0000: ldarg.0
    IL_0001: call instance void [mscorlib]System.Object::.ctor()
    IL_0006: ret
} // end of method noinitfield::.ctor

} // end of class test.noinitfield

现在,如果您将IL代码重新编译回初始化字段的类的C#中:

代码语言:javascript
运行
复制
internal class initfield
{
    public int mynum;
}

如您所见,编译器将冗余初始化优化为默认值。请注意,这只适用于基本类型,因此datetime不会被优化掉。-所以在这个问题上,int myInt;int myInt = 0;完全一样。

票数 1
EN

Stack Overflow用户

发布于 2014-11-20 06:34:43

在C#中,数据类型的默认值由新操作符使用。int myint=new int();语句具有与int myInt = 0;相同的效果。

请参阅http://msdn.microsoft.com/en-us/library/83fhsxwc.aspx

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27033147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档