日期:2008-6-13
學習內容:C#中各種數據類型的使用
遺留問題:
學習總結:
值類型和引用類型:
值類型:整型,布爾型,字符型,實型,結構型,枚舉行
引用類型:類,對象,字符串,數組,接口,委託
1. 值類型
示例程序:
using System;
namespace ConsoleApplication1
{
class Program
{
public struct Student
{
public int Class;//班級
public String Specialy;//專業
}
enum WeekDay
{
Mon=1,
Tue,
Wen,
Thu,
Fri,
Sat,
sun
}
static void Main (string[] args)
{
//整型
int Num = 9;
//布爾型
bool b = true;
//字符型
String str = "我四";
Char s = '1';
//實數類型
float a = 99.9f ;
//結構類型
Student June;
Student Mike=new Student();
Mike.Class = 1;
Mike.Specialy = "MBA";
June = Mike;
//枚舉類型
WeekDay tody=WeekDay.Fri;
Console.WriteLine("{0}",Num);
Console.WriteLine("{0}",b);
Console.WriteLine("{0}",str);
Console.WriteLine("{0}",s);
Console.WriteLine("{0}",a);
Console.WriteLine("June的班級是{0},專業是{1}",June.Class,June.Specialy);
Console.WriteLine("今天是星期{0}",(int)tody);
}
}
}
需要注意到的知識點:
例如:99.9默認的是double型,要想把它聲明爲float型,需在99.9結尾+上”f”或”F”
在結構類型中,他的引用方法和類的使用方法很相近,必須先new一個結構體的實例,然後再用這個事例調用結構體的方法併爲其賦值,一個結構體的對象能給另外一個結構體的對象賦值
枚舉類型不用new直接使用,注意類型中的第一個數據是從0號單元開始的
2.引用類型:
事例代碼:
using System;
namespace ConsoleApplication2
{
//class Main
//{
// public void GetString()
// {
// Console.WriteLine("歡迎來到c#的世界!");
// }
//}
//class A:Main
//{ }
//class B:Main
//{ }
interface IGetString
{
String GetString();
}
class A : IGetString
{
public string GetString()
{
return"類A";
}
}
public class B : IGetString
{
public string GetString()
{
return "類B";
}
}
class Program
{
static void Main (string[] args)
{
//字符串
string src = @"D:\我的文擋\program.cs";
char aaa=src[1];
Console.WriteLine("{0}",src);
Console.WriteLine("{0}",aaa);
//數組
String[] name ={ "張三", "王五" };
for (int i = 0; i < name.Length; i++)
{
Console.WriteLine("{0}",name[i]);
}
//聲明類的實例
A a = new A();
B b = new B();
//聲明接口的示例ia,ib
IGetString ia = (IGetString)a;
IGetString ib = (IGetString)b;
Console.WriteLine("{0}",ia.GetString());
Console.WriteLine("{0}", ib.GetString());
//a.GetString();
//b.GetString();
}
}
}
注意接口的繼承和類的繼承的方法,及他們的優缺點,接口一般在擴充系統的功能和開發組件的時候使用
值類型和引用類型的區別:
類型區分爲這兩大類的主要原因是在於執行性能與內存資源管理的不同。由於值類型變量直接在堆棧中存儲該類型的值,此類類型在內存的使用上以及訪問的效能上比引用類型更好。因爲引用類型變量存放的是指向實際對象的指針,因此訪問對象時必須多進行一次內存引用的操作方可獲得數據。且引用類型的對象必須分配多餘的內存來存放虛函數指針及線程同步塊,對於內存的需求較大。而使用引用類型的優點是回收站會自動替您管理分配在託管堆當中的內存。
委託實力:
using System;
namespace ConsoleApplication3
{
class Program
{ //委託
delegate string GetSting(string nameOne,string nameTwo);
static string mainName(string nameOne,string nameTwo)
{
return nameOne+"和"+nameTwo;
}
static void Main (string[] args)
{
string a = "張三";
string b = "王五";
GetSting getName = new GetSting(mainName);
Console.WriteLine("今天的同學是:{0},",getName(a,b));
}
}
}
委託是一種引用方法的類型。一旦爲委託分配了方法,委託將與該方法具有完全相同的行爲。委託方法的使用可以像其他任何方法一樣,具有參數和返回值,如下面的示例所示:
C#
public delegate int PerformCalculation(int x, int y);
與委託的簽名(由返回類型和參數組成)匹配的任何方法都可以分配給該委託。
委託具有以下特點:
- 委託類似於 C++ 函數指針,但它是類型安全的。
- 委託允許將方法作爲參數進行傳遞。
- 委託可用於定義回調方法。
- 委託可以鏈接在一起;例如,可以對一個事件調用多個方法。
- 方法不需要與委託簽名精確匹配。
使用委託
委託是一種安全地封裝方法的類型,它與 C 和 C++ 中的函數指針類似。與 C 中的函數指針不同,委託是面向對象的、類型安全的和保險的。委託的類型由委託的名稱定義。下面的示例聲明瞭一個名爲 Del 的委託,該委託可以封裝一個採用字符串作爲參數並返回 void的方法。
C#
public delegate void Del (string message);
構造委託對象時,通常提供委託將包裝的方法的名稱或使用匿名方法。實例化委託後,委託將把對它進行的方法調用傳遞給方法。調用方傳遞給委託的參數被傳遞給方法,來自方法的返回值(如果有)由委託返回給調用方。這被稱爲調用委託。可以將一個實例化的委託視爲被包裝的方法本身來調用該委託。例如:
C#
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}
C#
// Instantiate the delegate.
Del handler = DelegateMethod;
// Call the delegate.
handler("Hello World");
// Call the delegate.
handler("Hello World");
由於實例化委託是一個對象,所以可以將其作爲參數進行傳遞,也可以將其賦值給屬性。這樣,方法便可以將一個委託作爲參數來接受,並且以後可以調用該委託。
何時使用委託而不使用接口
委託和接口都允許類設計器分離類型聲明和實現。給定的接口可由任何類或結構繼承和實現;可以爲任何類中的方法創建委託,前提是該方法符合委託的方法簽名。接口引用或委託可由不瞭解實現該接口或委託方法的類的對象使用。既然存在這些相似性,那麼類設計器何時應使用委託,何時又該使用接口呢?
在以下情況中使用委託:
- 當使用事件設計模式時。
- 當封裝靜態方法可取時。
- 當調用方不需要訪問實現該方法的對象中的其他屬性、方法或接口時。
- 需要方便的組合。
- 當類可能需要該方法的多個實現時。
在以下情況中使用接口:
- 當存在一組可能被調用的相關方法時。
- 當類只需要方法的單個實現時。
- 當使用接口的類想要將該接口強制轉換爲其他接口或類類型時。
- 當正在實現的方法鏈接到類的類型或標識時:例如比較方法。
如何:合併委託(多路廣播委託)
本示例演示如何組合多路廣播委託。委託對象的一個用途在於,可以使用 + 運算符將它們分配給一個要成爲多路廣播委託的委託實例。組合的委託可調用組成它的那兩個委託。只有相同類型的委託纔可以組合。
- 運算符可用來從組合的委託移除組件委託。
示例
C#
delegate void Del(string s);
class TestClass
{
static void Hello(string s)
{
System.Console.WriteLine(" Hello, {0}!", s);
}
static void Goodbye(string s)
{
System.Console.WriteLine(" Goodbye, {0}!", s);
}
static void Main()
{
Del a, b, c, d;
// Create the delegate object a that references
// the method Hello:
a = Hello;
// Create the delegate object b that references
// the method Goodbye:
b = Goodbye;
// The two delegates, a and b, are composed to form c:
c = a + b;
// Remove a from the composed delegate, leaving d,
// which calls only the method Goodbye:
d = c - a;
System.Console.WriteLine("Invoking delegate a:");
a("A");
System.Console.WriteLine("Invoking delegate b:");
b("B");
System.Console.WriteLine("Invoking delegate c:");
c("C");
System.Console.WriteLine("Invoking delegate d:");
d("D");
}
class TestClass
{
static void Hello(string s)
{
System.Console.WriteLine(" Hello, {0}!", s);
}
static void Goodbye(string s)
{
System.Console.WriteLine(" Goodbye, {0}!", s);
}
static void Main()
{
Del a, b, c, d;
// Create the delegate object a that references
// the method Hello:
a = Hello;
// Create the delegate object b that references
// the method Goodbye:
b = Goodbye;
// The two delegates, a and b, are composed to form c:
c = a + b;
// Remove a from the composed delegate, leaving d,
// which calls only the method Goodbye:
d = c - a;
System.Console.WriteLine("Invoking delegate a:");
a("A");
System.Console.WriteLine("Invoking delegate b:");
b("B");
System.Console.WriteLine("Invoking delegate c:");
c("C");
System.Console.WriteLine("Invoking delegate d:");
d("D");
}