摘要:在上一示例中,如果用户输入了一个不存在的文件夹,会直接抛异常,那么在异步中,如果出现异常了,是什么机制来处理的呢。由于发生异常的代码与调用代码位于同一个线程中,因此当异常发生时,计算机会中当前线程的执行流程,转去执行异常处理代码。如果异常是在异步调用的过程中抛出的,调用者线程与执行异步调用 的线程不是同一个,那又该怎样处理?1、当一个异步调用的方法抛出一个异常,CLR会捕获它,当启动异步调用的线程(称为调用者线程)调用 EndInvoke 方法等待异步调用线束时,CLR会将此异常再次抛出,这样,调用者线程即可捕获它。2、如果在调用BeginInvoke 方法启动异步调用时提供了一个回调方法,则
阅读全文
摘要:当程序启动一个异步调用之后,调用者线程必须有一种方法能知道此调用的执行情况,并且在这一调用执行完毕之后,取回执行结果。可以有以下二种方法:一、使用轮询现在我们来改造上一节的示例程序。我们可以在程序执行异步调用的过程中,让计算机每隔一段时间向控制台输出一个小点,告诉用户搜索工作正在进行中,从而可以大大改善程序的用户友好性。示例程序:namespace AsyncCalculateFolderSize2{ class Program { //计算指定文件夹的总容量 private static long CalculateFolderSize(string ...
阅读全文
摘要:上一节日记中,项目所展示的异步编程模式到底是怎么实现的?上一节代码中定义了一个委托:public delegate long CalculateFolderSizeDelegate(string FolderName);经过编译器,在编译上述委托语句时,会自动产生以下的类模板:public sealed class CalculateFolderSizeDelegate: System.MulticastDelegate{ public CalculateFolderSizeDelegate(Object target , int methodPtr){.......} publi...
阅读全文
摘要:.net 的异步编程技术主要分为两个块:1、使用IAsyncResult 的异步编程模式。2、基于事件的异步编程模式。C#编译器会为每个委托生成支持异步执行的 BeginInvoke / EndInvoke 方法,从而将委托和异步编程紧密联系起来了。当同步执行程序时,如果执行到需要执行较长时间的代码时,用户必须等待,也会认为程序已经卡死或死机了。同步程序的示例代码如下:namespace CalculateFolderSizeNoAsync{ class Program { //计算指定文件夹的总容量 private static long Calcul...
阅读全文
摘要:假设给我们一个泛型对象List<T>,T为int类型,要求我们使用该对象方法FindAll(Predicate<T> match)从中找出该List中的偶数,您如何实现? 说明一下:Predicate<T>是一个泛型委托,它的原型为public delegate bool Predicate<T>(T obj),该委托传入一个T类型对象,经逻辑判断后返回布尔值。委托 可能您首先想到的是用委托实现,实现方法如下: // 方法1 static void Method1(){ // 创建List<int>对象 List < int &
阅读全文
摘要:Predicate<T>委托在.NET类类库中经常出现,此委托的定义如下:public delegatebool Predicate<T>(T obj);从其定义可以看到,此委托引用一个返回bool 值的方法,在实际开发中,通常使用Predicate<T>委托变量引用一个“判断条件函数”,在判断条件函数内部书写代码表明函数参数所引用的对象应满足的条件,条件满足时,函数返回true.在类库中,List<T> 里面的 Find方法, 定义如下:public T Find(Predicate<T> match);那么我们可以在外部定义一个查
阅读全文
摘要:为了方便开发,.net基类库针对在实际开发中最常用的情形提供了几个预定义好的委托,这些预定义委托用得很广。Func,Action 的介绍及其用法Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能。Action<T>和Func<T,TResult>的功能是一样的,只是Action<T>没有返类型,Func<T,T,Result>:有参数,有返回类型Action,则既没有返回也没有参数,Func<T
阅读全文
摘要:我们使用delegate关键字定义一个委托数据类型时,其实是定义了一个新类,此类派生自 MulticastDelegate,而 MulticastDelegate 又派生自 Delegate.我们定义:public delegate int MathOptDelegate(int value1 , int value2);C#编译器实际上是按照以下这个 “代码模板”进行编译的:public class MathOptDelegate : System.MulticastDelegate{ public MathOptDelegate(Object target , Int32 metho...
阅读全文
摘要:一、示例: 用户输入两个操作数,再选择运算方法(加减乘除),程序即可算出结果。这个示例的关键之处在于它使用委托在运行时动态地调用不同的方法。1、先定义一个CalculateDelegate类型的私有字段curOpt,它将引用完成不同计算任务的方法://声明委托类型 public delegate double CalculateDelegate(double x,double y); //当前操作类型 private CalculateDelegate curOpt;2、定义一个方法,可以接收一个委托: //完成计算工作 void DoCalcu...
阅读全文
摘要:在C#中,当出现某种异常时,就会创建一个异常对象。这个对象包含有助于跟踪问题的信息。我们可以创建自己的异常类,但.NET已经提供了许多预定义的异常类异常类ExceptionSystemException 这个是由公共语言运行库引发的异常,派生于systemExecption类ApplicationException 由用户程序执行的异常,派生于ApplicationException类try-catch语句由一个try块后跟一个或多个catch子句构成在catch块中可以使用throw语句再次引发已由catch语句捕获异常throw语句用于发出在程序执行期间出现反常情况(异常)的信息。引发的异
阅读全文
摘要:CLR 有一个 垃圾收集GC 机制,可以管理内存分配和回收等工作,在绝大多数情况下,程序员只需要new 一个对象,而将销毁这一对象的工作完全交给CLR代劳。但是,我们所编写的类中使用了非托管的资源,比如文件句柄,用于线程同步的Mutex对象,或者是数据库连接,这些资源应该遵循“即需即建即销毁”的原则,这就是说:需要的时候才创建这些对象,用完之后就马上销毁。析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用dele
阅读全文
摘要:可以在资源中创建.net基类库中现有类型(或用户项目中的自定义类型)的对象,当程序运行时会自动实例化它们。示例:先创建一个Student类。public class Student { public string Name { get; set; } public bool IsFemale { get; set; } public override string ToString() { ...
阅读全文
摘要:首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了,比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中我只有一个打印程序的实例。简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。 下面来看单例模式的结构图(图太简单了)从上面的类图中可以看出,在单例类中有一个构造函数 Singleton ,但是这个构造函数却是私有的(前面是“ - ”符号),然后在里面还公开了一个 GetInstan.
阅读全文
摘要:转自:http://www.cnblogs.com/024hi/archive/2010/02/02/unleash_dependencyproperty_in_silverlight.html在c#中--得益于c#3.0中的自动属性--我们可以十分轻松的通过如下代码创建一个叫做“AuthorName”的属性。public string AuthorName { get; set; } 上面的代码就是我们熟悉的CLR属性,我们可以很方便的读/取这个属性的值。不过在silverlight的世界中如果你想做更多更牛的事情,CLR属性就显得有些力不从心了。它们包括--动画、数据绑定、样式/模板等等。
阅读全文
摘要:在面向对象的“封装闭合性”开发原则中,一向提倡的是把独立的功能封装在一个类里面的!但从Visual Studio 2005开发,系统提供了一个分部类的开发方式一直受到争议,很多人认为把同一类的功能分布不同的文件中,是打破了“封装闭合原则”,一个类的功能变得难以管理,大多数人都是在无奈的情况下才使用到分部类的方式。但在winFrom类、页面类、DataSet里面你经常可以发现分部类的身影,当你用到Entity Framework的时候,你会发现每个映射生成的对象都是使用分部类的方式生成的,分部类似乎早已派上用场。分部类究竟有什么好处,下面为大家一一揭露。一、分部类根据微软的定义,分部类就是“将类
阅读全文
摘要:转自:http://www.cnblogs.com/yukaizhao/archive/2010/05/24/csharp-40-dynamic-optional-argument.html1.dynamic ExpandoObject熟悉js的朋友都知道js可以这么写 :?123var t = new Object(); t.Abc = ‘something’; t.Value = 243;现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型。如下例:?12345678static void Main(string[] args) { d
阅读全文
摘要:引:在很多场合的,我们需要一个方法返回多个值,我们有多种方式来实现。1.使用全局变量2.使用out 和 ref 参数3.把多个返回值封装为 struct 或 class4.使用Tuple.net 4.0在基类库中添加了一个有趣的 Tuple类,它代表一个有序的N元组。所谓元组,其实就是“数值对”,比如以下就是一个3元组:(100,200,300)可以调用Tuple.Create静态方法或使用new 关键字直接创建一个Tuple对象。 .net 类库中定义了拥有1-7个泛型参数的泛型Tuple.使用Tuple对象作为方法返回值,可以很容易地包含多个结果。namespace DivideUseTu
阅读全文
摘要:本示例程序的功能是找出数组中的最大值和最小值首先,定义一个泛型结构Pair保存这个值: public struct Pair<T> { public T Max; public T Min; }接着,设计一个泛型类MaxMin,提供一个公有的GetMaxMinVauleFromArray方法封装“查找数组中最大值和最小值算法。public class MaxMin<T> where T : IComparable<T>{//处理数据,获取最大值最小值public static Pair<T> GetMaxMinVauleFromArray(T[]
阅读全文
摘要:转自:http://www.cnblogs.com/artech/archive/2011/03/17/nullabletype.html本篇文章讨论可空值类型(Nullable<T>)的转换,却确地说是如何将一种类型的值对象转换成相应的可空值。这来源于今天我们的一个成员遇到的一个小问题,我经过一些整理写了这篇文章。虽然没有什么技术含量可言,也希望对某些读者带来帮助。目录一、四种典型的值类型转换方式二、当类型转换遭遇Nullable<T>三、将基于Nullable<T>的类型转换实现在扩展方法中四、进一步完善扩展方法ConvertTo五、谈谈Nullable
阅读全文
摘要:.NET4.0 Beta2中提供了新的System.Numerics命名空间,对应于System.Numerics.dll。该命名空间下就两个类BigInteger和Complex,我们来简单了解下这两个类的用法。BigInteger:任意大小的带符号整数,可以表示任意大小的整数1.Int64, SByte, UInt16, UInt32, and UInt64这些都有一个MinValue和MaxValue属性。而BigInteger没有这两个属性,因为它没有大小限制。2.不可变的类型.3.由于他没有大小限制,理论上当它足够大的时候会出现OutOfMemoryException异常.BigIn
阅读全文
摘要:Reflector 是一个可以反编译.net 程序集的工具。我们可以用 VS2010 附带的 Dotfuscator Software Services 来保护我们的程序集不给反编译利用。
阅读全文