关于局部变量初始化问题

时间:2022-05-07 19:37:00
我们知道 
包含在类中的变量叫做字段
包含在函数中的变量叫局部变量

如果构造了一个类的实例,那么声明在这个类内的字段(值类型\引用类型字段)都自然会被初始化为0或null.
(为引用类型构造实例对象时,系统在托管堆中为实例分配了内存地址并且全部置于0值)

问题:
1.如果我们在方法中声明了一个局部值类型变量,系统会何时为其在堆栈分配内存??
(我们知道引用类型的new会分配内存,值类型的new仅是调用构造器进行初始化)

2.在堆栈中分配的内存地址会在分配的同时被置于0值吗?(像上面堆中那样)

3.如果不会自动置于0,那么只能靠构造器来初始化吗?


13 个解决方案

#1


to 1.如果我们在方法中声明了一个局部值类型变量,系统会何时为其在堆栈分配内存??

运行到顶一此局部值类型变量定义的时候,才进行分配。

#2


to 2.在堆栈中分配的内存地址会在分配的同时被置于0值吗?

不一定,看当前值类型变量,如何被初始化的,
对于c#而言,大多数值类型都是struct来定义的,因此提供默认的构造函数,默认构造函数如何对类型进行初始化,会因类型不同而不同。

#3


先谢谢 Knight94(愚翁) 

第2问 我的意思可能没有表达清楚
class Class1
{
  public int a;
  public int b;
  public Class1(int o)
   {
      a=o;
   }
  static void main()
   { 
   Class1 oo = new Class1(10);
   Console.WriteLine("a={0},b={1}",oo.a,oo.b)
   }
}
结果是a=10,b=0 
b=0并不是Class1()构造器干的
而是new分配内存地址置0所得 
如果构造器没有为b字段赋值 
那么将保持0值

#4


如果换做局部变量呢?会像引用类型那样分配内并存置0吗?

#5


to b=0并不是Class1()构造器干的

b=0与Class1()构造器没有任何直接关系
对于int类型来说,默认值为0。

#6


to 对于int类型来说,默认值为0。
属于类成员时会得到默认值0
但在方法内或者局部声明一个int类型 默认值不会为0
不会通过编译~提示未赋值

to b=0与Class1()构造器没有任何直接关系
是的没有关系 b=0 不是Class1()干的

如果在方法内 构造一个值类型实例
例如构造一个结构的实例 用默认无参构造器构造
此时这个结构实例的值 全部未0
struct ok
{
  public int x;
  public int y;
}
class Class1
{
  static void main()
  {
    ok xy=new ok();
    Console.WriteLine(xy.x);//为0
    Console.WriteLine(xy.y);//为0
  }
}
那么现在x,y的值都为0,是ok()干的吗?

#7


首先,你要了解值类型变量的内存分配是在栈上,例如对于如下语句:
int i;
来说,系统首先为变量分配4个字节,然后用int类型的默认值来初始化这个4个字节。

对于
struct ok
{
public int x;
public int y;
}

ok tt;
对于如上来说,系统首先为tt分配8个字节,4个字节为x,另外4个字节为y,然后看ok的默认构造函数是否做了什么特殊的操作来初始化这8个字节,
如果没有什么特别处理的话,分别转向int类型的默认值来分别初始化x以及y。

#8


哥们,局部变量必须你自己显式赋值。
不赋值,试试,能通过编译吗?
不需要你用什么构造器呀什么的,这和他们没有关系

#9


举个例子
using System;
public class test
 {
    public static int a;
    public int b; 
    public test()
    {
      //test类构造器并没有做什么赋值
     }
 }
public class test2
{
    static void Main()
    {
      Console.WriteLine(test.a.ToString());
      test tst1 = new test();
      Console.WriteLine(tst1.b.ToString());
      Console.ReadLine();
     }
}

#10


函數內部的變量必須初始化才能通過編譯...

#11


gz

#12


C#局部变量必须赋值才能编译通过,讨论没有意义。

#13


没有意思撒

#1


to 1.如果我们在方法中声明了一个局部值类型变量,系统会何时为其在堆栈分配内存??

运行到顶一此局部值类型变量定义的时候,才进行分配。

#2


to 2.在堆栈中分配的内存地址会在分配的同时被置于0值吗?

不一定,看当前值类型变量,如何被初始化的,
对于c#而言,大多数值类型都是struct来定义的,因此提供默认的构造函数,默认构造函数如何对类型进行初始化,会因类型不同而不同。

#3


先谢谢 Knight94(愚翁) 

第2问 我的意思可能没有表达清楚
class Class1
{
  public int a;
  public int b;
  public Class1(int o)
   {
      a=o;
   }
  static void main()
   { 
   Class1 oo = new Class1(10);
   Console.WriteLine("a={0},b={1}",oo.a,oo.b)
   }
}
结果是a=10,b=0 
b=0并不是Class1()构造器干的
而是new分配内存地址置0所得 
如果构造器没有为b字段赋值 
那么将保持0值

#4


如果换做局部变量呢?会像引用类型那样分配内并存置0吗?

#5


to b=0并不是Class1()构造器干的

b=0与Class1()构造器没有任何直接关系
对于int类型来说,默认值为0。

#6


to 对于int类型来说,默认值为0。
属于类成员时会得到默认值0
但在方法内或者局部声明一个int类型 默认值不会为0
不会通过编译~提示未赋值

to b=0与Class1()构造器没有任何直接关系
是的没有关系 b=0 不是Class1()干的

如果在方法内 构造一个值类型实例
例如构造一个结构的实例 用默认无参构造器构造
此时这个结构实例的值 全部未0
struct ok
{
  public int x;
  public int y;
}
class Class1
{
  static void main()
  {
    ok xy=new ok();
    Console.WriteLine(xy.x);//为0
    Console.WriteLine(xy.y);//为0
  }
}
那么现在x,y的值都为0,是ok()干的吗?

#7


首先,你要了解值类型变量的内存分配是在栈上,例如对于如下语句:
int i;
来说,系统首先为变量分配4个字节,然后用int类型的默认值来初始化这个4个字节。

对于
struct ok
{
public int x;
public int y;
}

ok tt;
对于如上来说,系统首先为tt分配8个字节,4个字节为x,另外4个字节为y,然后看ok的默认构造函数是否做了什么特殊的操作来初始化这8个字节,
如果没有什么特别处理的话,分别转向int类型的默认值来分别初始化x以及y。

#8


哥们,局部变量必须你自己显式赋值。
不赋值,试试,能通过编译吗?
不需要你用什么构造器呀什么的,这和他们没有关系

#9


举个例子
using System;
public class test
 {
    public static int a;
    public int b; 
    public test()
    {
      //test类构造器并没有做什么赋值
     }
 }
public class test2
{
    static void Main()
    {
      Console.WriteLine(test.a.ToString());
      test tst1 = new test();
      Console.WriteLine(tst1.b.ToString());
      Console.ReadLine();
     }
}

#10


函數內部的變量必須初始化才能通過編譯...

#11


gz

#12


C#局部变量必须赋值才能编译通过,讨论没有意义。

#13


没有意思撒