【问题标题】:Where and why use int a=new int?在哪里以及为什么使用 int a=new int?
【发布时间】:2011-04-21 16:16:28
【问题描述】:

只是好奇,有什么区别:

int A = 100;

int A = new int();  

我知道 new 用于在堆上分配内存..但我真的不知道这里的上下文。

【问题讨论】:

  • 简单来说..., int A=100;只是声明一个 int var A 并将其初始化为 100..,而 int A= new int();是一个错误.,虽然它可能是.. int *A = new int();这意味着为堆栈上的 int 创建空间,将 0 放入其中并将该 int 的地址返回给整数指针,即 A
  • @eRaisedToX 使用带有值类型的新运算符不是错误。 stackoverflow.com/questions/5563774/… 它基本上没有什么可观察到的。并且标签是针对 C# 而不是 C++。

标签: c# new-operator


【解决方案1】:

我强烈建议你阅读这篇来自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,否则编译器会显示

使用未赋值的局部变量

如下声明A

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

无需手动初始化即可对 A 进行进一步操作 - 我想你现在明白我的意思了。


现在让我们讨论一下使用new ()

使用new 并不意味着将在堆上分配内存;如果A 是局部变量(例如在方法中),它将在堆栈上分配内存。 然而,如果 A 是一个类的成员,那么当创建该类的实例时,内存在堆上分配。

要记住的一点:如果 A 是静态的,它将永远在堆栈内存中!

【讨论】:

  • 我喜欢这个解释,但是用“int x = 0”和“int x = new()”初始化变量有什么区别呢?
  • @Stokely int x= 0 vs int x = new int();两种情况下没有区别 x 将初始化为零。
【解决方案2】:

区别?

后者以 A 结束,而不是 100。

什么时候?

几乎从来没有。也许在某些生成的代码中使用new TypeName() 语法会更简单,但即便如此,default(TypeName) 也会更受欢迎。

new 确实“在堆上分配内存”。它初始化一个实例;就是这样。

【讨论】:

  • 所以新关键字没有意义?
  • 除非您想要对象/结构的实例,而不仅仅是默认/空值。
  • @Miriah - 意思是:这意味着我们要初始化一个新的对象或值;它并不严格意味着与堆或堆栈有关。请注意,new 在方法隐藏中有另一种用法(作为关键字)。完全不相关,但确实存在。
【解决方案3】:
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);

【讨论】:

    【解决方案4】:

    我从另一个链接看到的:

    MSDN 说“new 运算符还用于调用值类型的默认构造函数。”

    在方法内部:

    • 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

    【讨论】:

      【解决方案5】:

      我认为没有必要在 int 上添加 new(因为 int 具有默认内存大小).. 当我们有一个我们实例化对象的用户定义类时,使用 new ..

      public static Main()
      {
        Cat cat1=new Cat();
      }
      
      Public class Cat
      {
        public bool Sex
        public string Name
      }
      

      现在编译器会将那么多内存分配给 cat1(在 Cat 类中定义的内存大小)

      【讨论】:

        【解决方案6】:
        int A=100;
        

        在堆栈上分配一个 int 并将其值设置为 100。

        int A=new int();
        

        在堆栈上分配一个 int(是的,值类型总是在堆栈上分配,即使使用 new 关键字)并将其值设置为默认值,即 0。

        【讨论】:

        • “堆栈上的值类型”具有误导性。例如,在结构数组中,或作为类的字段。这还取决于您如何计算“堆栈上的单元然后复制”
        • 你说总是...总是不是“这个精确的情况”
        • 总是不正确,如果 int 是本地 var,那么它将在堆栈上,但如果它是实例字段,那么它将在堆上。
        【解决方案7】:
        myInt = new int();  // Invoke default constructor for int type.
        

        这个语句等价于下面的语句:

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

        使用 new 运算符调用特定类型的默认构造函数并将默认值分配给变量。整数的默认值为 0 BTW。

        不同之处在于,除了使用 new 运算符的默认值之外,您不能初始化和设置任何内容。

        【讨论】:

        • 它们不一样。见我的 cmets。
        • 初始化值类型:msdn.microsoft.com/en-us/library/s1ax56ch.aspx 也在我的阅读中,因为 0 是 int 的默认值,这就是为什么 myInt = default(int) 和 myInt = 0 将是相同的。
        • 感谢您确认我对使用“new”和“default”的怀疑。它们的使用毫无意义。总是将值类型实例化为您选择的默认值似乎要好得多,即使它是 0,所以它总是可用的。您还可以避免混淆其自定义默认值应该是什么。
        【解决方案8】:

        "int" 是一种值类型,因此两个表达式都不会在托管堆上分配内存。第一条语句将 A 初始化为您指定的文字。第二条语句将 A 保留为默认值。

        【讨论】:

          【解决方案9】:

          如果您在类中使用 int 作为字段,您甚至可以简单地说 int x; - 因为 int 是一种值类型,它不能为 null,因此获取其默认值 - 即 0。

          【讨论】:

            【解决方案10】:

            我最终发现了我的问题

            我正在修改值,但不是对象

            这是正确的做法:

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

            【讨论】:

              猜你喜欢
              • 2011-09-07
              • 1970-01-01
              • 2019-08-14
              • 1970-01-01
              • 2020-10-31
              • 1970-01-01
              • 2022-10-04
              • 1970-01-01
              • 2014-10-19
              相关资源
              最近更新 更多