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

Mir*_*iah 31 c# new-operator

只是好奇,有什么区别:

int A = 100;
Run Code Online (Sandbox Code Playgroud)

int A = new int();  
Run Code Online (Sandbox Code Playgroud)

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

Ali*_*tad 32

static void Main()
{
    int A = new int();
    int B = default(int);
    int C = 100;
    Console.Read();
}
Run Code Online (Sandbox Code Playgroud)

被编译为

.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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,第一个只是初始化它,第二个是相同的,第三个初始化并设置为100.至于生成的IL代码,它们都在一行中初始化.

所以

int A = new int();
Run Code Online (Sandbox Code Playgroud)

是相同的

int A = default(int);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 21

区别?

后者以A为0而不是100结束.

什么时候?

从来没有.也许在某些生成的代码中,使用new TypeName()语法更简单,但default(TypeName)即便如此也是首选.

而且new没有 "堆上分配内存".它初始化一个实例; 就这些.


use*_*016 9

int A=100;
Run Code Online (Sandbox Code Playgroud)

在堆栈上分配一个int并将其值设置为100.

int A=new int();
Run Code Online (Sandbox Code Playgroud)

在堆栈上分配一个int(是的,值类型总是在堆栈上分配,即使使用new关键字)并将其值设置为默认值,即0.

  • 你说*总是*......总是不是"这个精确的案例" (5认同)
  • "堆栈上的值类型"具有误导性.例如,在结构数组中,或作为类中的字段.这还取决于你如何计算"堆栈中的单位然后复制" (2认同)
  • 总是不正确的,如果 int 是一个本地变量,那么它会在堆栈上,但如果它是一个实例字段,那么它将在堆上。 (2认同)

Sha*_*r K 7

强烈建议从dotnet mob阅读这篇文章: - http://codaffection.blogspot.in/2015/02/difference-between-declarations-int-i.html

int A = 100;//Initialises A to 100 Manually
Run Code Online (Sandbox Code Playgroud)

现在,如果你声明一个像这样的整数

int A;
Run Code Online (Sandbox Code Playgroud)

对于A上的进一步操作,您需要使用整数值初始化A,否则编译器显示

使用不对称的局部变量

在这种情况下,当你声明时

int A=new int();//A initialised to 0 (default value of int)
Run Code Online (Sandbox Code Playgroud)

它有助于在没有手动初始化的情况下在A上进行进一步操作,我想你现在明白我的意思了.


现在我们谈论的时候

新的()

它并不意味着分配的内存将在堆上,它取决于如果A是局部变量(如在方法中)它将在堆栈内存上或者如果A是类的成员那么它将在堆上的实例时类已创建.

要记住的要点:如果A是静态的,它将永远存在于堆栈内存中!


How*_*ard 5

我是从另一个链接看到的:

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