包含在类中的变量叫做字段
包含在函数中的变量叫局部变量
如果构造了一个类的实例,那么声明在这个类内的字段(值类型\引用类型字段)都自然会被初始化为0或null.
(为引用类型构造实例对象时,系统在托管堆中为实例分配了内存地址并且全部置于0值)
问题:
1.如果我们在方法中声明了一个局部值类型变量,系统会何时为其在堆栈分配内存??
(我们知道引用类型的new会分配内存,值类型的new仅是调用构造器进行初始化)
2.在堆栈中分配的内存地址会在分配的同时被置于0值吗?(像上面堆中那样)
3.如果不会自动置于0,那么只能靠构造器来初始化吗?
13 个解决方案
#1
to 1.如果我们在方法中声明了一个局部值类型变量,系统会何时为其在堆栈分配内存??
运行到顶一此局部值类型变量定义的时候,才进行分配。
运行到顶一此局部值类型变量定义的时候,才进行分配。
#2
to 2.在堆栈中分配的内存地址会在分配的同时被置于0值吗?
不一定,看当前值类型变量,如何被初始化的,
对于c#而言,大多数值类型都是struct来定义的,因此提供默认的构造函数,默认构造函数如何对类型进行初始化,会因类型不同而不同。
不一定,看当前值类型变量,如何被初始化的,
对于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值
第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。
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()干的吗?
属于类成员时会得到默认值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。
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();
}
}
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来定义的,因此提供默认的构造函数,默认构造函数如何对类型进行初始化,会因类型不同而不同。
不一定,看当前值类型变量,如何被初始化的,
对于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值
第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。
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()干的吗?
属于类成员时会得到默认值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。
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();
}
}
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
没有意思撒