CLR via C#(第3版)学习笔记

1、反射

//获取对应的类型,需要为完整的类型名
Type t = Type.GetType("ConApp.Person");
//创建该类型的具体实例,第二个参数根据不同的构造函数而定
object obj = Activator.CreateInstance(t, new object[] { 2, "Li Ming" });
//搜索指定名称的方法,第二个参数由要调用的方法的参数个数来决定,如无参数则new Type[]{}
MethodInfo mi = t.GetMethod("GetName",new Type[]{typeof(int)});
//执行对应的方法,如果是静态方法,obj必须为null
object result = mi.Invoke(obj, new object[] { 3 });

2、ref和out

//ref和out都是传递参数的地址,而不是传递参数本身
//ref必须先初始化,out不需要先初始化,但在方法内必须初始化
//允许ref和out参数对方法进行重载,但同时只能存在一个

3、参数和返回类型的指导原则

//声明方法的参数类型时,应尽量指定最弱的类型,
//最好是接口而不是基类。最好用接口IEnumerable<T>,
//而不要用List<T>或者更强的接口类型ICollection<T>或IList<T>
//好,该方法使用一个弱参数类型
public void ManipulateItems<T>(IEnumerable<T> collection)
{ }
//不好,该方法使用一个强参数类型
public void ManipulateItems<T>(List<T> collection)
{ }
//第一个方法更加灵活,适用于更广泛的情形
//参数使用若参数类型,返回类型最好为最强的类型(以免受限于特定的类型)

4、事件

//第一步:定义类型来容纳所有需要发送给事件通知接收者的附加信息
class NewMailEventArgs : EventArgs
{
	private readonly string _from, _to, _subject, _content;

	public NewMailEventArgs(string from, string to, string subject, string content)
	{
		_from = from;
		_to = to;
		_subject = subject;
		_content = content;
	}

	public string From { get { return _from; } }
	public string To { get { return _to; } }
	public string Subject { get { return _subject; } }
	public string Content { get { return _content; } }
}

class MailManager
{ 
	//第二步:定义事件成员
	public event EventHandler<NewMailEventArgs> NewMail;

	//第三步:定义一个负责引发事件的方法,它通知已登记的对象
	//事件已经发生。如果类是密封的,这个方法要声明为私有和非虚
	protected virtual void OnNewMail(NewMailEventArgs e)
	{ 
		//出于线程安全的考虑,现在将对委托字段的引用复制到一个临时字段中
		EventHandler<NewMailEventArgs> temp = Interlocked.CompareExchange(ref NewMail, null, null);
		//任何方法登记了对事件的关注,就通知它们
		if (temp != null)
		{
			temp(this, e);
		}
	}

	//第四步:定义一个方法,将输入转化为期望事件
	public void SimulateNewMail(string from, string to, string subject, string content)
	{ 
		//构造一个对象来容纳想传给通知接收者的信息
		NewMailEventArgs e = new NewMailEventArgs(from, to, subject, content);

		//调用虚方法通知对象已发生,
		//如果没有类型重写该方法,我们的对象将通知事件的所有登记对象
		OnNewMail(e);
	}
}

sealed class Fax
{
	//将MailManager对象传递给构造器
	public Fax(MailManager mm)
	{ 
		//构造EventHandler<NewMailEventArgs>委托的一个实例
		//使它引用我们的FaxMsg回调方法
		//向MailManager的NewMail事件登记我们的回调方法
		mm.NewMail+=FaxMsg;
	}

	//新电子邮件到达时,MailManager将调用这个方法
	private void FaxMsg(Object sender, NewMailEventArgs e)
	{
		//'sender'表示MailManager对象,便于将信息传回给它
		//'e'表示MailManager对象想传给我们的附加事件信息
		Console.WriteLine("Faxing mail message:");
		Console.WriteLine("From={0},To={1},Subject={2},Content={3}",e.From,e.To,e.Subject,e.Content);
	}

	//执行这个方法,Fax对象将向NewMail事件取消自己对它的关注
	public void UnRegister(MailManager mm)
	{
		mm.NewMail -= FaxMsg;
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值