C#类中static变量用法分析

作者:shichen2014 时间:2022-06-20 16:14:23 

本文实例讲述了C#类中static变量用法。分享给大家供大家参考。具体分析如下:

先来看一段代码:

using System;
namespace Param
{
class Class1
{
static int i = getNum();
int j = getNum();
static int num = 1;
static int getNum()
{
return num;
}
[STAThread]
static void Main(string[] args)
{
Console.WriteLine(string.Format("i={0}",i));

Console.WriteLine(string.Format("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的做法,但是我仍然很佩服出题的人。

希望本文所述对大家的C#程序设计有所帮助。

标签:C#,类,static
0
投稿

猜你喜欢

  • Java C++ 算法题解leetcode1608特殊数组特征值

    2023-05-21 21:09:01
  • 基于Hadoop实现Knn算法

    2023-11-27 04:01:20
  • Java线程通信之wait-notify通信方式详解

    2022-05-17 19:35:46
  • eclipse下搭建hibernate5.0环境的步骤(图文)

    2022-09-26 02:48:57
  • java利用udp实现发送数据

    2023-03-21 18:30:49
  • Java实现经典游戏Flappy Bird的示例代码

    2022-03-28 07:05:37
  • 浅谈Java中Lambda表达式的相关操作

    2023-09-17 12:00:58
  • C#特性-迭代器(上)及一些研究过程中的副产品

    2023-12-05 18:26:49
  • spring系列笔记之常用注解

    2022-02-21 16:15:04
  • SpringMVC @GetMapping注解路径冲突问题解决

    2022-12-18 01:43:17
  • 详解C#扩展方法原理及其使用

    2022-12-20 03:55:22
  • 利用ssh实现服务器文件上传下载

    2021-10-16 09:28:47
  • C# Timer控件学习之使用Timer解决按钮幂等性问题

    2021-07-07 11:26:09
  • Redis使用RedisTemplate模板类的常用操作方式

    2023-01-30 08:33:40
  • Jackson序列化和反序列化忽略字段操作

    2022-08-29 14:01:14
  • Eclipse项目有红感叹号的解决方法

    2023-02-13 10:54:15
  • Java读取properties配置文件的8种方式汇总

    2022-05-03 17:11:34
  • 谈谈Android的三种网络通信方式

    2023-04-19 17:28:47
  • 轻松学习C#的装箱与拆箱

    2021-07-01 12:11:51
  • 快速了解如何在.NETCORE中使用Generic-Host建立主机

    2022-05-08 15:04:12
  • asp之家 软件编程 m.aspxhome.com