发现一段很诡异的C#代码,见识了静态构造函数这种奇怪的东西:
using System;
namespace StaticTest
{
class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B()
{
}
static void Main()
{
Console.WriteLine("X={0}, Y={1}", A.X, B.Y);
}
}
}
先补习下吧:
1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
3、一个类只能有一个静态构造函数。
4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
5、最多只运行一次。
6、静态构造函数不可以被继承。
7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
好,复习完毕,哪位同学回答下上面程序的输出结果是多少?
还是搞不明白吧:) 唔,你明白了?他没明白,我也没明白……
class A静态构造函数中的B.Y好像很奇怪,貌似要确定A.X的值,得先确定B.Y的值,而B.Y的值在B中却是由A.X来确定的,那A.X的值……啊,要疯掉了……应该是多少呢?不敢确定了吧,交给编译器来运行看看吧~~
结果如下:
X=1, Y=2
修改下代码,看看内部到底怎么运行的:
using System;
namespace StaticTest
{
class A
{
public static int X;
static A()
{
Console.WriteLine("calling A");
Console.WriteLine(B.Y);
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B()
{
Console.WriteLine("calling B");
Console.WriteLine(Y);
}
static void Main()
{
Console.WriteLine("X={0}, Y={1}", A.X, B.Y);
}
}
}
执行结果如下:
calling A
0
calling B
2
X=1, Y=2
看到这个结果,对C#更加迷惑了。类A中静态构造函数调用得到的B.Y,居然是0。这是什么道理?难道这个时候B还没出生,但是B.Y已经出生了?不管了,先接受了吧,以后玩C#还是小心点了。哪位神仙指点指点迷津啊?
分享到:
相关推荐
本文将深入探讨C#中的公有变量(public)、私有变量(private)和静态变量(static),并结合20171028的C#编程实践进行说明。 **公有变量(public)** 公有变量是可以被程序任何部分访问的成员,无论是在同一类中...
C#中静态变量的使用 C# 中静态变量的使用是指在 C# 语言中使用静态变量的方法和技术。本文将详细介绍静态变量与非静态变量的区别、静态变量的使用方式、静态构造函数的使用等方面的知识点。 一、静态变量与非静态...
有关静态变量和实例变量的资料,有详细的说明,大家可以看一下。我这里 有大量的关于c#的资料 要的话可以私信我
本文实例讲述了C#静态变量与实例变量的具体用法,分享给大家供大家参考。具体分析如下: 1)在语法定义上的区别: 类变量也叫静态变量,静态变量前要加static关键字,而实例变量前则不加; 实例变量也叫对象变量,...
标题中的“WPF绑定静态变量的示例代码(二)加上IValueConverter”指出了一个具体的编程任务:在WPF应用中,我们需要将静态变量与UI元素绑定,并且利用IValueConverter来处理数据转换,以便于控件能够正确地反映出...
在C#中,静态变量属于类,而不是类的实例。这意味着,无论创建了多少对象,静态变量只有一个副本,所有对象共享这个副本。在WPF中,我们可能会遇到需要将控件与这样的全局状态关联的情况,这时绑定到静态变量就变得...
本篇文章将深入探讨如何在C#中静态调用Web Service,以便通过Web Service来访问数据库。Web Service是一种基于互联网的软件服务,允许不同系统间的应用程序进行交互。在描述的场景中,我们构建了一个IIS(Internet ...
C#中的静态类、静态构造函数和静态变量是编程中重要的概念,它们在程序设计中起着关键的作用。 首先,让我们来理解静态类。在C#中,静态类是一种特殊的类,它不能被实例化,只能通过类名直接调用其静态成员。静态类...
### C#静态方法与非静态方法的比较 在C#编程语言中,静态方法与非静态(实例)方法是两种非常重要的方法定义方式。这两种方法各有特点,在不同的场景下使用可以带来不同的效果。 #### 一、概念理解 **1. 静态方法...
本文实例讲述了C#中static静态变量的用法。分享给大家供大家参考。具体如下: 使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,...
在C#编程中,静态变量和静态方法是两种重要的特性,它们在程序设计中有着特定的应用场景和作用。本文将通过实例分析这两种概念,并探讨如何优化程序性能。 首先,我们来看一下静态变量。静态变量是属于类级别的,而...
C#通过变量名与倍福PLC相连,是一种常见的实现设备控制和数据交换的方法。 首先,我们需要了解C#如何进行串行或网络通信。这通常涉及到使用System.Net命名空间中的Socket类或System.IO.Ports命名空间中的SerialPort...
VB.NET能够实现很多C#不能做到的功能,如When语句、Optional参数、局部Static变量、对象实例访问静态方法、Handles绑定事件、On Error处理异常、Object直接后期绑定等等。VB和C#同属.NET的语言,编译出来的是同样的...
C#事件监视变量变化,事件推送机制,用于变量绑定场景,后台出发前台更新操作
在C#编程语言中,变量是...综上所述,C#中的变量是存储数据的基础,理解其声明、类型、作用域、生命周期以及与其他语言元素的交互对于编程至关重要。通过阅读"第四章成员变量和常量.doc",你应该能获得更深入的理解。
在C#编程语言中,"静态"(Static)是一个非常重要的关键字,它有着广泛的用途,涉及到类、方法、变量等多个方面。本篇文章将深入探讨C#中的静态概念及其应用。 首先,静态类(Static Class)是不能被实例化的,它们...
`Environment`命名空间是.NET框架提供的一部分,它包含了与当前执行环境相关的静态类和方法。这些方法包括获取、设置和检查环境变量。下面,我们将深入探讨如何使用`Environment`类来操作环境变量。 1. **获取环境...
本文档聚焦于C#的基础变量与数据类型,这是学习任何编程语言的第一步,也是构建强大程序的基石。 1. 变量:在C#中,变量可以被视为存储数据的容器。每当你需要在程序中存储一个值时,就需要声明一个变量。声明变量...