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);
}
大致就是这么多了,今天累了,就这样吧。
第一次学,不好的地方,请指正!