Подтвердить что ты не робот

Где и зачем использовать int a = new int?

Просто любопытно, в чем разница между:

int A = 100;

и

int A = new int();  

Я знаю, что новый используется для выделения памяти на куче. но я действительно не понимаю контекст здесь.

4b9b3361

Ответ 1

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

Ответ 2

разница?

последний заканчивается тем, что А равен 0, а не 100.

Когда?

Довольно много никогда. Возможно, в некотором сгенерированном коде проще использовать синтаксис new TypeName(), но default(TypeName) будет предпочтительнее даже тогда.

И new делает не "выделение памяти в куче". Он инициализирует экземпляр; это все.

Ответ 3

int A=100;

Выделяет int в стеке и устанавливает его значение в 100.

int A=new int();

Выделяет int в стеке (да, типы значений всегда выделяются в стеке, даже с ключевым словом new), и устанавливает его значение по умолчанию, то есть 0.

Ответ 4

настоятельно рекомендуем прочитать эту статью из 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 статично, она всегда будет в стеке памяти!

Ответ 5

Я видел это по другой ссылке:

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

Ответ 6

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

Этот оператор эквивалентен следующему утверждению:

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

Использование нового оператора вызывает конструктор по умолчанию для конкретного типа и присваивает значение по умолчанию переменной. Значение по умолчанию для целого числа равно 0 BTW.

Разница в том, что вы не можете инициализировать и устанавливать что-либо, кроме значения значения по умолчанию, с помощью нового оператора.

Ответ 7

"int" - это тип значения, поэтому ни одно выражение не будет выделять память на управляемой куче. Первый оператор инициализирует A в указанном вами литерале. Второй оператор оставит значение A по умолчанию.

Ответ 8

Если вы используете int как поле в своем классе, вы можете просто сказать просто int x; - поскольку int является типом значения, он не может быть null и, следовательно, получает значение по умолчанию - то есть 0.

Ответ 9

В результате я обнаружил свою проблему

Я изменял значения, но не 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());
        }

Ответ 10

Я не думаю, что нужно добавлять new на int (потому что int имеет размер памяти по умолчанию). new используется, когда у нас есть пользовательский класс, который мы создаем для объекта. Например, Cat c = new Cat(); Теперь компилятор будет выделять столько памяти на c (размер памяти, определенный в классе)