類的轉換
- 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;