其實C#的進階特性,我覺得不能叫做進階特性
我覺得吧,C#的基本文法如果是必須要掌握的話
那麼這個所謂的進階特性其實也就是所謂的
C#這門語言的特色之處,它和其他語言的區別所在的地方
不能叫做進階特性,按照我的想法,這個才應該算是真正的C#語言
之前的那些只能是編程基礎而已
一開始就被這個“進階特性”這四個字嚇到了,以至於我跳過這個所謂的進階特性往下看
然後鼓起勇氣看這個“進階特性”的時候,才發現,根本也不進階到哪裡去嘛
C#語言有四個精髓之處,其實也就三個,再化簡下來,其實也就兩個
1.泛型
2.泛型集合
3.委託
4.事件
泛型 說來也簡單,其實也就是 模板
例子: 求數在數組中的位置 (泛型版本)
static void Main()
{ int[] nums = { 12, 21, 31, 90, 102 };
int i = index(nums,90);
string[] words = { "sg","vnd"};
i = index(words , "sg");
}
static int index<T> (T[] a ,T value )
{
for(int i = 0; i < a.lenght ; i++)
{
if (a[i].Equals(value))
return i;
}
return -1;
}
可以看出,泛型其實也就是模板在C # 中的叫法而已,實現的時候只需要加一個 <T> 就可以使用泛型了
這個比之前在C/C++版本中,方便了不少
泛型集合,所謂集合其實就是相同類型的一組泛型,其實也可以叫做容器,因為它的英文是collection
泛型集合的目的就是對一組相同類型的對象進行儲存並操作
泛型列表 —— List <T> 可增長的動態模板數組 ,通過泛型列表來添加對象
在泛型列表中,其實也可以叫做泛型類表,這個List <T>其實就是一個類
這裡類裡,
屬性:
Capacity : 設定當前最大容量
Count : 當前列表中元素個數
方法:
public void Add(T item); 添加列表元素到列表末尾
public void Sort(); 排序
public int IndexOf(T item);插入
public bool Remove(T item);刪除
方法還有重載的不同版本
下面是從cen123搜羅來的代碼,我覺得他說得很好,要是想進一步瞭解的話,我覺得不防去看看他那篇文章
-----------------------------分割線-----------------------------------
怎樣建立泛型集合?
主要利用System.Collections.Generic命名空間下面的List泛型類建立集合,文法如下:
List<T> ListOfT = new List<T>();
其中的"T"就是所要使用的類型,既可以是簡單類型,如string、int,也可以是使用者自訂類型。下面看一個具體例子。
定義Person類如下:
class Person
{
private string _name; //姓名
private int _age; //年齡
//建立Person對象
public Person(string Name, int Age)
{
this._name= Name;
this._age = Age;
}
//姓名
public string Name
{
get { return _name; }
}
//年齡
public int Age
{
get { return _age; }
}
}
//建立Person對象
Person p1 = new Person("張三", 30);
Person p2 = new Person("李四", 20);
Person p3 = new Person("王五", 50);
//建立類型為Person的對象集合
List<Person> persons = new List<Person>();
//將Person對象放入集合
persons.Add(p1);
persons.Add(p2);
persons.Add(p3);
//輸出第2個人的姓名
Console.Write(persons[1].Name);
可以看到,泛型集合大大簡化了集合的實現代碼,通過它,可以輕鬆建立指定類型的集合。非但如此,泛型集合還提供了更加強大的功能,下面看看其中的排序及搜尋。
泛型集合的排序
排序基於比較,要排序,首先要比較。比如有兩個數1、2,要對他們排序,首先就要比較這兩個數,根據比較結果來排序。如果要比較的是對象,情況就要複雜一點,比如對Person對象進行比較,則既可以按姓名進行比較,也可以按年齡進行比較,這就需要確定比較規則。一個對象可以有多個比較規則,但只能有一個預設規則,預設規則放在定義該對象的類中。預設比較規則在CompareTo方法中定義,該方法屬於IComparable<T>泛型介面。請看下面的代碼:
class Person :IComparable<Person>
{
//按年齡比較
public int CompareTo(Person p)
{
return this.Age - p.Age;
}
}
CompareTo方法的參數為要與之進行比較的另一個同類型對象,傳回值為int類型,如果傳回值大於0,表示第一個對象大於第二個對象,如果傳回值小於0,表示第一個對象小於第二個對象,如果返回0,則兩個對象相等。
定義好預設比較規則後,就可以通過不帶參數的Sort方法對集合進行排序,如下所示:
//按照預設規則對集合進行排序
persons.Sort();
//輸出所有人姓名
foreach (Person p in persons)
{
Console.WriteLine(p.Name); //輸出次序為"李四"、"張三"、"王五"
}
-----------------------------------------------------------------------
下面來講一講委託 ,委託是一個類型,它用來封裝方法 目的是,實現把方法作為一個參數來傳遞
委託是從system.Delegate類派生的類
//聲明委託: 和聲明方法類似,但是多一個delegate關鍵字
如:
在class Program外層定義委託
delegate void Delegateone();
delegate double Delegatetwo(double r,double t);
在program內部寫出與Main()並排的函數
static double add(double a, double b)
{
return a + b;
}
static void printStar()
{
for (int i = 0; i < 5; i++)
{ System.Console.WriteLine("***************"); }
}
static void printLine()
{
for (int i = 0; i < 5; i++)
{ System.Console.WriteLine("----------------"); }
}
在Main函數中使用委託
//注意:委託傳遞的是ta的名稱,而不是ta的調用,千萬不能加括弧
//委託裡面放的是方法的地址,調用委託就是依次調用委託中方法的地址
Delegateone di = new Delegateone(printStar);
di();//調用委託,相當於 printStar
//+= 也是傳遞的名稱,而不是方法的調用
di += printLine;
di();//調用委託,相當於 printStar, printLine
double a = 0.2;
double b = 0.3;
double r;
Delegatetwo d2 = new Delegatetwo(add);
r = d2(a,b); //委託 調用 含有參數的方法
其實委託的作用就是,更方便的調用方法,或者說是依次調用方法,或者是,把同一個方法調用多次
但是,據說委託的真正意義不僅僅是這樣,而是配合著事件來使用的。
那麼,下面就介紹什麼是事件
事件是在委託的基礎上,記住,是在委託的基礎上
事件具有不確定性發生的函數
例如: 按鈕有一個單擊的事件,什麼時候發生這個事件軟體不知道,但是,事件發生了之後軟體就依次執行事件裡面的方法
//聲明事件的文法
public event 委託類型 事件名稱;
/*
* 事件
* 例: 體重改變事件
* 建立一個woman類,有名稱,年齡,體重三個屬性
* 體重發生變化時,出發事件getFatter/getThinner
* 訂閱事件 用+=
*/
delegate void WeightChange(double newWeight);
class woman
{
public string Name { set; get; }
public int Age { get; set; }
//public double Weight { get; set; }
private double w;
//定義了兩個事件,分別在當人的體重變輕和變重的時候出發這個事件
public double Weight
{
get { return w; }
set
{
if (w < value)
{
if (getFatter != null)
getFatter(value);
}
else if (w > value)
{
if (getFatter != null)
getThinner(value);
}
w = value;
}
}
public event WeightChange getFatter;
public event WeightChange getThinner;
}
//定義函數
static void girl_getThinner(double newWeight)
{
System.Console.WriteLine("你變瘦了,現在的體重是{0}",newWeight);
System.Console.ReadLine();
}
static void girl_getFatter(double newWeight)
{
System.Console.WriteLine("你變胖了,現在的體重是{0}", newWeight);
System.Console.ReadLine();
}
//主函數
woman girl = new woman();
//事件處理常式
girl.getThinner += new WeightChange(girl_getThinner);
girl.getFatter += new WeightChange(girl_getFatter);
girl.Weight = 60;
//隨機數字
Random r = new Random();
for (int i = 0; i < 5; i++ )
{
girl.Weight = r.Next(45, 65);
}
大致就是這麼多了,今天累了,就這樣吧。
第一次學,不好的地方,請指正!