概述
C#有一些与其他语言C++Java不同的特性这里特别记一下,他们大部分基本的内容是相同的。
C#有属性索引器,委托事件,泛型集合,trycatchfinally异常捕捉
属性Property
属性时一种很像字段的方法,他有getset访问器,使用它可以有限制的访问私有字段。
e.g. 声明私有字段private float age,这是一个私有字段年龄,按照规范,你应该定义一个公开的属性Age,与age同名但是首字母大写,public float Age{get{return age;}set{age = value}},系统并不会识别同名,定义其他名字也是可以的。
属性有点像方法他有方法体,但是又有点不像方法,因为他没有括号。
当你不想写结构体时候,可以空着 public float Age{get;set;},你甚至可以省略定义私有字段,但是这样让属性显得无意义(我现在是这样觉得的,说不定以后会发现这样做的好处)。
当你只写了get,那这个属性就是只读类型,同样也可以只写set,就是只写类型。
索引器Indexer
索引器是加强版的属性,它可以通过索引访问类中元素,他访问的元素往往类中数组或集合的元素。
他的写法也很狂野 public string this[int index]{get;set;} ,使用this做自己的方法名足以见他很自负。
当类中有数组和集合,你不能使用属性去访问了,因为属性不能传入参数,但是索引器可以传入参数,这里index未必是int,它可以是任意类型,同样返回值也可以是任意类型。当你类中有多个不同的数组要访问,但你不能定义不同名字的索引器,你就需要控制参数和返回值来访问不同数组。
委托DELEGATE
委托是一种引用类型变量,他有点像C++指针,他指向某个方法,以此实现回调方法和事件。
委托写法非常奇特,它可以在任何位置声明类里,类外,命名空间外也可,定义一个委托相当于定义一个新类,所有可以定义类的地方都可以定义委托。
//声明,这里的意思是他可以引用一个参数为int,返回值为int的方法。
delegate int NumberChanger(int n);
// 创建委托实例,只看上面你可能会觉得括号里应该填int,但是实际上是填入方法名,而且这个方法名不是任何数据类型,不是string,不能用" "修饰。
NumberChanger nc1 = new NumberChanger(AddNum);
// 使用委托对象调用方法,当你调用的时候你会在括号写一个int作为传入参数。
nc1(25);
有了委托之后,方法引用就可以像一般的参数一样传来传去,他是很多设计模式实现的必要条件如发布订阅者模式。
委托的多播(Multicasting of a Delegate)
你可以使用+操作符和-操作符,在同一个委托名下添加多个引用函数,从而实现多播
// 创建委托实例
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;
// 调用多播,按次序执行多个委托
nc(5);
类外静态方法需要:类名.方法名,类外普通方法需要:对象名.方法名
创建和添加可以直接写方法名
NumberChanger nc = AddNum;
nc += MultNum;
委托也可写成数组和类一样
NumberChanger[] nc1 = new NumberChanger[] {AddNum,MultNum};
委托可以作为参数或返回值。
委托实现发布和订阅者模式。
发布者决定何时调用方法,而订阅者泽决定方法内容,方法的定义和调用完全分离了。
在交通灯案例中,红绿灯是发布者,而不同的车辆时订阅者。
红绿灯拥有一个委托,这个委托中添加了车辆们对红绿灯变化的反应,而红绿灯会在切换时启动委托。
这时红绿灯拥有了调用方法权力,没有定义方法权力;想法车辆们可以定义方法,却不能决定何时调用方法。
有些车辆想闯红灯,红绿灯只能播报进行的自己委托,并不能控制闯红灯。
得益于+-操作,红绿灯可以轻易添加进入路口的车辆,删除离开路口的车辆。
事件EVENT
事件是专为发布订阅者模式设计的严格版本的委托,event关键字用来修饰委托名。
//定义一个委托(你要明白:这个委托类型就是事件处理程序的函数类型)
public delegate void delegateRun();
//定义一个事件
//事件的声明与之前委托变量delegate1的声明唯一的区别是多了一个event关键字,且委托写“()”,事件不需要
public event delegateRun eventRun;
事件是一种类型安全的委托,可以类比属性和字段,属性是对字段的封装,其实 事件也就是封装了一个委托。
事件更加严格:
1、事件只能同“+=”和“-=”来绑定方(在事件中这个方法叫事件的处理程序,其实这这种绑定方法就是多播委托的绑定方法
2、只能在类的内部调用(触发)事件,但是委托就可以在类外调用函数那样调用。
Func & Action
委托使用前都要定义public delegate void delegateRun();
为了更加方便使用委托,微软提供两个声明好的委托:Action 和 Func
Action是返回值为void的委托,使用时不定义委托,直接写
Action<string> BookAction = new Action<string>(Book); //尖括号的string为参数类型,Book函数名
Func为返回值不为void的委托
Func<string,string> RetBook = new Func<string,string>(FuncBook);//尖括号前面为参数类型,最后一位为返回值。如果只有一个string,则为空参数,返回值为string的委托
Lambda表达式
一种装B的写法,你可以这样写一个函数
static double Multiply(double p1,double p2) => p1*p2;
匿名方法
委托调用方法使用方法名查找。对于简单的方法,在使用委托时候直接定义一个无类,也无方法名的方法,简单便捷易读。
// 实例化委托对象
VoteDelegate votedelegate = new VoteDelegate(new Friend().Vote);
// 使用匿名方法的代码
// 匿名方法内联了一个委托实例(可以对照上面的委托实例化的代码来理解)
// 使用匿名方法后,我们就不需要定义一个Friend类以及单独定义一个投票方法
// 这样就可以减少代码量,代码少了,阅读起来就容易多了,以至于不会让过多的回调方法的定义而弄糊涂了
VoteDelegate votedelegate = delegate(string nickname)
{
Console.WriteLine("昵称为:{0} 来帮Learning Hard投票了", nickname);
};
// 通过调用托来回调Vote()方法
votedelegate("SomeBody");
Lambda表达式结合匿名方法可以这样写
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25
最后
以上就是酷炫金针菇为你收集整理的C#的笔记属性索引器,委托事件,泛型集合,异常捕捉的全部内容,希望文章能够帮你解决C#的笔记属性索引器,委托事件,泛型集合,异常捕捉所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复