C#的笔记属性索引器,委托事件,泛型集合,异常捕捉

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 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值