int i和int i = new int()有什么不同?
int i和int i = new int()有什么不同?想加几个C#高手。 愿意加的,留言告诉我我加您(QQ或MSN)都行,嘻嘻 --------------------编程问答-------------------- int i;没有申请内存int i = new int();申请了内存
申明变量时最好付初值
--------------------编程问答-------------------- 没有区别
可以看生成的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 --------------------编程问答--------------------
是这样的,说得好!
--------------------编程问答--------------------
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类型除外,它和值类型一样也有隐式的默认构造函数可以直接赋值... --------------------编程问答--------------------
C#没有自己的数据类型? --------------------编程问答--------------------
感覺上對的。 --------------------编程问答-------------------- int i;
这个变量i在运行时会被赋值0
这是调试时VS中的警告信息:警告 1 从未对字段“_Default.i”赋值,字段将一直保持其默认值 0
--------------------编程问答--------------------
「开始」菜单\程序\Microsoft Windows SDK v6.0A\Tools\IL 反汇编程序 --------------------编程问答--------------------
值类型的就这样! --------------------编程问答-------------------- 学习 --------------------编程问答--------------------
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的。。。。
也不知道哪个说的是对的。。。。。 --------------------编程问答--------------------
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]
--------------------编程问答-------------------- 学习! --------------------编程问答--------------------
同意
我再补充一些,在C#中,所有东西都是对象,变量也是对象,所以也有构造函数.int float等所谓的数据类型,其实跟类没有区别,所以也有这种形式:int i=new i()
int 是System.Int32的别名,相当于using int System.Int32 --------------------编程问答-------------------- 不过IL代码应该是一样的 --------------------编程问答-------------------- using int=System.Int32 --------------------编程问答-------------------- 学习。。IL代码啥回事??全称是什么? --------------------编程问答--------------------
其实IL代码才是真正的.NET语言,我们平时所说的 VB.NET/x#.NET/C++.NET 和.NET语言没有关系,只是编译器将我们容易理解的语言编译成.NET语言。
参考自《C#高级编程》第四版。 --------------------编程问答--------------------
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)
--------------------编程问答-------------------- 学习 关注 --------------------编程问答-------------------- 牛人一大堆 --------------------编程问答-------------------- 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#