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);

}

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

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