Просто любопытно, в чем разница между:
int A = 100;
и
int A = new int();
Я знаю, что новый используется для выделения памяти на куче. но я действительно не понимаю контекст здесь.
Просто любопытно, в чем разница между:
int A = 100;
и
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);
разница?
последний заканчивается тем, что А равен 0, а не 100.
Когда?
Довольно много никогда. Возможно, в некотором сгенерированном коде проще использовать синтаксис new TypeName()
, но default(TypeName)
будет предпочтительнее даже тогда.
И new
делает не "выделение памяти в куче". Он инициализирует экземпляр; это все.
int A=100;
Выделяет int в стеке и устанавливает его значение в 100.
int A=new int();
Выделяет int в стеке (да, типы значений всегда выделяются в стеке, даже с ключевым словом new
), и устанавливает его значение по умолчанию, то есть 0.
настоятельно рекомендуем прочитать эту статью из dotnet mob: - http://dotnetmob.blogspot.in/2015/02/difference-between-declarations-int-i.html
int A = 100;//Initialises A to 100 Manually
Теперь, если вы объявите целое число, например
int A;
Для дальнейших операций над A вам нужно инициализировать A с целым значением, иначе Compiler показывает
использование неприменимой локальной переменной
В этом случае, когда вы объявляете, как
int A=new int();//A initialised to 0 (default value of int)
это помогает сделать дальнейшую работу на A без ручной инициализации, я думаю, что вы получили мою точку сейчас.
Теперь, когда мы говорим о
new()
Это не значит, что выделенная память будет находиться в куче, это зависит, как если бы А была локальной переменной (как в методе), она будет в стеке памяти Или, если A является членом класса, тогда он будет находиться в куче, когда будет создан экземпляр класса.
Точка для запоминания: если A статично, она всегда будет в стеке памяти!
Я видел это по другой ссылке:
MSDN говорит: "Новый оператор также используется для вызова конструктора по умолчанию для типов значений".
Внутри метода:
int x;
: выделяет int в стеке и не инициализирует его.int x=5;
: выделяет int в стеке и устанавливает его в 5;int x=new int();
: выделяет int на стек и устанавливает его в 0;int x=new int(5);
: не компилируется.myInt = new int(); // Invoke default constructor for int type.
Этот оператор эквивалентен следующему утверждению:
myInt = 0; // Assign an initial value, 0 in this example.
Использование нового оператора вызывает конструктор по умолчанию для конкретного типа и присваивает значение по умолчанию переменной. Значение по умолчанию для целого числа равно 0 BTW.
Разница в том, что вы не можете инициализировать и устанавливать что-либо, кроме значения значения по умолчанию, с помощью нового оператора.
"int" - это тип значения, поэтому ни одно выражение не будет выделять память на управляемой куче. Первый оператор инициализирует A в указанном вами литерале. Второй оператор оставит значение A по умолчанию.
Если вы используете int как поле в своем классе, вы можете просто сказать просто int x;
- поскольку int является типом значения, он не может быть null и, следовательно, получает значение по умолчанию - то есть 0.
В результате я обнаружил свою проблему
Я изменял значения, но не Object
Это правильный способ сделать это:
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());
}
Я не думаю, что нужно добавлять new на int (потому что int имеет размер памяти по умолчанию). new используется, когда у нас есть пользовательский класс, который мы создаем для объекта. Например, Cat c = new Cat(); Теперь компилятор будет выделять столько памяти на c (размер памяти, определенный в классе)