web-dev-qa-db-fra.com

Où et pourquoi utiliser int a = new int?

Juste curieux, quelle est la différence entre:

int A = 100;

et

int A = new int();  

Je sais que new est utilisé pour allouer de la mémoire sur le tas ... mais je n'ai pas vraiment le contexte ici.

32
Miriah
static void Main()
{
    int A = new int();
    int B = default(int);
    int C = 100;
    Console.Read();
}

Est compilé pour

.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

Comme vous pouvez le voir, le premier suffit de l'initialiser et le second est tout de même et le troisième est initialisé et défini sur 100. Quant au code IL généré, ils sont tous les deux initialisés sur une seule ligne.

alors

int A = new int();

Est le même que

int A = default(int);
32
Aliostad

Différence?

ce dernier se termine par A étant 0, pas 100.

Quand?

Presque jamais. Peut-être que dans certains codes générés, il est plus simple d'utiliser la syntaxe new TypeName(), mais default(TypeName) serait même préférable.

Et new ne pas "alloue de la mémoire sur le tas". Il initialise une instance; c'est tout.

21
Marc Gravell
int A=100;

Alloue un int sur la pile et définit sa valeur à 100.

int A=new int();

Alloue un int sur la pile (oui, les types de valeurs sont toujours alloués sur la pile, même avec le mot clé new) et définit sa valeur par défaut, c'est-à-dire 0.

9
user703016

recommande fortement de lire cet article de dotnet mob: - http://codaffection.blogspot.in/2015/02/difference-between-declarations-int-i.html

int A = 100;//Initialises A to 100 Manually

Maintenant, si vous déclarez un entier comme

int A;

Pour les autres opérations sur A, vous devez initialiser A avec une valeur entière, sinon le compilateur affiche

utilisation d'une variable locale non signée

Dans ce cas, lorsque vous déclarez comme

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

cela aide à faire plus d'opérations sur A sans initialisation manuelle, je pense que vous avez compris mon point maintenant.


Maintenant, quand on parle de

nouveau ()

Cela ne signifie pas que la mémoire allouée sera sur le tas, cela dépend comme si A est une variable locale (comme dans une méthode) ce sera sur la mémoire de la pile Ou si A est un membre d'une classe alors il sera sur le tas quand l'instance de la classe est créée.

Point à retenir: si A est statique, il sera toujours dans la mémoire de la pile!

7
Shamseer K

Je l'ai vu d'un autre lien:

MSDN indique que "le nouvel opérateur est également utilisé pour appeler le constructeur par défaut pour les types de valeur."

À l'intérieur d'une méthode:

  • int x;: Alloue un int sur la pile et ne l'initialise pas.
  • int x=5;: Alloue un int sur la pile et le met à 5;
  • int x=new int();: alloue un int sur la pile et le met à 0;
  • int x=new int(5);: ne compile pas.

http://msdn.Microsoft.com/en-us/library/fa0ab757.aspx

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

Cette déclaration est équivalente à la déclaration suivante:

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

L'utilisation du nouvel opérateur appelle le constructeur par défaut du type spécifique et affecte la valeur par défaut à la variable. La valeur par défaut d'un entier est 0 BTW.

La différence est que vous ne pouvez pas initialiser et définir autre chose que la valeur par défaut en utilisant le nouvel opérateur.

2
rucsi

Je ne pense pas qu'il soit nécessaire d'ajouter new sur int (car int a une taille de mémoire par défaut) .. new est utilisé lorsque nous avons une classe définie par l'utilisateur dont nous instancions un objet ..

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

Public class Cat
{
  public bool Sex
  public string Name
}

Maintenant, le compilateur allouera autant de mémoire à cat1 (la taille de la mémoire qui est définie dans la classe Cat)

1
oniel telies

Si vous utilisez l'int comme champ dans votre classe, vous pourriez même dire simplement int x; - puisque int est un type de valeur, il ne peut pas être nul et obtient donc sa valeur par défaut - c'est-à-dire 0.

0
Jasper

Je découvre mon problème

Je modifiais les valeurs mais pas l'objet

C'est la bonne façon de procéder:

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

"int" est un type de valeur, donc aucune expression n'allouera de mémoire sur le tas managé. La première instruction initialisera A au littéral que vous spécifiez. La deuxième instruction laissera A à une valeur par défaut.

0
Ed Noepel