Posts Tagged ‘myNote

星期三 十二月 16, 2009 23:28

cSharp动态调用和反射的一个绝佳例子

之前看反射那一章,真把个人看郁闷了。不巧的是,看到很多业内人士的专业博客说,不会这个也搞了几年的项目开发。哎。顿时打消了学习这个知识的念头。不过,挺巧的是,今天又遇到了一个讲这个内容的章节,只不过内容更具体了。
这样一个动态调用的程序,貌似实现了一个编译器的功能。在Textbox里写上代码,能在程序下方看到编译结果。有趣的是,当代码出错的时候,能在程序中看到错误信息:

//核心代码
public string ComplieAndRun(string input,out bool hasError)
{
CompilerResults cResults = null;
string returnData = null;
[...]

星期六 十二月 12, 2009 19:00

cSharp中异常处理的笔记

停了几天的笔记。感觉学习的内容要么像反射(Reflection in .net framework)一样高深,想写点笔记却怎么也写不上;要么学习的内容(像集合、泛型,泛型集合、Language Integrated Querry)太细太杂,可写的太多,想记都记不过来。看到了.net 中的异常处理,总算,让我开始有点想法了。我总结了下面的几个问题:
1.执行多个catch 块,讲究一个顺序:从最特殊到最一般。下面的代码是我写的一个demo,模拟了3种异常:一种是用户的输入超过了规定值后,抛出了一个IndexOutOfRangeException,另一种是很普适的System.Exception,最后一种是不带参数的catch,它可以处理非托管堆上的代码异常(包括非c# 的代码)。以这样的顺序布局,才能够细致的捕获到各个可能出现的问题。但,如果将System.Exception 的catch 放到最前面,编译器就会报错:“上一个 catch 子句已经捕获了此类型或超类型(“System.Exception”)的所有异常”,因为IndexOutOfRangeException是从System.Exception 里继承过来的。当然要体会这样布局的真正优势,需要一些彪悍的异常处理方法,而不是一个简单的Writeline().
错误 1 上一个 catch 子句已经捕获了此类型或超类型(“System.Exception”)的所有异常 H:\vsProject\Lab\learningLab\learningLab\Programe.cs 28 20 learningLab
public static void Main()
{
int aNum;
[...]

星期三 十二月 2, 2009 18:03

cSharp中委托和事件的学习笔记

运算符重载那一章的内容,等整理完了再稍后奉上。首先,让我趁热打铁的把委托和事件的笔记写完。不得不说,看到这里,觉得《Professional C#2008》这本书写的够烂的了。一个排序比较的例子,从接口那一章用到了委托,实在有点牵强,虽然一个比较算法用委托来定义是有效的,但把一个比较的能力看做是一个对象所拥有的属性更为恰当。当然,作者这样安排书的内容,无疑让我们可以看到:接口和委托都是允许类设计器分离声明和实现的。那么什么时候该用委托,什么时候该用接口呢?下面给出微软的一些我觉得还不错的建议。
以下几种情况比较适合委托:

当使用事件设计模式时;
当封装静态方式调用时;
当需要一个方法的多个实现时;(多播委托)
当调用一个实例方法而它不需要使用该实例的其他属性,方法,字段时;(独立性)

以下情况比较适合接口:

当方法和类型的能力挂钩时;(如类的自我比较能力IComparable)
当有一组可能被调用的相关方法时;(它们可能参数类型各不相同)
当类只需要方法的单个实现时;

委托从来不是一个重点,但委托,总是和事件联系紧密,再提到事件之前,必须要对他进行一个小小的知识梳理和补充。
委托:

委托实现了类似于c++ 中的函数指针,它包含的只是方法的地址,它可以将方法作为参数进行传递,它很安全
委托在c#2.0中使用了委托推断(允许不用new了),实现了匿名方法,在c#3.0中加入了Lambda 表达式,利用它们可以更简练地编写内联代码块
多播委托,其签名必须返回为void,否则就只能得到最后一个方法的结果
多播委托中,一个方法抛出异常,整个迭代会被终止;使用GetInvocationList(),来进行手动迭代
协变是允许方法的返回类型为派生类;抗变是运行方法的参数类型为派生类

谈完了委托,现在该来说说我们关心的事件。

事件的发行者决定什么时候引发事件,而订户决定怎么来响应事件;
一个事件可以有多个订户,一个订户可以响应多个事件;
一个事件可以引发多个订户同时响应,事件可以同步线程(当然也可以异步调用);
没有订户的事件永远不会发生

在编写代码的过程中,实现一个事件,会遇到下面的几个层次:

订阅和取消
实现符合.net Framework 标准的事件(EventHandler& EventArgs)
实现继承关系中的事件设计
实现接口关系中的事件设计
在字典中实现事件的设计(暂未接触字典方面的知识)

下面,我想给出一个自己写的继承关系中的事件设计demo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace learningLab
{
class growUPEventArgs:EventArgs
{
public string Message {get;set;}
public growUPEventArgs(string message)
{
[...]

星期天 十一月 29, 2009 13:01

cSharp数组的学习笔记

这一章主要是2对接口的辨析让人纠结。不过,我们还是一对一对的来看,首先将要出场的是IEnumerable Vs IEnumerator.
IEnumerable 接口中需要实现一个GetEnumerator()方法,它返回一个IEnumerator 接口。在IEnumerator 中有MoveNext()  方法和Reset() 方法,另外还有一个current 属性。这是他们之间的关系。
值得注意的是,不论是否声明继承了接口,在指定类中实现了一个返回IEnumerator 的方法,就可以手动的通过上述的这2个方法和1个属性,进行迭代了;同样的,不论是否有显式的声明,实现了一个返回IEnumerable 的方法,就可以通过foreach 进行迭代了。下面是我推荐的一个Demo:

static void Main(string[] args)
{
testClass myTest = new testClass();
[...]

calendar

2010年八月
« 七    
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

最近评论