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