気になるのは、次の違いは何ですか?
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
ご覧のとおり、1つ目は初期化するだけで、2つ目はまったく同じで、3つ目は初期化して100
に設定します。生成されたILコードについては、どちらも1行で初期化されますです。
そう
int A = new int();
と同じです
int A = default(int);
差?
後者は、Aが100ではなく0で終わります。
いつ?
ほとんどありません。生成された一部のコードではnew TypeName()
構文を使用する方が簡単かもしれませんが、それでもdefault(TypeName)
が推奨されます。
そしてnew
はnot "ヒープにメモリを割り当てます"を行います。インスタンスを初期化します。以上です。
int A=100;
スタックにintを割り当て、その値を100に設定します。
int A=new int();
スタックにintを割り当て(はい、値の型はnew
キーワードを使用しても、常にスタックに割り当てられます)、その値をデフォルトの0に設定します。
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を初期化する必要があります。そうでない場合、コンパイラーは
未使用のローカル変数の使用
この場合、次のように宣言すると
int A=new int();//A initialised to 0 (default value of int)
手動で初期化せずにAをさらに操作するのに役立ちます。
今私たちが話すとき
新着 ()
これは、割り当てられたメモリがヒープ上にあることを意味するのではなく、Aがローカル変数(メソッド内など)であるか、スタックメモリ上にあるか、またはAがクラスのメンバーである場合、インスタンスのときにヒープ上にあるかによって異なりますクラスが作成されます。
覚えておくべきポイント:Aが静的な場合、常にスタックメモリ上に存在します!
私は別のリンクからそれを見ました:
MSDNは、「新しい演算子は値型のデフォルトコンストラクターを呼び出すためにも使用されます」と述べています。
メソッド内:
int x;
_:スタックにintを割り当て、初期化しません。int x=5;
_:スタックに整数を割り当て、それを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.
New演算子を使用すると、特定のタイプのデフォルトのコンストラクターが呼び出され、変数にデフォルト値が割り当てられます。整数のデフォルト値は0です。
違いは、new演算子を使用してデフォルト値以外の何も初期化および設定できないことです。
Intにnewを追加する必要はないと思います(intにはデフォルトのメモリサイズがあるため)。newは、オブジェクトをインスタンス化するユーザー定義のクラスがある場合に使用されます。
public static Main()
{
Cat cat1=new Cat();
}
Public class Cat
{
public bool Sex
public string Name
}
これで、コンパイラーはその量のメモリをcat1(Catクラスで定義されているメモリサイズ)に割り当てます。
クラスのフィールドとしてintを使用している場合は、単にint x;
-intは値型であるため、nullにすることはできず、デフォルト値、つまり0を取得します。
問題を発見してしまう
私は値を変更していましたが、オブジェクトは変更していませんでした
これはそれを行う適切な方法です:
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を指定したリテラルに初期化します。 2番目のステートメントは、Aをデフォルト値のままにします。