C# 在何处以及为什么使用int a=新int?

C# 在何处以及为什么使用int a=新int?,c#,new-operator,C#,New Operator,只是好奇,这两者之间的区别是什么: int A = 100; 及 我知道new用于在堆上分配内存。但我真的不知道这里的上下文。区别 后者的结尾是0,而不是100 什么时候 几乎从来没有。也许在某些生成的代码中,使用new TypeName()语法更简单,但即使在这种情况下,default(TypeName)仍然是首选 而new不在堆上分配内存。它初始化一个实例;仅此而已 static void Main() { int A = new int(); int B = defaul

只是好奇,这两者之间的区别是什么:

int A = 100;

我知道new用于在堆上分配内存。但我真的不知道这里的上下文。

区别

后者的结尾是0,而不是100

什么时候

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

new
在堆上分配内存。它初始化一个实例;仅此而已

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 = default(int);
在堆栈上分配一个int并将其值设置为100

int A=new int();

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

我从另一个链接看到它:

MSDN说“新操作符还用于调用值类型的默认构造函数。”

在方法内部:

  • intx:在堆栈上分配int而不初始化它
  • intx=5:在堆栈上分配一个int并将其设置为5
    
  • intx=newint():在堆栈上分配一个int并将其设置为0
    
  • intx=新的int(5):不编译
“int”是一种值类型,因此两个表达式都不会在托管堆上分配内存。第一条语句将初始化为指定的文本。第二条语句将把A保留为默认值

myInt = new int();  // Invoke default constructor for int type.
此声明等同于以下声明:

myInt = 0;         // Assign an initial value, 0 in this example.
使用新运算符调用特定类型的默认构造函数,并将默认值指定给变量。整数的默认值为0 BTW。


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

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

我强烈建议您阅读dotnet mob上的这篇文章:

假设您将一个整数声明为

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

未分配局部变量的使用

声明
A
如下

int A = new int(); //A initialised to 0 (default value of int)
允许在无需手动初始化的情况下对进行进一步操作-我想你现在明白我的意思了


现在让我们讨论一下如何使用
new()

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


要记住的一点:如果A是静态的,它将始终位于堆栈内存中我最终发现了我的问题

我正在修改值,但没有修改对象

这是正确的方法:

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

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

public static Main()
{
  Cat cat1=new Cat();
}

Public class Cat
{
  public bool Sex
  public string Name
}

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

,因此new关键字没有任何意义?除非您需要对象/结构的实例,而不仅仅是默认的/null值。@Miriah-有意义:这意味着我们要初始化一个新对象或值;严格来说,它与堆或堆栈无关。请注意,
new
在方法隐藏中有另一种用法(作为关键字)。完全不相关,但它是存在的。它们不一样。请参阅我的评论。初始化值类型:在我的阅读中,由于0是int的默认值,这就是为什么myInt=default(int)和myInt=0将是相同的。感谢您确认我对使用“new”和“default”的怀疑。它们的使用毫无意义。似乎最好总是将一个值类型实例化为您选择的默认值,即使它是0,所以它总是可用的。您还可以避免混淆其自定义默认值应该是什么。“堆栈上的值类型”具有误导性。例如,在结构数组中,或作为类上的字段。这还取决于你如何计算“堆栈上的单位,然后复制”你一直说的。。。总是不是“这个精确的情况”总是不正确的,如果int是一个局部变量,那么它将在堆栈上,但是如果它是一个实例字段,那么它将在堆上;只是声明一个int var A并将其初始化为100..,而int A=new int();是一个错误,尽管可能是。。int*A=新的int();这意味着在堆栈上为int创建空间,将0放入其中,并将该int的地址返回到整数指针,即A@eRaisedToX将新运算符与值类型一起使用不是错误。它基本上不做任何可以观察到的事情。标签是C++的,不是C++的。我喜欢这个解释,但是,初始化变量与“int x=0”与“int x=New())的区别是什么?@ StkkyIt int x=0 vs int x=新int();在这两种情况下,没有差异x将初始化为零。
int A;
int A = new int(); //A initialised to 0 (default value of int)
 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());
        }
public static Main()
{
  Cat cat1=new Cat();
}

Public class Cat
{
  public bool Sex
  public string Name
}