C#中的 is 和 as:
is 可用于任何类型。
例如
int a = 10;
a is Object ==true;
Object o = 10;
o is int ==true;
o = person;
o is int == false;
as 右侧类型必须为引用类型或可空类型。
as操作如果失败,不抛出异常,而是返回null;
结构(struct)栈变量:
结构有如下与类不一样的地方:
1、结构struct不能声明默认构造方法(即无参数构造方法)。
struct Time
{
Time()//错误!结构不能声明默认构造方法
{
}
}
2、在结构自定义构造方法内,所有实例字段必须初始化。静态字段具有默认值并且静态字段可以赋予初始值。
3、编译器为结构提供的默认构造方法被系统自动调用后,会初始化所有实例字段,初始值为他们的默认值。即 0 null false等。
4、结构中所有的实例字段不能包含初始化值。例如 private int id=0;//错误。实例初始化必须放到构造方法中(默认构造方法由系统调用,自定义构造方法由用户调用)。个人认为,之所以结构这样规定,是因为结构是类似于int,boolean、char等的简单类型,防止使用未初始化的变量,如果结构允许存在别初始化的实例字段,将导致使用了未初始化结构变量的错误。
struct Time
{
// public int ID=100; 结构中不能存在实例字段初始值
public const String name = "Time";//常量正常存在,且不能修改
public static int stId ;//结构中static字段可以存在初始值,默认为0 false null
private int hour;
public int miniute;
/*
* 结构不能包含显示的默认构造方法(无参数构造方法)
* 如果不提供结构自定义构造方法,那么编译器自动添加默认构造方法并初始化所有实例字段,这也是结构不能存在实例初始化字段的原因
public Time()
{
}*/
/*
* 在结构自定义构造方法中,所有字段必须初始化(无论字段访问级别如何)
*/
public Time(int hour)
{
this.hour = hour;
miniute=10;
//ID = 001;
}
}
使用结构:
//使用结构
public static void test()
{
Time time = new Time();//初始化
Console.WriteLine(time.miniute);//打印出0
Time time2;//未初始化
//因为是栈变量,所以声明方式可以和其他栈类型int,boolean等一样
// Console.WriteLine(time2.miniute);//Error。字段未初始化
time2.miniute = 50;
Console.WriteLine(time2.miniute);//ok。字段已赋值
//上面两种结构变量声明方式所产生的值均在栈上。
int a = new int();//初始化
Console.WriteLine(a);//0
int b;//未初始化
// Console.WriteLine(b);error:使用了未赋值的变量
b = 10;
Console.WriteLine(b);//OK
}
结构复制:值
time.miniute = 38;
Time tm = time;//复制值。注意time必须使用构造方法的方式声明
time.miniute = 28;//不会改变tm中栈变量的值
Console.WriteLine(tm.miniute);//打印38.