只是好奇,以下两者有何不同:
int A = 100;
并且int A = new int();
我知道new被用于在堆上分配内存..但是我真的不理解这里的上下文。
只是好奇,以下两者有何不同:
int A = 100;
并且int A = new int();
我知道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 = new int();
与相同
int A = default(int);
区别?
后者以A为0结尾,而不是100。
何时使用?
几乎从来没有。或许在一些生成的代码中使用new TypeName()
语法更加简单,但即使在这种情况下,default(TypeName)
也是首选。
new
并不会"在堆上分配内存"。它只是初始化一个实例而已。
new
在方法隐藏中有另一种用法(作为关键字)。完全无关,但它确实存在。 - Marc Gravell我强烈推荐你阅读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
并不意味着内存将被分配到堆上;如果A
是一个局部变量(例如在一个方法中),它将被分配在栈上的内存空间。然而,如果A是类的成员,那么在创建类的实例时会在堆上分配内存。
需要记住的一点是:如果A是静态的,它将始终位于栈内存上!
int A=100;
在堆栈上分配一个int,并将其值设置为100。
int A=new int();
在堆栈上分配一个 int(是的,值类型即使使用 new
关键字也总是在堆栈上分配),并将其值设置为默认值,即 0。
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.
public static Main()
{
Cat cat1=new Cat();
}
Public class Cat
{
public bool Sex
public string Name
}
我最终发现了我的问题
我修改的是值,而不是对象
这是正确的做法:
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"是一个值类型,因此两个表达式都不会在托管堆上分配内存。第一条语句将把A初始化为您指定的文字。第二条语句将使A保持默认值。
"int x;
- 因为int是值类型,它不能为null,因此会获得其默认值 - 即0。