我们知道
包含在类中的变量叫做字段
包含在函数中的变量叫局部变量如果构造了一个类的实例,那么声明在这个类内的字段(值类型\引用类型字段)都自然会被初始化为0或null.
(为引用类型构造实例对象时,系统在托管堆中为实例分配了内存地址并且全部置于0值)问题:
1.如果我们在方法中声明了一个局部值类型变量,系统会何时为其在堆栈分配内存??
(我们知道引用类型的new会分配内存,值类型的new仅是调用构造器进行初始化)2.在堆栈中分配的内存地址会在分配的同时被置于0值吗?(像上面堆中那样)3.如果不会自动置于0,那么只能靠构造器来初始化吗?
包含在类中的变量叫做字段
包含在函数中的变量叫局部变量如果构造了一个类的实例,那么声明在这个类内的字段(值类型\引用类型字段)都自然会被初始化为0或null.
(为引用类型构造实例对象时,系统在托管堆中为实例分配了内存地址并且全部置于0值)问题:
1.如果我们在方法中声明了一个局部值类型变量,系统会何时为其在堆栈分配内存??
(我们知道引用类型的new会分配内存,值类型的new仅是调用构造器进行初始化)2.在堆栈中分配的内存地址会在分配的同时被置于0值吗?(像上面堆中那样)3.如果不会自动置于0,那么只能靠构造器来初始化吗?
解决方案 »
- Modbus通讯:如何用.Net下的NModbus类库实现Linux下的LibModbus库的功能?
- 如何隐藏子窗口的标题栏?
- 试过无数方法 至今纠结 问天下英雄 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。
- c#调用C++写的OCX的奇怪问题?
- 支付宝在线支付问题,不知如何更新自己数据库
- C# WINFORM中怎么调用outlook express 发送邮件?
- 求sharepoint WebPart for vs.net项目模板?
- 快发疯了,为什么添加总是不成功,帮帮我啊!!!!
- 不要笑話我,我要C#學習的好書
- 请问c#下用什么命令编辑makefile文件
- 请问:求一个简单的js脚本!
- 【请教】ListView控件中,如何设置标题栏的背景色,或者将其设为透明?(顶者有分)
对于c#而言,大多数值类型都是struct来定义的,因此提供默认的构造函数,默认构造函数如何对类型进行初始化,会因类型不同而不同。
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值
对于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()干的吗?
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。
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();
}
}