C#域的初始化

注意:在C和C++中,未经初始化的变量是不能使用的。在C#中,系统将为每个未经初始化的变量提供一个默认值。这虽然中某种程序中保证了程序的安全性,但对本应初始化为某个特殊值的变量忘记了初始化,也常常会导致程序的执行误入岐途。

对于静态变量、非静态的对象变量和数组变量,这些变量自动初始化为本身的默认值。对于所有引用类型的变量,默认值为null。所有值类型的变量的默认值见下表所示:

表12-1 部分类型的域初始化的值

变量类型 默认值
sbyte,byte,short,ushort,int,uint,long,ulong 0
char \x0000
float 0.0f
double 0.0d
decimal 0.0m
bool false
enum 0

对于struct类型的变量,默认的初始化将对构成该结构的每一个值类型初始化为上表中的默认值,对构成其的每一个引用类型初始化为null。

如果在类中,没有显式地对域进行初始化,系统将赋予其一个默认值。域的默认初始化分为两种情况:对于静态域,类在装载时对其进行初始化;对于非静态域,在类的实例创建时进行初始化。在默认的初始化之前,域的值是不可预测的。

比如,下面的代码是合法的:

class Test
{
static int a=b+1;
static int b=a+1;
}
实际上等价于:

a=1,b=2

而下面的代码则是非法的:

class A
{
int x=1;
int y=x+1;
}
因为非静态变量x在类A实例化以前并没有初始化,代码y=x+1无法得到正确的x的值。

时间: 2024-08-01 17:55:16

C#域的初始化的相关文章

C#锐利体验之第七讲 域与属性

域 域(Field)又称成员变量(Member Variable),它表示存储位置,是C#中类不可缺少的一部分.域的类型可以是C#中任何数据类型.但对于除去string类型的其他引用类型由于在初始化时涉及到一些类的构造器的操作,我们这里将不提及,我们把这一部分内容作为"类的嵌套"放在"接口 继承与多态"一讲内来阐述. 域分为实例域和静态域.实例域属于具体的对象,为特定的对象所专有.静态域属于类,为所有对象所共用.C#严格规定实例域只能通过对象来获取,静态域只能通过类

C#中的域和属性

为了保存类的实例和各种数据信息,C#给我们提供了两种方法:域和属性.其中,属性实现了良好的数据封装和数据隐藏. 12.1 域 12.1.1 C#域的声明 12.1.2 C#的静态域和非静态域 12.1.3 C#的只读域 12.1.4 C#域的初始化 12.2 C#中的属性

《Java并发编程的艺术》一一3.6 f?inal域的内存语义

3.6 f?inal域的内存语义 与前面介绍的锁和volatile相比,对f?inal域的读和写更像是普通的变量访问.下面将介绍f?inal域的内存语义.3.6.1 f?inal域的重排序规则 对于f?inal域,编译器和处理器要遵守两个重排序规则. 1)在构造函数内对一个f?inal域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序. 2)初次读一个包含f?inal域的对象的引用,与随后初次读这个f?inal域,这两个操作之间不能重排序. 下面通过一些示例性的代

初始化顺序疑惑,求解答

问题描述 classTag{Tag(intmarker){System.out.println("Tag("+marker+")");}}classCard{Tagt1=newTag(1);//BeforeconstructorCard(){//Indicatewe'reintheconstructor:System.out.println("Card()");t3=newTag(33);//Reinitializet3}Tagt2=newTag

java接口

public interface Serializable 实现 java.io.Serializable 接口的类是可序列化的.没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化.序列化类的所有子类本身都是可序列化的.这个序列化接口没有任何方法和域,仅用于标识序列化的语意. 允许非序列化类的子类型序列化,子类型可以假定负责保存和恢复父类型的公有的.保护的和(如果可访问)包的域的状态.只要该类(扩展)有一个无参构造子,可初始化它的状态,那么子类型就可承担上述职责.在这种情况下申明一个可序

析JAVA之垃圾回收机制

本文为2010年编写,所以有很多看法不是很准确,有一定的参考价值,如需要更加深入细节,请参看,2012年编写的关于JVM的文章: 认识JVM--第一篇-对象生成&回收算法 认识JVM--第二篇-java对象内存模型 JVM第三篇(简单demo) 系统架构-性能篇章1(应用系统性能2-OOM&参数配置) 相继的还会有更多的java深入的知识和机制. 对于JAVA编程和很多类似C.C++语言有一个巨大区别就是内存不需要自己去free或者delete,而是由JVM垃圾回收机制去完成的.对于这个过

C# Sharp Experience

C# 语言是一门简单,现代,优雅,面向对象,类型安全,平台独立的一门新型组件编程语言.其语法风格源自C/C++家族,融合了Visual Basic的高效和C/C++强大,是微软为奠定其下一互联网霸主地位而打造的Microsoft.Net平台的主流语言.其一经推出便以其强大的操作能 力,优雅的语法风格,创新的语言特性,第一等的面向组件编程的支持而深受世界各地程序员的好评和喜爱."它就是我多年来梦寐以求的计算机语言!"--很多 资深程序员拿到C#都是这样的惊讶.从C#语言的名字(C Sha

C#的静态域和非静态域

静态域的声明是使用static修饰符,其它的域都是非静态域.静态域和非静态域分别属于C#中静态变量和非静态变量. 若将一个域说明为静态的,无论建立多少个该类的实例,内存中只存在一个静态数据的拷贝.当这个类的第一个实例建立时,域被初始化.以后再进行类的实例化时,不再对其进行初始化,所有属于这个类的实例共享一个副本. 与之相反,非静态域在类的每次实例化时,每个实例都拥有一份单独的拷贝. 下面的例子清楚地反映了二者之间的区别. 程序清单12-1: using System; public class

C#锐利体验(七)

第七讲 域与属性 域 域(Field)又称成员变量(Member Variable),它表示存储位置,是C#中类不可缺少的一部分.域的类型可以是C#中任何数据类型.但对于除去string类型的其他引用类型由于在初始化时涉及到一些类的构造器的操作,我们这里将不提及,我们把这一部分内容作为"类的嵌套"放在"接口 继承与多态"一讲内来阐述. 域分为实例域和静态域.实例域属于具体的对象,为特定的对象所专有.静态域属于类,为所有对象所共用.C#严格规定实例域只能通过对象来获取