国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C#2.0新的語法擴(kuò)充(泛型,迭代器,匿名方法)

2019-11-18 16:51:01
字體:
供稿:網(wǎng)友

1.匿名方法

在C#1.0中典型的給一個(gè)委托添加一個(gè)方法調(diào)用代碼如下:
PRivate void ctrl_Click (object sender,EventArgs e)
txt.Click += new MyDelegate(ctrl_Click);
private ctrl_Click(object sender,EventArgs e)
{
 Message.Show(...);
}
哪怕只有這么一條語句也必須得按上面的形式給事件的調(diào)用列表添加方法,還得創(chuàng)建一個(gè)委托的實(shí)例

在C#2.0中引入了匿名方法,大大簡化了上述操作
可以改寫為
txt.Click += delegate {Message.Show();}
或是這樣:
txt.Click += ctrl_Click也是允許的.

C#編譯器對上述的定義自動隱式轉(zhuǎn)化,只要匿名方法和委托的定義兼容.
符合下列條件可以兼容
1.參數(shù)兼容
如果匿名方法沒有參數(shù),委托中沒有out參數(shù)
如果匿名方法和委托的參數(shù)在數(shù)量,類型,順序上都一致
2.返回值兼容
如果委托沒有返回值,匿名方法中也沒有返回值或匿名方法中只有return不帶返回值
如果兩者都有返回值,并且匿名方法的返回值可以隱式轉(zhuǎn)化為委托定義的類型

符合參數(shù)和返回值兼容的就可以使用匿名方法


匿名方法的捕獲變量(capture variable)

如果局部變量或參數(shù)的作用范圍內(nèi)包含匿名方法聲明,則該局部變量或參數(shù)稱為該匿名方法的外部變量或捕獲變量

public void method1(bool enabled)
{
 string b;
 this.txt.Click += delegate
 {
  this.txt.enabled = enabled;
  this.txt.Text = b;
 }
}

對于這個(gè)匿名方法來說:參數(shù)enabled和變量a是它的捕獲變量或叫外部變量.
捕獲變量的生命周期直到此匿名方法的資源被回收而結(jié)束


2.泛型
關(guān)于泛型的定義及如何使用網(wǎng)上資料已經(jīng)很多,請參見MSDN


3.迭代器(iterators)

在C#1.0中若想要使得類型成為可枚舉的類型(即象使用數(shù)組一樣用foreach一樣枚舉數(shù)組中的成員),那么這個(gè)類中必須實(shí)現(xiàn)IEnumerable接口的GetEnumerator()方法返回IEnumerator
public IEnumerator GetEnumerator()
{..}
一般來說實(shí)現(xiàn)GetEnumerator是不容易的.

在C#2.0中引入了的新的語法擴(kuò)充:迭代器,它能夠很好的簡單方便的讓我們實(shí)現(xiàn)GetEnumerator()方法
如:
public IEnumerator GetEnumerator()
{
 for ( int i = 0; i < 10; i ++)
 {
  yield return i;
 }
}

假設(shè)類Class1中實(shí)現(xiàn)了上述的GetEnumertor方法
那我們就可以用foreach對類Class1進(jìn)行枚舉
Class1 c = new Class1;
foreach ( int i in c)
{
 Console.WriteLine(i);
}

yield return產(chǎn)生迭代的下一個(gè)值,yield break說明迭代完成,用迭代器實(shí)現(xiàn)就是這么簡單.

定義和使用命名迭代器

     class Class1
    {
        public IEnumerator GetEnumerator()
        {
            for (int i = 0; i < 10; i++)
            {
                yield return i;
            }
        }

        // 定義一個(gè)命名的迭代器,并可以提供參數(shù)
        public IEnumerable MaxToMin(int min, int max)
        {
            for (int i = max; i >= min; i--)
            {
                yield return i;
            }
        }

        // 定義一個(gè)迭代器類型的屬性,
        public IEnumerable MinToMax
        {
            // this表示該類實(shí)例,因?yàn)樵擃悓?shí)現(xiàn)了GetEnumerator(),它是可枚舉的
            get { yield return this; }
        }

        public IEnumerable GetDescriptions()
        {
            yield return "this is my test";
            yield return "class name is class1";
            yield return "ktgu";
        }
    }

         static void Main(string[] args)
        {
           
            Class1 c = new Class1();

            foreach (int i in c)
            {
                Console.WriteLine(i);
            }

            foreach (int i in c.MaxToMin(1, 10))
            {
                Console.WriteLine(i);
            }

            foreach (int i in c.MinToMax)
            {
                Console.WriteLine(i);
            }

            foreach (string s in c.GetDescriptions())
            {
                Console.WriteLine(s);
            }
      }

4.不完整代碼
C#2.0中引入了一個(gè)"不全代碼"的概念,即你可以將一個(gè)類的定義放在別的文件中.這樣給大項(xiàng)目,大文件的維護(hù)帶來方便.
聲明:
[modifiers] partial type
modifier: [public/private/protected/internal] abstract new override static virtual extern
type:類/結(jié)構(gòu)/接口


以上主要是偏向于介紹如何快速的應(yīng)用這些新的語法點(diǎn),詳細(xì)概念及要領(lǐng)請參見MSDN
http://www.survivalescaperooms.com/ktgu/archive/2006/11/29/576368.html


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 勃利县| 北碚区| 古浪县| 抚顺县| 长沙市| 治多县| 星座| 忻州市| 中卫市| 剑阁县| 舟山市| 大邑县| 正定县| 望城县| 许昌县| 遵义市| 陈巴尔虎旗| 巫溪县| 田阳县| 桓仁| 新津县| 察哈| 依兰县| 塘沽区| 滨海县| 高台县| 普宁市| 泰来县| 灌南县| 垫江县| 北宁市| 阿克陶县| 东海县| 侯马市| 偏关县| 日土县| 蚌埠市| 东至县| 祁东县| 格尔木市| 景东|