类的转换
-
is运算符
using System;
classClass1
{
}
class Class2
{
}
class IsTest
{
static void Test(Object o)
{
Class1 a;
Class2 b;
if (o is Class1)
{
Console.WriteLine("o is Class1");
a = (Class1)o;// do something for a
}
else if (o is Class2)
{
Console.WriteLine("o is Class2");
b = (Class2)o;// do something for b
}
else
{
Console.WriteLine("o is neither Class1 nor Class2");
}
}
static void Main(string[] args)
{
Class1 c1 = new Class1();
Class2 c2 = new Class2();
Test(c1);
Test(c2);
Test("a string");
// output:
// o is Class1
// o is Class2
// o is neither Class1 nor Class2
}
}
-
as运算符
using System;
class AsTest
{
static void Main(string[] args)
{
object[] os = { "a", "b", 1, 2, 3 };
foreach (object o in os)
{
String s = o as string;
if (s != null)
{
Console.WriteLine(s);
}
}
// output:
// a
// b
}
}
结构
枚举和结构是两种高级的值类型。
结构与类很相似,是一种可以包含数据成员和函数的数据结构。但是与类不同,结构是一种值类型,为结构分配数据时不需要从托管堆中分配内存,从栈中分配。结构类型的变量直接包含了改结构的数据,而类类型的变量所包含的只是对象的一个引用。
-
结构
在C#中用关键字struct来声明结构,声明形式如下:
[特性]
[结构修饰符] struct 结构名:[基接口列表]
{
[结构体]
}[;]
其中,特性是对结构特性的描述,是可选的。结构修饰符也是可选的,可以使用的修饰符与类修饰符完全相同。关键字struct和结构名是必需的。结构可以实现一个或多个接口,也是可选的;结构体(定义结构的代码块)是必需的,结构体的代码包括在一对大括号之间,结构体也可以为空。最后还可以添加一个分号,也是可选的。
结构都是从System.ValueType继承而来的,因此结构中都包含从类型System.ValueType继承而来的成员。与类一样,结构中可以包括数据成员(常量和字段)和函数成员(构造函数、属性、方法、索引器、接口、委托和事件)。
Demo.cs
using System;
using System.Collections.Generic;
struct Student
{
private int math;
public int Math
{
get { return math; }
set { math = value; }
}
public int Chinese;
public int English;
// student's name
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
//constructor
public Student(int math, int chinese, int english, string name)
{
this.math = math;
this.Chinese = chinese;
this.English = english;
this.name = name;
}
public double Average()
{
int sum = this.math + this.Chinese + this.English;
return sum / 3.0;
}
}
class StudentStructTest
{
static void Main(string[] args)
{
Student tom = new Student(80, 90, 85, "Tom");
double average = tom.Average();
Console.WriteLine("Average grade is {0}", average);
}
}
枚举
枚举类型(Enum Type)是一种特殊的值类型,用于声明一组命名的常量。使用枚举类型增加了程序的可读性和可维护性。这与使用常量来代替文本或数字的意思是相似的,另外,枚举是强类型的,可以避免类型错误。
枚举使用关键字enum来声明,形式如下:
[枚举修饰符] enum 枚举名
{
[枚举成员名]=[常量表达式]
}[;]
例如:
enum Week
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
枚举类型可以显式地声明byte、sbyte、short、ushort、int、uint、long、ulong类型作为对应的基础类型,默认的枚举声明意味着对应的基础类型是int
-
如果枚举成员是在枚举类型中声明的第一个枚举成员,则它的值为0
-
否则,美剧成员的关联值是通过将前一个枚举成员的值加1得到的。这样增加后的值必须在该基础类型的可表示范围内,否则会出现编译时错误。
例如:
enum Values
{
value1,
value2,
value3 = 30,
value4
}
其中,value1=0,value2=0,value3=30,value4=31。
把枚举转化成对应的基础类型需要做类型转换:
-
int a = (int)Week.Friday;