随笔分类 - .NET基础
摘要:C#关键字是伴随这.NET 3.5以后,伴随着匿名函数、LINQ而来, 由编译器帮我们推断具体的类型。总体来说,当一个变量是局部变量(不包括类级别的变量),并且在声明的时候初始化,是使用var关键字的前提。具体什么时候使用,什么时候不使用,以下是个人浅见。 1、声明匿名函数时使用var关键字 var temp = new {Name="", Category=""}; 2、LINQ投影出匿...
阅读全文
摘要:如果针对一个类型实例的代码片段经常被用到,我们可能会想到把之封装成帮助方法。如下是一段针对DateTime类型实例的一段代码: class Program { static void Main(string[] args) { DateTime d = new DateTime(2001,5,18); s...
阅读全文
摘要:最近,在基类的构造函数中调用虚方法时,发现了一个问题。先把问题重现如下: class Program { static void Main(string[] args) { var c = new Chinese(18); Console.ReadKey(); } } pu...
阅读全文
摘要:当一个类有多个构造函数的时候,常使用this构造器:public class SomeClass
{ public SomeClass() { //TODO:初始化一些字段 } public SomeClass(string temp) : this() { //TODO:初始化另外一些字段 }
} 在这里,为什...
阅读全文
摘要:当我们需要统计一段代码的执行时间,首先想到的可能是Stopwatch类。在这里,先暂不使用Stopwatch,自定义一个统计代码执行时间的类,大致需要考虑到: 1、确保统计的是当前进程、当前线程中代码的执行时间。2、在统计执行过程中,不允许有垃圾回收。即在统计代码执行时间之前,就让GC完成垃圾回收。 举例:统计显示一个数组元素所消耗的时间 class Program { ...
阅读全文
摘要:谈到事件注册,EventHandler是最常用的。 EventHandler是一个委托,接收2个形参。sender是指事件的发起者,e代表事件参数。 □ 使用EventHandler实现猜拳游戏 使用EventHandler实现一个猜拳游戏,每次出拳,出剪刀、石头、布这三者的其中一种。 首先抽象出一个被观察者,其中提供了事件,提供了执行事件的方法。 public class F...
阅读全文
摘要:在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式、委托与事件的方式实现过观察者模式。本篇体验使用Action实现此模式,并从中体验委托与事件的区别。 □ 使用Action实现观察者模式 就举一个足球场上的例子,当裁判吹响终场哨,胜队庆祝,失败队落寞。把裁判看作是被观察者,比赛中的两队看作是观察者。 裁判作为被观察者需要提供一个Action委托供观...
阅读全文
摘要:来看使用Action委托的一个实例: static void Main(string[] args) { int i = 0; Action a = () => i++; a(); a(); Console.WriteLine(i); ...
阅读全文
摘要:委托是多播委托,我们可以通过"+="把多个方法赋给委托变量,这样就形成了一个委托链。本篇的话题包括:委托链是怎样形成的,如何调用委托链方法,以及委托链异常处理。 □ 调用返回类型为void的委托所形成的委托链方法□ 调用返回类型不是void的委托所形成的委托链方法□ 调用返回类型不是void的泛型委托所形成的委托链方法□ 调用Func泛型委托所形成的委托链方法□ 调用Action泛型委托所形成...
阅读全文
摘要:在"委托、Lambda表达式、事件系列02,什么时候该用委托"一文中,使用委托让代码简洁了不少。namespace ConsoleApplication2
{ internal delegate bool MyCalculateDelegate(int val); class Program { static void Main(string[] args)...
阅读全文
摘要:假设要找出整型集合中小于5的数。 static void Main(string[] args) { IEnumerable source = new List(){2, 3, 4, 5, 6, 7, 8, 9,10, 11}; var result = GetNumbersLessThanFive(source); ...
阅读全文
摘要:委托是一个类。namespace ConsoleApplication1
{ internal delegate void MyDelegate(int val); class Program { static void Main(string[] args) { } }
}
使用Reflector查看委托的IL代码:...
阅读全文
摘要:当需要监控某一文件,FileSystemWatcher类提供了Created, Deleted,Rename等事件。 就拿FileSystemWatcher的Created事件来说,该事件类型是FileSystemEventHandler。public delgate void FileSystemEventHandler(Object sender, FileSystemEventArgs ...
阅读全文
摘要:当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法。创建一个控制台应用程序,首先设计一个接口: public interface ISay { void SaySth(); }在控制台应用程序下创建Plugins文件夹,控制台的可执行文件...
阅读全文
摘要:CLR总是知道托管堆上的对象是什么类型,这是CLR类型安全的前提。托管堆上的每个对象都有一个"类型对象指针",指向托管堆上Type对象的一个实例。我们总是可以通过System.Object的GetType实例方法,获取对象类型。而且,GetType是非虚方法,这样子类就不能重写该方法,子类就没有办法伪装成父类。 为什么需要类型安全呢?类型伪装是许多安全漏洞的根源。CLR类型安全保证了类型的安全...
阅读全文
摘要:使用new操作符来创建对象,其背后到底发生了什么? 有一个父类Animal,Dog派生于Animal。 class Program { static void Main(string[] args) { Dog dog = new Dog(); Console.WriteLine("我能调用老祖宗Ob...
阅读全文
摘要:通常,我们会通过线程的构造函数先创建线程再使用线程。而实际上,.NET中有些类提供的方法,其内部就是使用多线程处理的。一些封装了多线程、异步处理方法的类都符合了"事件驱动异步模式(event-based asynchronous pattern)"。以System.ComponentModel下的BackgroundWorker类来说,该类就符合这种模式。 BackgroundWorker类属...
阅读全文
摘要:当一个线程直到收到另一个线程的通知才执行相关的动作,这时候,就可以考虑使用"事件等待句柄(Event Wait Handles)"。使用"事件等待句柄"主要用到3个类: AutoResetEvent, ManualResetEvent以及CountdownEvent(.NET 4.0以后才有)。本篇包括: ※ 一个线程等待另一个线程的通知※ 2个线程互相通知等待※ 一个线程等待队列中的多个任务...
阅读全文
摘要:当涉及到多线程共享数据,需要数据同步的时候,就可以考虑使用线程锁了。本篇体验线程锁的各种用法以及线程死锁。主要包括: ※ 使用lock处理数据同步※ 使用Monitor.Enter和Monitor.Exit处理数据同步※ 使用Mutex处理进程间数据同步※ 使用Semaphore处理数据同步※ 线程死锁 □ 使用lock处理数据同步 假设有一个类,主要用来计算该类2个字段的商,在计算商的方...
阅读全文
摘要:假设多个线程共享一个静态变量,如果让每个线程都执行相同的方法每次让静态变量自增1,这样的做法线程安全吗?能保证自增变量数据同步吗?本篇体验使用lock语句块和Interlocked类型方法保证自增变量的数据同步。 □ 线程不安全、数据不同步的做法 class Program { static int sum = 0; static void M...
阅读全文
浙公网安备 33010602011771号