C# 高级特性

其实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);
            }

 

 

 

大致就是这么多了,今天累了,就这样吧。

第一次学,不好的地方,请指正!

posted @ 2012-03-28 22:19  喜欢阿亮的小水  阅读(993)  评论(0编辑  收藏  举报