好奇,有什么区别:
int A = 100;
和
int A = new int();
我知道new用于在堆上分配内存..但我真的没有在这里得到上下文。
答案 0 :(得分:32)
static void Main()
{
int A = new int();
int B = default(int);
int C = 100;
Console.Read();
}
编译为
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] int32 A,
[1] int32 B,
[2] int32 C)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldc.i4.0
IL_0004: stloc.1
IL_0005: ldc.i4.s 100
IL_0007: stloc.2
IL_0008: call int32 [mscorlib]System.Console::Read()
IL_000d: pop
IL_000e: ret
} // end of method Program::Main
正如您所见,第一个只是初始化它,第二个是只是相同,第三个初始化并设置为100
。至于生成的IL代码,它们都会在一行中初始化。
所以
int A = new int();
与
相同int A = default(int);
答案 1 :(得分:21)
差异?
后者以A为0而不是100结束。
当?
几乎没有。也许在某些生成的代码中,使用new TypeName()
语法更简单,但即使这样,default(TypeName)
也会更受欢迎。
new
不 “在堆上分配内存”。它初始化一个实例;就是这样。
答案 2 :(得分:8)
int A=100;
在堆栈上分配一个int并将其值设置为100.
int A=new int();
在堆栈上分配一个int(是的,值类型总是在堆栈上分配,即使使用new
关键字)并将其值设置为默认值,即0。
答案 3 :(得分:7)
强烈建议您阅读dotnet mob中的这篇文章: - http://codaffection.blogspot.in/2015/02/difference-between-declarations-int-i.html
int A = 100;//Initialises A to 100 Manually
现在,如果声明一个像
这样的整数int A;
对于A上的进一步操作,您需要用整数值初始化A,否则编译器显示
使用不合标准的本地变量
在这种情况下,当您声明
时int A=new int();//A initialised to 0 (default value of int)
它有助于在没有手动初始化的情况下在A上进行进一步操作,我认为你现在明白了我的观点。
现在我们谈论
new()
它并不意味着分配的内存将在堆上, 它取决于A是局部变量(如在方法中),它将在堆栈内存上 或者,如果A是类的成员,那么在创建类的实例时它将在堆上。
要记住的要点:如果A是静态的,它将始终在堆栈内存中!
答案 4 :(得分:4)
我是从另一个链接看到的:
MSDN说“new运算符也用于调用值类型的默认构造函数。”
在方法内:
int x;
:在堆栈上分配一个int,但不初始化它。int x=5;
:在堆栈上分配一个int并将其设置为5; int x=new int();
:在堆栈上分配一个int并将其设置为0; int x=new int(5);
:无法编译。答案 5 :(得分:2)
myInt = new int(); // Invoke default constructor for int type.
此声明等同于以下声明:
myInt = 0; // Assign an initial value, 0 in this example.
使用new运算符调用特定类型的默认构造函数,并将默认值赋给变量。整数的默认值为0 BTW。
不同之处在于您无法使用new运算符初始化和设置除默认值之外的任何值。
答案 6 :(得分:1)
我认为没有必要在int上添加new(因为int具有默认的内存大小)。 当我们有一个用户定义的类,我们实例化一个对象时使用new ..
public static Main()
{
Cat cat1=new Cat();
}
Public class Cat
{
public bool Sex
public string Name
}
现在编译器会将这么多内存分配给cat1(类Cat中定义的内存大小)
答案 7 :(得分:0)
“int”是一个值类型,因此两个表达式都不会在托管堆上分配内存。第一个语句将A初始化为您指定的文字。第二个语句将A保留为默认值。
答案 8 :(得分:0)
如果你使用int作为类中的一个字段,你甚至可以简单地说int x;
- 因为int是一个值类型,它不能为null,因此得到它的默认值 - 即0。
答案 9 :(得分:0)
我最终发现了我的问题
我正在修改值而不是对象
这是正确的方法:
SetGraphicsRootDescriptorTable