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

本文关键字:int new 为什么 在哪里 | 更新日期: 2023-09-27 17:52:50

只是好奇,之间有什么区别

int A = 100;

int A = new int();  

我知道new是用来在堆上分配内存的。。但我真的不了解这里的背景。

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

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);

区别?

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

什么时候?

几乎从来没有。也许在某些生成的代码中,使用new TypeName()语法更简单,但即使这样,default(TypeName)也是首选。

并且new执行而不是"在堆上分配内存"。它初始化一个实例;仅此而已。

我强烈建议您阅读这篇来自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,否则编译器将显示

使用未分配的局部变量

按照以下声明A

int A = new int(); //A initialised to 0 (default value of int)

允许在没有手动初始化的情况下对A进行进一步操作-我想你现在明白我的意思了。


现在让我们讨论使用new ()

使用new并不意味着将在堆上分配内存;如果CCD_ 10是局部变量(例如在方法中(,则将在堆栈上为其分配内存。但是,如果A是一个类的成员,则在创建该类的实例时,将在堆上分配内存

需要记住的一点:如果A是静态的,它将始终在堆栈内存中

int A=100;

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

int A=new int();

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

我从另一个链接看到了它:

MSDN表示:"新的运算符还用于调用值类型的默认构造函数。">

方法内部:

  • 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

myInt = new int();  // Invoke default constructor for int type.

此语句等效于以下语句:

myInt = 0;         // Assign an initial value, 0 in this example.

使用新运算符调用特定类型的默认构造函数,并将默认值分配给变量。整数的默认值为0 BTW。

不同之处在于,您不能使用新运算符初始化和设置除默认值以外的任何内容。

我认为没有必要在int上添加new(因为int有默认的内存大小(。。当我们有一个用户定义的类,实例化一个对象时,就会使用new。。

public static Main()
{
  Cat cat1=new Cat();
}
Public class Cat
{
  public bool Sex
  public string Name
}

现在编译器将把这么多内存分配给cat1(在类Cat中定义的内存大小(

"int"是一个值类型,因此两个表达式都不会在托管堆上分配内存。第一条语句将A初始化为您指定的文字。第二条语句将A保留为默认值。

如果您在类中使用int作为字段,您甚至可以简单地说int x;——由于int是一种值类型,它不能为null,因此会获得其默认值,即0。

我最终发现了我的问题

我修改了值,但没有修改对象

这是正确的方法:

 public ActionResult ChangeDefaultUserLockingSetting(int PasswordAttempts, int DefaultLockingTime)
        {
            var defaultAccountSettings = new DefaultAccountSettingsDataContext();
            var accountSettings = defaultAccountSettings.DefaultAccountSettings.First(u => u.id == 1);

            accountSettings.DefaultAccountLockoutTimeSpan = DefaultLockingTime;
            accountSettings.MaxFailedAccessAttemptsBeforeLockout = PasswordAttempts;
            defaultAccountSettings.SubmitChanges();
            return View("Index", loadAdministrationViewModel());
        }