C#类的 static变量
2016-01-21 17:04
477 查看
using System;
namespace teststatic
{
class class1
{
static int i = getNum();
int j = getNum();
static int num = 1;
static int getNum()
{
return num;
}
static void Main(string[] args)
{
Console.WriteLine("i={0}",i);
Console.WriteLine("j={0}", new class1().j);
Console.Read();
}
}
}
上面的代码是一个网友告诉我的,让我看看结果,我看了一眼马上说结果是
i=1
j=1
网友运行后说结果是
i=0
j=1
我吓了一跳,认真看了代码,原来自己真的错了。
下面我解释一下为什么是后一种结果
对一个类来说,static变量是与对象无关的,那么它们什么时候被初始化呢?就是在第一次引用的时候。当类生成对象的时候,可以简单分成3步
1,为所有static变量分配内存,这个时候内存里面的值是该变量类型的缺省值。关于不同值类型的缺省值大家可以去查相关资料,注意值类型和引用类型是不同的。
2,为static变量赋值,同样要注意值类型和引用类型是不同的。
3,生成对象,调用构造函数,先调用这个类的父类的构造函数,然后调用类本身的构造函数,生成对象。
现在分析上面的代码:
Console.WriteLine(string.Format("i={0}",i));这里i是static变量,而且类class1是第一次被引 用,按照上面说的三步,要先为class1里面所有的static变量分配内存。尽管现在有超线程技术,但是指令在逻辑还是一条一条的按顺序执行的,所以 先为static int
i分配内存,并且在该内存中保持int的缺省值0,接着再为static int num 变量分配内存,值当然也为0。
然后执行第二步,为变量赋值:先为static int i变量赋值,i=getNum(),看getNum里面的代码,就是return num,这个时候num的值是0,于是i就为0了。然后对变量num赋值,num=1;这行代码执行后,num就为1了。分析到这里我就不继续分析了,大 家很容易看出结果是什么。
稍微熟悉c#的人,只要认真看代码,肯定不会出错,但是如果拿来考人,相信很多人会做错。我认为这个问题简单得算不上一个技术问题,所以放在非技术区。之 所以在上面说那么多废话来分析,是想说明在编程的时候,即使非常熟悉、非常基本的东西,也要认真。事实上对static 值类型变量不直接赋值,而通过方法来赋值,是不常用或者是有点bt(变态)的做法,但是我仍然很佩服出题的人,毕竟目的只是为了理解static变量。
namespace teststatic
{
class class1
{
static int i = getNum();
int j = getNum();
static int num = 1;
static int getNum()
{
return num;
}
static void Main(string[] args)
{
Console.WriteLine("i={0}",i);
Console.WriteLine("j={0}", new class1().j);
Console.Read();
}
}
}
上面的代码是一个网友告诉我的,让我看看结果,我看了一眼马上说结果是
i=1
j=1
网友运行后说结果是
i=0
j=1
我吓了一跳,认真看了代码,原来自己真的错了。
下面我解释一下为什么是后一种结果
对一个类来说,static变量是与对象无关的,那么它们什么时候被初始化呢?就是在第一次引用的时候。当类生成对象的时候,可以简单分成3步
1,为所有static变量分配内存,这个时候内存里面的值是该变量类型的缺省值。关于不同值类型的缺省值大家可以去查相关资料,注意值类型和引用类型是不同的。
2,为static变量赋值,同样要注意值类型和引用类型是不同的。
3,生成对象,调用构造函数,先调用这个类的父类的构造函数,然后调用类本身的构造函数,生成对象。
现在分析上面的代码:
Console.WriteLine(string.Format("i={0}",i));这里i是static变量,而且类class1是第一次被引 用,按照上面说的三步,要先为class1里面所有的static变量分配内存。尽管现在有超线程技术,但是指令在逻辑还是一条一条的按顺序执行的,所以 先为static int
i分配内存,并且在该内存中保持int的缺省值0,接着再为static int num 变量分配内存,值当然也为0。
然后执行第二步,为变量赋值:先为static int i变量赋值,i=getNum(),看getNum里面的代码,就是return num,这个时候num的值是0,于是i就为0了。然后对变量num赋值,num=1;这行代码执行后,num就为1了。分析到这里我就不继续分析了,大 家很容易看出结果是什么。
稍微熟悉c#的人,只要认真看代码,肯定不会出错,但是如果拿来考人,相信很多人会做错。我认为这个问题简单得算不上一个技术问题,所以放在非技术区。之 所以在上面说那么多废话来分析,是想说明在编程的时候,即使非常熟悉、非常基本的东西,也要认真。事实上对static 值类型变量不直接赋值,而通过方法来赋值,是不常用或者是有点bt(变态)的做法,但是我仍然很佩服出题的人,毕竟目的只是为了理解static变量。
相关文章推荐
- C#链接文件的应用
- C#全角和半角转换
- 在C#中创建和读取XML文件
- C#语言基础(一)
- C#利用Windows自带gdi32.dll实现抓取屏幕功能实例
- C#调用FFMPEG实现桌面录制(视频+音频+生成本地文件)【笔记】
- AWS 之 S3篇<.NET(c#)批量上传文件>
- C# 利用 OpenCV 进行视频捕获 (笔记)
- RickTextBox控件基础用法
- 伸展二叉树树(C#)
- C#的Enum——枚举
- C#获取当前日期时间(转)
- C#delegate委托
- c# 导入Excel 存到DataTable并进行行转列操作及合并DataTable相同行的值
- C# new用法总结
- C#创建、安装一个Windows服务
- C#数组初始化(全)
- C#反射
- C#中计算时间差
- C# - ref