在哪里以及为什么使用int a = new int?

时间:2011-04-21 16:16:28

标签: c# new-operator

好奇,有什么区别:

int A = 100;

int A = new int();  

我知道new用于在堆上分配内存..但我真的没有在这里得到上下文。

10 个答案:

答案 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);:无法编译。

http://msdn.microsoft.com/en-us/library/fa0ab757.aspx

答案 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