当前位置:编程学习 > C#/ASP.NET >>

int i和int i = new int()有什么不同?

int i和int i = new int()有什么不同?想加几个C#高手。 愿意加的,留言告诉我我加您(QQ或MSN)都行,嘻嘻 --------------------编程问答-------------------- int i;没有申请内存
int i = new int();申请了内存

申明变量时最好付初值
--------------------编程问答-------------------- 没有区别
可以看生成的IL代码 是一样的  --------------------编程问答--------------------
引用 2 楼 oec2003 的回复:
没有区别
 可以看生成的IL代码 是一样的


冒昧问一句怎么看IL代码 --------------------编程问答-------------------- int i创建的是变量,而int i = new int()创建的是对象实例,两者有本质的区别,其实后面一个的原形是这样的Int32 i=new Int32(),在C#中int i与int i = new int()两种写法没有太大的区别,这源于vs强大的兼容性,但在JAVA中这两者在用法上有严格的区分。 --------------------编程问答--------------------   int i;//表示申明了一个变量 ,如果不赋值它的内容未知,编译不通过

       int i=new int();//调用类的默认构造函数,i的值为0;
参考http://xujiayou.w66.mydnns.cn/post/7.html --------------------编程问答--------------------
引用 3 楼 lcl_data 的回复:
引用 2 楼 oec2003 的回复:
 没有区别
  可以看生成的IL代码 是一样的


 冒昧问一句怎么看IL代码

是这样的,说得好!
--------------------编程问答--------------------
引用 4 楼 xgd123123 的回复:
int i创建的是变量,而int i = new int()创建的是对象实例,两者有本质的区别,其实后面一个的原形是这样的Int32 i=new Int32(),在C#中int i与int i = new int()两种写法没有太大的区别,这源于vs强大的兼容性,但在JAVA中这两者在用法上有严格的区分。


IL代码应该是一样的,但是肯定是有区别的,int是c#的数据类型,而Int是.net的数据类型,虽然int最后还是要转化为Int类,但区别还是有的
int i; //定义一个c#整型
Int i = new Int(); //定义并实例化一个Int类
显然,区别是本质的 --------------------编程问答-------------------- int i; //i是没有值的;
int i = new int(); //i=0; --------------------编程问答-------------------- 有几楼不好好看MSDN就知道想当然,简直是信口开河...

1.IL代码是一样的说法是根本就没看过IL代码...
2.C#中变量就是对象实例没有本质区别,和VS兼容性更扯不上关系...
3.C#中int就是System.Int32,C#没有自己的数据类型只有CLR类型的别名,更没有Int这个东西存在...

区别是肯定有的而且不是太小...就是5楼说的第一条语句未赋初始值,如果在赋值前使用编译都通不过...

另外int i = new int();完全等效于int i=0;,因为int的默认构造函数就是赋默认值0...而且值类型的默认构造函数是可以隐式调用的,所以实际上没有人会用new int()的繁琐写法...

只有对引用类型这两种写法才有本质不同...但特殊的string类型除外,它和值类型一样也有隐式的默认构造函数可以直接赋值... --------------------编程问答--------------------
引用 9 楼 vrhero 的回复:
有几楼不好好看MSDN就知道想当然,简直是信口开河...

 1.IL代码是一样的说法是根本就没看过IL代码...
 2.C#中变量就是对象实例没有本质区别,和VS兼容性更扯不上关系...
 3.C#中int就是System.Int32,C#没有自己的数据类型只有CLR类型的别名,更没有Int这个东西存在...

 区别是肯定有的而且不是太小...就是5楼说的第一条语句未赋初始值,如果在赋值前使用编译都通不过...

 另外int i = new int();完全等效于int i=0;,因为int的默认构造函数就是赋默认值0...而且值类型的默认构造函数是可以隐式调用的,所以实际上没有人会用new int()的繁琐写法...

 只有对引用类型这两种写法才有本质不同...但特殊的string类型除外,它和值类型一样也有隐式的默认构造函数可以直接赋值...


C#没有自己的数据类型? --------------------编程问答--------------------
引用 9 楼 vrhero 的回复:
有几楼不好好看MSDN就知道想当然,简直是信口开河...

 1.IL代码是一样的说法是根本就没看过IL代码...
 2.C#中变量就是对象实例没有本质区别,和VS兼容性更扯不上关系...
 3.C#中int就是System.Int32,C#没有自己的数据类型只有CLR类型的别名,更没有Int这个东西存在...

 区别是肯定有的而且不是太小...就是5楼说的第一条语句未赋初始值,如果在赋值前使用编译都通不过...

 另外int i = new int();完全等效于int i=0;,因为int的默认构造函数就是赋默认值0...而且值类型的默认构造函数是可以隐式调用的,所以实际上没有人会用new int()的繁琐写法...

 只有对引用类型这两种写法才有本质不同...但特殊的string类型除外,它和值类型一样也有隐式的默认构造函数可以直接赋值...


感覺上對的。 --------------------编程问答-------------------- int i;
这个变量i在运行时会被赋值0
这是调试时VS中的警告信息:警告 1 从未对字段“_Default.i”赋值,字段将一直保持其默认值 0
--------------------编程问答--------------------
引用 3 楼 lcl_data 的回复:
引用 2 楼 oec2003 的回复:
没有区别
可以看生成的IL代码 是一样的


冒昧问一句怎么看IL代码


「开始」菜单\程序\Microsoft Windows SDK v6.0A\Tools\IL 反汇编程序 --------------------编程问答--------------------
引用 2 楼 oec2003 的回复:
没有区别
 可以看生成的IL代码 是一样的



值类型的就这样! --------------------编程问答-------------------- 学习 --------------------编程问答--------------------
引用 9 楼 vrhero 的回复:
有几楼不好好看MSDN就知道想当然,简直是信口开河...

1.IL代码是一样的说法是根本就没看过IL代码...
2.C#中变量就是对象实例没有本质区别,和VS兼容性更扯不上关系...
3.C#中int就是System.Int32,C#没有自己的数据类型只有CLR类型的别名,更没有Int这个东西存在...

区别是肯定有的而且不是太小...就是5楼说的第一条语句未赋初始值,如果在赋值前使用编译都通不过...

另外int i = new int();完全等效于int i=0;,因为int的默认构造函数就是赋默认值0...而且值类型的默认构造函数是可以隐式调用的,所以实际上没有人会用new int()的繁琐写法...

只有对引用类型这两种写法才有本质不同...但特殊的string类型除外,它和值类型一样也有隐式的默认构造函数可以直接赋值...


int i=0; 应该是拷贝构造函数,有参数。 --------------------编程问答-------------------- 有区别
比如int 1=0, j=0. 那么i==j。如果int i= new int(); int j=new int(); i=j=1; 那么i!=j --------------------编程问答-------------------- 越看越迷糊。。。。

以前看过讨论sting

bool和Boolen的。。。。

也不知道哪个说的是对的。。。。。 --------------------编程问答--------------------
引用 9 楼 vrhero 的回复:
有几楼不好好看MSDN就知道想当然,简直是信口开河...

1.IL代码是一样的说法是根本就没看过IL代码...
2.C#中变量就是对象实例没有本质区别,和VS兼容性更扯不上关系...
3.C#中int就是System.Int32,C#没有自己的数据类型只有CLR类型的别名,更没有Int这个东西存在...

区别是肯定有的而且不是太小...就是5楼说的第一条语句未赋初始值,如果在赋值前使用编译都通不过...

另外int i = new int();完全等效于int i=0;,因为int的默认构造函数就是赋默认值0...而且值类型的默认构造函数是可以隐式调用的,所以实际上没有人会用new int()的繁琐写法...

只有对引用类型这两种写法才有本质不同...但特殊的string类型除外,它和值类型一样也有隐式的默认构造函数可以直接赋值...


VS2005/VS2008中成功编译以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a;
            int b = 0;
            int c = 1;
            int d = new int();
        }
    }
}


IL代码如下:
[code=MSIL].method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       8 (0x8)
  .maxstack  1
  .locals init ([0] int32 a,
           [1] int32 b,
           [2] int32 c,
           [3] int32 d)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.1
  IL_0003:  ldc.i4.1
  IL_0004:  stloc.2
  IL_0005:  ldc.i4.0
  IL_0006:  stloc.3
  IL_0007:  ret
} // end of method Program::Main[/code]

--------------------编程问答-------------------- 学习! --------------------编程问答--------------------
引用 9 楼 vrhero 的回复:
有几楼不好好看MSDN就知道想当然,简直是信口开河...

1.IL代码是一样的说法是根本就没看过IL代码...
2.C#中变量就是对象实例没有本质区别,和VS兼容性更扯不上关系...
3.C#中int就是System.Int32,C#没有自己的数据类型只有CLR类型的别名,更没有Int这个东西存在...

区别是肯定有的而且不是太小...就是5楼说的第一条语句未赋初始值,如果在赋值前使用编译都通不过...

另外int i = new int();完全等效于int i=0;,因为int的默认构造函数就是赋默认值0...而且值类型的默认构造函数是可以隐式调用的,所以实际上没有人会用new int()的繁琐写法...

只有对引用类型这两种写法才有本质不同...但特殊的string类型除外,它和值类型一样也有隐式的默认构造函数可以直接赋值...

同意
我再补充一些,在C#中,所有东西都是对象,变量也是对象,所以也有构造函数.int float等所谓的数据类型,其实跟类没有区别,所以也有这种形式:int i=new i()
int 是System.Int32的别名,相当于using int System.Int32 --------------------编程问答-------------------- 不过IL代码应该是一样的 --------------------编程问答-------------------- using int=System.Int32 --------------------编程问答-------------------- 学习。。IL代码啥回事??全称是什么? --------------------编程问答--------------------
引用 24 楼 jdhlowforever 的回复:
学习。。IL代码啥回事??全称是什么?


其实IL代码才是真正的.NET语言,我们平时所说的 VB.NET/x#.NET/C++.NET 和.NET语言没有关系,只是编译器将我们容易理解的语言编译成.NET语言。
参考自《C#高级编程》第四版。 --------------------编程问答--------------------
引用 19 楼 hack95 的回复:
引用 9 楼 vrhero 的回复:
有几楼不好好看MSDN就知道想当然,简直是信口开河...

1.IL代码是一样的说法是根本就没看过IL代码...
2.C#中变量就是对象实例没有本质区别,和VS兼容性更扯不上关系...
3.C#中int就是System.Int32,C#没有自己的数据类型只有CLR类型的别名,更没有Int这个东西存在...

区别是肯定有的而且不是太小...就是5楼说的第一条语句未赋初始值,如果在赋值前使用编译都通不过...

另外int i = new int();完全等效于int i=0;,因为int的默认构造函数就是赋默认值0...而且值类型的默认构造函数是可以隐式调用的,所以实际上没有人会用new int()的繁琐写法...

只有对引用类型这两种写法才有本质不同...但特殊的string类型除外,它和值类型一样也有隐式的默认构造函数可以直接赋值...


VS2005/VS2008中成功编译以下代码:
C# codeusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1
{class Program
    {staticvoid Main(string[] args)
        {int a;int b=0;int c=1;int d=newint();
        }
    }
}

IL代码如下:
MSIL code.methodprivatehidebysig staticvoid  Main(string[] args)cilmanaged
{.entrypoint// 代码大小       8 (0x8).maxstack1.localsinit ([0]int32 a,
           [1]int32 b,
           [2]int32 c,
           [3]int32 d)IL_0000:nopIL_0001:ldc.i4.0IL_0002:stloc.1IL_0003:ldc.i4.1IL_0004:stloc.2IL_0005:ldc.i4.0IL_0006:stloc.3IL_0007:ret
}// end of method Program::Main



IL就是 .net编译出来的中间代码~也就是我们所看到的.net下编译出来的DLL或exe等
中间代买要在JIT(即时编译器)的再次编译下编译成本机代码
这样才能在你的机器上执行。
.net下的托管代码,编译出来的中间代码是语言无关的,也就是说无论是VB.net还是c#,编译出来的DLL,你用ILDASM.exe来看都是一样的。

顺便说一下上面的IL。


maxstack1.localsinit  初始化4个局部变量,所以栈的深度是4
ldc.i4.0   在内存中(托管内存)申请4个字节的长度,并且赋值为0
IL_0002:  stloc.1 把这个值付给栈内第二个元素,也就是b(b=0)
--------------------编程问答-------------------- 学习 关注 --------------------编程问答-------------------- 牛人一大堆 --------------------编程问答--------------------
引用 24 楼 jdhlowforever 的回复:
学习。。IL代码啥回事??全称是什么?
IL = intermediate language
即所谓的中间语言,说白了.net虚拟机的指令.
初看可能觉得挺难.但实际花点时间学下会发现
基于堆栈机的.net虚拟机汇编指令和x86汇编指
令相比要简单的多. --------------------编程问答--------------------
maxstack1.localsinit  初始化4个局部变量,所以栈的深度是4 
ldc.i4.0  在内存中(托管内存)申请4个字节的长度,并且赋值为0 
IL_0002:  stloc.1 把这个值付给栈内第二个元素,也就是b(b=0)

--------------------编程问答--------------------
		static void Main(string[] args)
{
int i;
int j = new int();

}

IL代码:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       4 (0x4)
  .maxstack  1
  .locals init ([0] int32 i,
           [1] int32 j)
  IL_0000:  nop
  IL_0001:  ldc.i4.0  //加载一个0 到虚拟执行栈中
  IL_0002:  stloc.1   //弹出栈顶的那个0 并存储在索引[1]的内存变量中
  IL_0003:  ret
} // end of method Program::Main

实际上是有区别的 i没有赋值 但是j被赋值了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,