05 2013 档案
摘要:[csharp]view plaincopyusingSystem;usingSystem.Threading;usingSystem.Collections;usingSystem.Collections.Generic;//将线程同步事件封装在此类中,//以便于将这些事件传递给Consumer和//Producer类。publicclassSyncEvents{publicSyncEvents(){//AutoResetEvent用于“新项”事件,因为//我们希望每当使用者线程响应此事件时,//此事件就会自动重置。_newItemEvent=newAutoResetEvent(false)
阅读全文
摘要:[csharp]view plaincopy/*泛型类:Queue*命名空间:System.Collections.Generic*描述:表示对象的先进先出集合。*类型参数:T--指定队列中元素的类型*备注:*队列容器中的项,只能从先进去的开始删除,不能无规则删除容器队列中的项,比如,不能直接删除第2个,或最后一个项,*要删除第2项,只能先删除第一个项,然后才能删除原来的第2项,当前的第一项.(只能删除第一项!!!)*Queue在接收顺序存储消息方面非常游泳,以便于进行顺序处理.存储在Queue中的对象在一端插入,从另一端移除*Queue的容量是指Queue可以保存的元素数.默认初始容量为8.
阅读全文
摘要:Control的Invoke和BeginInvoke 是相对于支线线程(因为一般在支线线程中调用,用来更新主线程ui)Invoke立即插入主线程中执行,而BeginInvoke 要等主线程结束才执行Control.Invoke 方法 (Delegate):在拥有此控件的基础窗口句柄的线程上执行指定的委托。Control.BeginInvoke 方法 (Delegate):在创建控件的基础句柄所在线程上异步执行指定委托。近日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下。感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义。(一)C
阅读全文
摘要:前几篇文章我已经对异步的操作进行的详细的解释.异步操作也是线程的一种,当我们开始一个异步操作(新线程),完成调用后需要和其他线程通信(可能需要告知状态信息),这时候我们就需要线程间的通信编程.线程间通信我们看下面的图图1我们来看线程间通信的原理:线程(Thread B)和线程(Thread A)通信,首先线程A必须实现同步上下文对象(Synchronization Context),线程B通过调用线程A的同步上下文对象来访问线程A,所有实现都是在同步上下文中完成的.线程B有两种方式来实现线程间的通信.第一种:调用线程A的同步上下文对象,阻碍当前线程,执行红色箭头调用,直到黄色箭头返回(同步上下
阅读全文
摘要:在前面3篇文章,我已经介绍了异步的工作原理和相关方法和参数的应用.下面我们介绍Stream流的操作,并使用System.IO.FileStream来揭开如何开发异步的Stream(System.IO.Stream)读/写操作异步的Stream读/写操作下面是继承于System.IO.Stream的类System.IO.StreamMicrosoft.JScript.COMCharStreamSystem.IO.BufferedStreamSystem.IO.FileStreamSystem.IO.MemoryStreamSystem.IO.UnmanagedMemoryStreamSystem
阅读全文
摘要:异步的核心: IAsyncResultAsynchronousProgrammingModel整个异步调用过程中都是围绕IAsyncResult来进行的,大家可以看看上篇文章的例子,BeginXXX返回这个对象,EndXXX接收这个对象来结束当前异步对象,下面我们来看看IAsyncResult接口成员/和实现此接口的AsyncResult类成员(其中有些在上篇中已经涉及到)IAsyncResult接口1publicinterfaceIAsyncResult2{3WaitHandleAsyncWaitHandle{get;}//阻塞一个线程,直到一个或多个同步对象接收到信号4BooleanIsC
阅读全文
摘要:我们怎样进行异步编程/开发?现在扩充下上篇文章的类(AsyncTest),提供更多的例子并从中做下简单的对比,从新的认识下异步的内部机制,下面我们增加一个新的委托1步,我们添加一个新方法(计算年薪YearlySalary)publicdecimalYearlySalary(decimalsalary,intmonthCount,decimalbonus);2步,为这个方法增加异步的功能,这样我们仍然使用委托(Delegate)publicdelegatedecimalSalaryEventHandler(decimalsalary,intmonthCount,decimalbonus);经过简
阅读全文
摘要:什么是.Net异步机制呢?在解释这个话题前,我们先看看同步的程序,就是我们常用的Hello World程序.Code 1:1classProgram2{3staticvoidMain(string[]args)4{5//查看当前的线程ID,是否线程池里面的线程6Console.WriteLine("1,ThreadID:#{0},IsPoolThread?{1}",Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.IsThreadPoolThread);78AsyncTesttest=newAsyncTest
阅读全文
摘要:目录1 创建线程1.1 异步委托方式1.1.1 IAsyncResult.IsCompleted1.1.2 IAsyncResult.AsyncWaitHandle1.1.3 AsyncCallBack1.2 Thread类1.2.1 无参数线程方法1.2.2 有参数线程方法1.2.3 后台线程1.2.4 关于线程优先级1.2.5 线程状态1.3 线程池2 同步问题2.1 lock关键字2.1.1 将实例成员设为线程安全的2.1.2 lock关键字由编译器解析为Monitor类2.1.3 更快速的Interlocked类2.2 WaitHandle2.3 Mutex类2.4 Semaphore
阅读全文
摘要:发送复合型数据:除了传输数值型数据,我们更多的是传输复合型数据,如字符,数值,bool等等。是否存在简单办法发送复合型数据呢? 可以建立一个类,classEmployee{publicintEmployeeID;publicintLastNameSize;publicstringLastName;publicintFirstNameSize;publicstringFirstName;publicintYearsService;publicdoubleSalary;publicintsize;} 可以把Employee看作是一个数据类型,它包括很多子类型。可以将Empolyee中的字段赋值后,
阅读全文
摘要:我们都曾经出去旅游,并且会带回一些纪念品。一般情况,这些纪念品可以放在随身带的旅行包中带回家,甚至因为纪念品足够小,可以放在口袋里带回来。如果你到巴黎旅行,看到埃菲尔铁塔,觉得非常壮观,你很想同你的朋友分享,那么拍下照片,寄给朋友。 假设一切允许,法国政府允许你把埃菲尔铁塔带回你的国家,展览数月,那么你怎样带回去呢? 不要告诉我说,找世界上最大的船王给你造一艘可以将埃菲尔铁塔整个装下的超级货船,因为即使可以造出这艘船,你还需要一辆超级卡车,一个超级起重机,一条超级道路,才可以把埃菲尔铁塔整个从市区运送到码头。 很明显,你不需要超级货船,更不需要超级卡车,只需要绘制铁塔结构图,给组成埃菲尔铁塔的
阅读全文
摘要:今天是大白话系列之C#委托与事件讲解的大结局,也是我们最关心的,在日常的MES系统编程中到底怎样使用这样的利器,其实我们每天都在使用事件,一个窗体,一个按钮都包含这事件,只是很少用到自己写的委托和事件,说白了不知道如何下手,也不知道在什么样的场景下应用。用到事件的地方有很多,这次讲解就MES系统开发中我们经常应用的场景。一、通用控件场景通用控件有很多,这里举最常用的万能通用分页控件【注:】本分页控件,只是为了讲解使用,并非真分页控件,还是基于.net控件的分页我们先来看场景我们所看到的这个分页控件就是这次讲解的主角,在日常的编程中,像这样功能我们用的做多,所以我们必须要把它抽象出来,不能每个页
阅读全文
摘要:[我希望大家在看完文章的时候,多做做练习,自己也可以想个场景,动动手,这样才会有深刻的印象,不然遗忘的速度非常快]今天我接着上面的3篇文章来讲一下,为什么我们在日常的编程活动中遇到这么多sender,EventArgs e 参数:protected void Page_Load(object sender, EventArgs e){}protected void btnSearch_Click(object sender, ImageClickEventArgs e){}protected void grdBill_RowDataBound(object sender, GridViewRo
阅读全文
摘要:什么是事件?EVENT?点击事件?加载事件?一连串的模糊的概念冲击着我们弱小的脑袋那我们首先来看一下比较正统的感念吧:事件是类在发生其关注的事情时用来提供通知的一种方式。事件的发生一般都牵扯2个角色事件发行者(Publisher):一个事件的发行者,也称作是发送者(sender),其实就是个对象,这个对象会自行维护本身的状态信息,当本身状态信息变动时,便触发一个事件,并通知说有的事件订阅者。事件订阅者(Subscriber):对事件感兴趣的对象,也称为Receiver,可以注册感兴趣的事件,在事件发行者触发一个事件后,会自动执行这段代码。为了更好的让大家理解上面的概念,我先什么都不讲,我们先来
阅读全文
摘要:从序言中,大家应该对委托和事件的重要性有点了解了吧,虽然说我们现在还是能模糊,但是从我的大白话系列中,我会把这些概念说的通俗易懂的。首先,我们还是先说说委托吧,从字面上理解,只要是中国人应该都知道这个意思,除非委托2个中文字不认识,举个例子,小明委托小张去买车票。 但是在我们的程序世界里,也是这么的简单吗?当然,什么是OO,OO就是现实世界的抽象,所有现实世界的事物,在OO里都能得到很好的诠释,不好意思,扯远了......那我们就单刀直入吧,如果同学们不嫌烦的话,可以看一下,网上中文,英文的那个GreetingPeople例子。 首先是C#语法publicdelegatevoidBugTick
阅读全文
摘要:在讲委托,事件之前,我想问大家一个非常简单的问题,也许在我们日常的编程中基本上每天都会遇到,但是却往往不去了解的地方,请以下代码:protected void Page_Load(object sender, EventArgs e){}protected void btnSearch_Click(object sender, ImageClickEventArgs e){}protected void grdBill_RowDataBound(object sender, GridViewRowEventArgs e){}protected void grdBill_RowDeleting(
阅读全文
摘要:本专题概要:引言如何在.NET中调用COM组件——访问Office 互操作对象在.NET 中调用COM组件的实现原理剖析错误处理小结一、引言 COM(Component Object Modele,组件对象模型)是微软以前推崇的一个开发技术,所以现在微软的很多产品都用到了COM组件,如Office,IE等。然而如果.NET 平台下的程序想访问COM组件的方式来实现某个功能怎么办呢? 正是由于开发人员有这个需求,所以微软在.NET FrameWork中为COM和托管代码之间进行互操作提供了支持,这种互操作性的技术就是COM Interop。但是COM Interop(COm互操作)这项技术,不.
阅读全文
摘要:本专题概要数据封送介绍封送Win32数据类型封送字符串的处理封送结构体的处理封送类的处理小结一、数据封送介绍看到这个专题时,大家的第一个疑问肯定是——什么是数据封送呢?(这系列专题中采用假设朋友的提问方式来解说概念,就是希望大家带着问题去学习本专题内容,以及大家在平时的学习过程中也可以采用这个方式,个人觉得这个方式可以使自己学习效率有所提高,即使这样在学习的过程可能会显得慢了,但是这种方式会对你所看过的知识点会有一个更深的印象。远比看的很快,最后却发现记住的没多少强,在这里分享下这个学习方式,认为可以接受的朋友可以在平时的学习中可以尝试下的,如果觉得不好的话,相信大家肯定也会有自己更好的学习方
阅读全文
摘要:本专题概要:引言如何使用平台调用Win32 函数——从实例开始当调用Win32函数出错时怎么办?——获得Win32函数的错误信息小结一、引言 上一专题对.NET 互操作性做了一个全面的概括,其中讲到.NET平台下实现互操作性有三种技术——平台调用,C++ Interop和COM Interop,今天在这个专题中将会大家介绍第一种技术,即平台调用。然而朋友们应该会有这样的疑问,平台调用到底有什么用呢? 为什么我们要用平台调用的技术了?对于这两个问题的答案就是——平台调用可以帮助我们实现在.NET平台下(也就是指用C#、VB.net语言写的应用程序下)可以调用非托管函数(指定的是C/C++语言写.
阅读全文
摘要:本专题概要:引言平台调用C++ Interop(互操作)COM Interop(互操作)一、引言 这个系列是在C#基础知识中遗留下来的一个系列的,因为在C# 4.0中的一个新特性就是对COM互操作改进,然而COM互操作性却是.NET平台下其中一种互操作技术,为了帮助大家更好的了解.NET平台下的互操作技术,所以才有了这个系列。然而有些朋友们可能会有这样的疑问——“为什么我们需要掌握互操作技术的呢?” 对于这个问题的解释就是——掌握了.NET平台下的互操作性技术可以帮助我们在.NET中调用非托管的dll和COM组件。.NET是建立在操作系统的之上的一个开发框架,其中.NET 类库中的类也是对W.
阅读全文
摘要:本专题概要:动态类型介绍为什么需要动态类型动态类型的使用动态类型背后的故事动态类型的约束实现动态行为总结引言: 终于迎来了我们C# 4中特性了,C# 4主要有两方面的改善——Com 互操作性的改进和动态类型的引入,然而COM互操作性这里就不详细介绍的,对于.Net 互操作性我将会在另外一个专题中详细和大家分享下我所了解到的知识,本专题就和大家分享C# 4中的动态类型,对于动态类型,我刚听到这个名词的时候会有这些疑问的——动态类型到底是什么的呢? 知道动态类型大概是个什么的时候,肯定又会有这样的疑问——C# 4中为什么要引入动态类型的?(肯定引入之后可以完成我们之前不能做的事情了,肯定是有好处.
阅读全文
摘要:本专题概要:Linq是什么使用Linq的好处在哪里Linq的实际操作例子——使用Linq遍历文件目录小结引言: 终于到了C# 3中最重要特性的介绍了,可以说之前所有介绍的特性都是为了Linq而做准备的,然而要想深入理解Linq并不是这个专题可以介绍完的,所以我打算这个专题将对Linq做一个简单的介绍,对于Linq的深入理解我将会后面单独作为一个系列要和大家分享下。一、Linq是什么?Linq也就是Language Integrated Query的缩写,即语言集成查询,是微软在.Net 3.5中提出的一项新技术, Linq主要包含4个组件——Linq to Objects、Linq to X.
阅读全文
摘要:引言: C# 3中所有特性的提出都是更好地为Linq服务的, 充分理解这些基础特性后。对于更深层次地去理解Linq的架构方面会更加简单,从而就可以自己去实现一个简单的ORM框架的,对于Linq的学习在下一个专题中将会简单和大家介绍下,这个专题还是先来介绍服务于Linq的基础特性——扩展方法一、扩展方法的介绍 我一般理解一个知识点喜欢拆分去理解,所以对于扩展方法的理解可以拆分为——首先它肯定是一个方法,然而方法又是对于一个类型而言的,所以扩展方法可以理解为现有的类型(现有类型可以为自定义的类型和.Net 类库中的类型)扩展(添加)应该附加到该类型中的方法。 在没有扩展方法之前,如果我们想为一..
阅读全文
摘要:引言: 对于刚刚接触Lambda表达式的朋友们,可能会对Lambda表达式感到非常疑惑,它到底是个什么什么样的技术呢?以及它有什么好处和先进的地方呢?下面的介绍将会解除你这些疑惑。一、Lambda表达式的演变过程Lambda表达式其实大家可以理解为它是一个匿名函数(对于匿名函数的介绍大家可以参考我这篇文章), Lambda表达式可以包含表达式和语句,并且可以用于创建委托,以及C#编译器也能将它转换成表达式树。对于Lambda表达式中都会使用这个运算符——“=>”,它读成“goes to” ,该运算符的左边为输入参数,右边是表达式或者语句块,下面就看看Lambda表达式是如何来创建委托实例
阅读全文
摘要:引言 经过前面专题的介绍,大家应该对C# 1和C# 2中的特性有了进一步的理解了吧,现在终于迎来我们期待已久的C# 3中特性,C# 中Lambda表达式和Linq的提出相当于彻底改变我们之前的编码风格了,刚开始接触它们,一些初学者肯定会觉得很难理解,但是我相信,只要多多研究下并且弄明白之后你肯定会爱上C# 3中的所有特性的,因为我自己就是这么过来的,在去年的这个时候,我看到Lambda表达式和Linq的时候觉得很难理解,而且觉得很奇怪的(因为之前都是用C# 3之前的特性去写代码的,虽然C# 3中的特性已经出来很久了,但是自己却写的很少,也没有怎么去研究,所以就觉得很奇怪,有一种感觉就是——怎.
阅读全文
摘要:引言: 在C# 1.0中我们经常使用foreach来遍历一个集合中的元素,然而一个类型要能够使用foreach关键字来对其进行遍历必须实现IEnumerable或IEnumerable<T>接口,(之所以来必须要实现IEnumerable这个接口,是因为foreach是迭代语句,要使用foreach必须要有一个迭代器才行的,然而IEnumerable接口中就有IEnumerator GetEnumerator()方法是返回迭代器的,所以实现了IEnumerable接口,就必须实现GetEnumerator()这个方法来返回迭代器,有了迭代器就自然就可以使用foreach语句了),然
阅读全文
摘要:引言: 感觉好久没有更新博客了的,真是对不住大家了。在这个专题中将介绍匿名方法,匿名方法看名字也能明白,当然就是没有名字的方法了(现实生活中也有很多这样的匿名过程,如匿名投票,匿名举报等等,相信微软在命名方面肯定是根据了生活中例子的),然而匿名方法的理解却不是仅仅是这一句话(这句话指的是没有名字的方法),它还有很多内容,下面就具体介绍下匿名方法有哪些内容一、匿名方法 之前一直认为匿名方法是在C# 3.0中提出的,之前之所以这么认为主要是因为知道C# 3.0中提出了匿名类型,所以看到匿名方法就很理所当然的认为也是在C# 3.0中提出来,然而经过系统的学习C#特性后才发现匿名方法在C# 2.0..
阅读全文
摘要:引言: C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪些内容(最近一直都在思考如何来分享这篇文章的,因为刚开始觉得可空类型使用过程中比较简单,觉得没有讲的必要,但是考虑到这个系列的完整性,决定还是唠叨下吧,希望对一些不熟悉的人有帮助)。一、为什么会有可空类型 如果朋友们看了我之前的分享,对于这一部分都不会陌生,因为我一般介绍C#特性经常会以这样的方式开头的, 因为每个特性都是有它出现的原因的(有一句佛语这是这么讲的:万事皆有因,有因必有果),首先来说说这个因的(果当然是新增加了可空类型这个新特性了..
阅读全文
摘要:引言: 在C# 2.0中泛型并不支持可变性的(可变性指的就是协变性和逆变性),我们知道在面向对象的继承中就具有可变性,当方法声明返回类型为Stream,我们可以在实现中返回一个FileStream的类型,此时就存在一个隐式的转化——从FileStream类型(子类引用)——>Stream类型(父类引用),并且引用类型的数组也存在这种从子类引用——>父类引用的转化,例如string[] 可以转化为object[](即这样的代码是可以通过编译的:string[] strs =new string[3]; object[] objs =strs;),此时我们肯定会想是否泛型中的泛型参数也
阅读全文
摘要:引言: 本专题主要是承接上一个专题要继续介绍泛型的其他内容,这里就不多说了,就直接进入本专题的内容的。一、类型推断 在我们写泛型代码的时候经常有大量的"<"和">"符号,这样有时候代码一多,也难免会让开发者在阅读代码过程中会觉得有点晕的,此时我们觉得晕的时候肯定就会这样想:是不是能够省掉一些"<" 和">"符号的呢?你有这种需求了, 当然微软这位好人肯定也会帮你解决问题的,这样就有了我们这部分的内容——类型推断,意味着编译器会在调用一个泛型方法时自动判断要使用的类型,(这里要注意的是:类型推
阅读全文
摘要:引言: 在上一个专题中介绍了C#2.0 中引入泛型的原因以及有了泛型后所带来的好处,然而上一专题相当于是介绍了泛型的一些基本知识的,对于泛型的性能为什么会比非泛型的性能高却没有给出理由,所以在这个专题就中将会介绍原因和一些关于泛型的其他知识。一、泛型类型和类型参数 泛型类型和其他int,string一样都是一种类型,泛型类型有两种表现形式的:泛型类型(包括类、接口、委托和结构,但是没有泛型枚举的)和泛型方法。那什么样的类、接口、委托和方法才称作泛型类型的呢 ?我的理解是类、接口、委托、结构或方法中有类型参数就是泛型类型,这样就有类型参数的概念的。类型参数——是一个真实类型的一个占位符(我想..
阅读全文
摘要:引言:前面专题主要介绍了C#1中的2个核心特性——委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解,那就让我们一起进入本专题的学习的。一、泛型的是什么 泛型的英文解释为generic,当然我们查询这个单词时,更多的解释是通用的意思,然而有些人会认为明明是通用类型,怎么成泛型了的,其实这两者并不冲突的,泛型本来代表的就是通用类型,只是微软可能有一个比较官方的此来形容自己引入的特性而已,既然泛型是通用的, 那么泛型类型就是通用类型的,即泛型就是一中模子。 在生活中,我们经常会看到模子,像我们平常生.
阅读全文
摘要:引言:当我们在点击窗口中的Button控件VS会帮我们自动生成一些代码,我们只需要在Click方法中写一些自己的代码就可以实现触发Click事件后我们Click方法中代码就会执行,然而我一直有一个疑问的——既然上一专题中说事件是一个多播委托,然而自动生成的代码中只有事件的实例化,却没有看到事件的调用,那既然没有事件调用的代码,那封装的Click为什么会执行呢?一、点击按钮时触发Click事件背后发送的事情在引言中提出了我的提问的, 我相信有些朋友可能也会有这样的疑问的,然后事件肯定是调用了的, 只是不是我们代码中调用,而是Butoon控件的内部代码里面调用了事件,而导致委托封装的Click方法
阅读全文
摘要:引言:前面几个专题对委托进行了详细的介绍的,然后我们在编写代码过程中经常会听到“事件”这个概念的,尤其是写UI的时候,当我们点击一个按钮后VS就会自动帮我们生成一些后台的代码,然后我们就只需要在Click方法里面写代码就可以,所以可能有些刚接触C#的朋友就觉得这样很理所当然的,也没有去思考这是为什么的,为什么点击下事件就会触发我们在Click方法里面写的代码呢?事件到底扮演个什么样的角色呢?为了解除大家的这些疑惑,下面就详细介绍了事件,让一些初学者深入理解C#中的事件的概念。一、为什么C#中会有事件的? 前面专题中介绍了我理解的为什么需要委托的,所以这里我来分享下我理解的为什么C#中要引入事.
阅读全文
摘要:引言:上一专题介绍了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的介绍都是委托只是封装一个方法,那委托能不能封装多个方法呢?因为生活中经常会听到,我代表大家的意见等这样的说话,既然委托也是一个代表,那他如果只能代表一个人,那他的魅力就不是很大了吧,所以我们就会委托能不能代表多个方法的? 答案是可以的,这就是本专题要讲的内容——委托链,委托链也是一个委托,只是因为它是把多个委托链在一起,所以我们就以委托链来这么称呼它的。一、到底什么是委托链我们平常实例化委托对象时都是绑定一个方法的, 前一个专题介绍的委托也是包装了一个方法的, 用前面的例子就是
阅读全文
摘要:引言:上一个专题已经和大家分享了我理解的——C#中为什么需要委托,专题中简单介绍了下委托是什么以及委托简单的应用的,在这个专题中将对委托做进一步的介绍的,本专题主要对委本质和委托链进行讨论。一、委托的本质 平时我们很容易使用委托——用C#delegate关键字定义委托,再用new操作符构造委托实例,然后通过调用委托实例来调用回调方法(就是用一个了委托对象的变量来代替方法名,这句话如果刚接触的人不好理解的话,这里给个例子:MyDelegatemydelegate =new Mydelegate(obj.mymethod),MyDelegate是定义的一个委托,假设定义的是没有参数的,然后调用委.
阅读全文
摘要:引言:对于一些刚接触C# 不久的朋友可能会对C#中一些基本特性理解的不是很深,然而这些知识也是面试时面试官经常会问到的问题,所以我觉得有必要和一些接触C#不久的朋友分享下关于C#基础知识的文章,所以有了这个系列,希望通过这个系列让朋友对C#的基础知识理解能够更进一步。然而委托又是C#基础知识中比较重要的一点,基本上后面的特性都和委托有点关系,所以这里就和大家先说说委托,为什么我们需要委托。一、C#委托是什么的?在正式介绍委托之前,我想下看看生活中委托的例子——生活中,如果如果我们需要打官司,在法庭上是由律师为我们辩护的,然而律师真真执行的是当事人的陈词,这时候律师就是一个委托对象,当事人委托律
阅读全文
摘要:因为有些人可能会疑惑,将了这么多多线程,到底在实际的应用上有什么作用的呢? 这里我在这里用多线程简单实现了一个文件的下载的功能。服务器端页面:<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="FileServer.Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
阅读全文
摘要:也不多说了,直接进入主题了一、信号量(Semaphore)信号量(Semaphore)是由内核对象维护的int变量,当信号量为0时,在信号量上等待的线程会堵塞,信号量大于0时,就解除堵塞。当在一个信号量上等待的线程解除堵塞时,内核自动会将信号量的计数减1。在.net 下通过Semaphore类来实现信号量同步。Semaphore类限制可同时访问某一资源或资源池的线程数。线程通过调用 WaitOne方法将信号量减1,并通过调用 Release方法把信号量加1。先说下构造函数:public Semaphore(int initialCount,int maximumCount);通过两个参数来设置
阅读全文
摘要:引言:其实这部分内容应该是属于专题四,因为这篇也是讲关于线程同步的,但是由于考虑到用户的阅读习惯问题,因为文章太长了,很多人不是很愿意看包括我也是这样的,同时也有和我说可以把代码弄成折叠的,这样就不会太长的,但是我觉得这样也不怎么便于阅读,因为我看别人的博客的时候,看到有代码是折叠起来的时候很多时候不愿意去点,并且点一下之后同样拉长文章的,然后就看到右边的滚动条变小了,本以为快看完了(意思快学到知识了),一看滚动条后发现还有好长的内容很看, 所以就会给人一种不舒服的感觉吧(如果有和我一样的人的话,你肯定懂的是什么感觉的)。所以我把线程同步放到两篇文章里面来说,其实放到两篇文章里面也有一定原因的
阅读全文
摘要:目录:一、线程同步概述二、线程同步的使用三 、总结一、线程同步概述前面的文章都是讲创建多线程来实现让我们能够更好的响应应用程序,然而当我们创建了多个线程时,就存在多个线程同时访问一个共享的资源的情况,在这种情况下,就需要我们用到线程同步,线程同步可以防止数据(共享资源)的损坏。然而我们在设计应用程序还是要尽量避免使用线程同步, 因为线程同步会产生一些问题:1. 它的使用比较繁琐。因为我们要用额外的代码把多个线程同时访问的数据包围起来,并获取和释放一个线程同步锁,如果我们在一个代码块忘记获取锁,就有可能造成数据损坏。2. 使用线程同步会影响性能,获取和释放一个锁肯定是需要时间的吧,因为我们在决定
阅读全文
摘要:上一篇文章主要介绍了如何利用线程池中的工作者线程来实现多线程,使多个线程可以并发地工作,从而高效率地使用系统资源。在这篇文章中将介绍如何用线程池中的I/O线程来执行I/O操作,希望对大家有所帮助。目录:一、I/O线程实现对文件的异步二、I/O线程实现对请求的异步三、总结一、I/O线程实现对文件的异步1.1 I/O线程介绍:对于线程所执行的任务来说,可以把线程分为两种类型:工作者线程和I/O线程。工作者线程用来完成一些计算的任务,在任务执行的过程中,需要CPU不间断地处理,所以,在工作者线程的执行过程中,CPU和线程的资源是充分利用的。I/O线程主要用来完成输入和输出的工作的,在这种情况下, 计
阅读全文
摘要:目录:一、上节补充二、CLR线程池基础三、通过线程池的工作者线程实现异步四、使用委托实现异步五、任务一、上节补充对于Thread类还有几个常用方法需要说明的。1.1 Suspend和Resume方法这两个方法在.net Framework 1.0的时候就支持的方法,他们分别可以挂起线程和恢复挂起的线程。但在.net Framework 2.0以后的版本中这两个方法都过时了,MSDN的解释是这样:警告:不要使用Suspend 和Resume方法来同步线程的活动。您无法知道挂起线程时它正在执行什么代码。如果您在安全权限评估期间挂起持有锁的线程,则 AppDomain中的其他线程可能被阻止。如果您在
阅读全文
摘要:引言:最近一段时间都在研究关于.Net线程的内容,觉得线程是每个程序员都应该掌握的,所以写下这个线程的系列希望能给大家学习过程中一些帮助,同时也是自己对线程的巩固,当中如果有什么错漏还请大家指出,这样我们可以互相得到进步。目录:一、线程的介绍二、线程调度和优先级三、前台线程和后台线程四、简单线程的使用一、线程的介绍在介绍线程之前, 很有必要知道什么是进程,以及与线程的关系。进程(Process)是应用程序的实例要使用的资源的一个集合(从可以简化理解:进程就是一种资源,是应用程序所用的资源)。每个应用程序都在各自的进程中运行来确保应用程序不受其他应用程序的影响,如果一个应用程序失败了, 只会影响
阅读全文
摘要:本专题概要:引言你知道APM吗?你想知道如何使用异步编程模型编写代码吗?使用委托也可以实现异步编程,你知道否?小结一、引言 在前面的C#基础知识系列中介绍了从C#1.0——C#4.0中一些主要特性,然而.NET 4.5更新,除了提供了一些新的类和一些新的模板外,对于C#语言也做了一定的更新,最重要的就是.NET 4.5(对应于C#5.0)中提供了async和await两个关键字,这两个关键字是我们实现异步编程更加容易了,其实早在.NET 1.0开始微软就对异步编程做了相应的支持——即异步编程模型(APM), 之后在.NET 2.0中又提出了基于事件的异步编程模型(EAP),.NET 4.0中.
阅读全文
摘要:本专题概要:引言你听说过EAP吗?——基于事件异步编程模式介绍深入剖析BackgroundWorker组件类使用BackgroundWorker组件进行异步编程小结一、引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式——APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题——不支持对异步操作的取消和没有提供对进度报告的功能,对于有界面的应用程序来说,进度报告和取消操作的支持也是必不可少的,既然存在这样的问题,微软当然也应该提供给我们解决问题的方案了,所以微软在.NET 2.0的时候就为我们提供了一个新的异步编程模型,也就是我这个专题中介绍的.
阅读全文
摘要:本专题概要引言什么是TAP——基于任务的异步模式介绍如何使用TAP——使用基于任务的异步模式来异步编程TAP与APM或EAP可以转换吗?——与其他异步模式的转换小结一、引言 在上两个专题中我为大家介绍.NET 1.0中的APM和.NET 2.0中的EAP,在使用前面两种模式进行异步编程的时候,大家多多少少肯定会感觉到实现起来比较麻烦, 首先我个人觉得,当使用APM的时候,首先我们要先定义用来包装回调方法的委托,这样难免有点繁琐, 然而使用EAP的时候,我们又需要实现Completed事件和Progress事件,上面两种实现方式感觉都有点繁琐,同时微软也意思到了这点,所以在.NET 4.0中提.
阅读全文
摘要:引言:休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务器。在我们平时的上网过程中,一般都是使用FTP的客户端来对商家提供的服务器进行访问(上传、下载文件),例如我们经常用到微软的SkyDrive网盘,115网盘等,然而我们经常用到的都是网页版本的,网页版本和客户端版本的不同,网页版本的FTP客户端,它与服务器的交流是使用HTTP协议发出对服务器的请求的,而客户端版本采用的是FTP协议发出命令对服务器进行请求。然后我们接触到FTP服务器却很少的, 所以本
阅读全文
摘要:引言:在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信大家追MM都有自己的经验的,我感觉大部分的过程肯定是——第一步: 先通过工作关系或者朋友关系等认识MM(认识FTP协议,知道FTP协议的是什么) ; 第二步: 当然了解MM有兴趣爱好了(了解FTP协议有哪些命令和工作过程)第三步:如果对方是你的菜的话,那当然要采取追求的了(就好比用了解到的FTP协议来实现一个文件上传下载器)。不过追MM好像对我来说还是比较难的了, 所以还是言归正传了,还是好好的学习
阅读全文
摘要:引言:在我们的平常工作中,邮件的发送和接收应该是我们经常要使用到的功能的。因此知道电子邮件的应用程序的原理也是非常有必要的,在这一个专题中将介绍电子邮件应用程序的原理、电子邮件应用程序中涉及的协议和实现一个简答的电子邮件收发器程序。一、邮件应用程序基本知识1.1 电子邮件原理及相关协议 说到电子邮件的原理,其实和我们现实生活中寄邮件和寄包裹是一样的原理的。就让我们先回顾下现实生活中寄邮件的流程吧——首先,我们先写好信,信封上面写好收信人的地址,写信人的地址,然后把信放到寄信箱中,然后邮局的人会某个时候去这个信箱中的信取出来,然后邮局的人根据信封上写的收信人地址进行转发到当地的邮局,当地邮局然.
阅读全文
摘要:引言:前面专题中介绍了UDP、TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的。为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在本专题中将利用前面专题介绍的知识来实现一个类似QQ的聊天程序。一、即时通信系统在我们的生活中经常使用即时通信的软件,我们经常接触到的有:QQ、阿里旺旺、MSN等等。这些都是属于即时通信(Instant Messenger,IM)软件,IM是指所有能够即时发送和接收互联网消息的软件。在前面专题P2P编程中介绍过P2P系统分两种类型——单纯型P2P和混合型P2P(QQ就是属于混合型的应用),混合型P2P
阅读全文
摘要:引言:前面的介绍专题中有朋友向我留言说介绍下关于P2P相关的内容的,首先本人对于C#网络编程也不是什么大牛,因为能力的关系,也只能把自己的一些学习过程和自己的一些学习过程中的理解和大家分享下的,下面就进入正题——P2P(Peer to Peer)编程一、P2P的介绍首先,现在大家熟知的BT、电驴、迅雷、QQ、MSN和PPlive等都是基于P2P方式实现的软件,并且对等联网(Peer to Peer,P2P)将是互联网的发展方向,因此对于P2P技术的了解显得非常的重要,下面就来介绍下P2P架构:在P2P技术之前,我们所有的网络应用都采用C/S或者B/S架构来实现的,然而在之前C/S架构的应用程序
阅读全文
摘要:上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享下,本专题主要介绍下如何实现UDP广播的程序,下面就直接介绍实现过程和代码以及运行的结果。一、程序实现UDP广播程序的实现代码:using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Windows.Forms;namespace UDPBroadcast{ /// <summary> /// 在界面上,用户可以设置本地进程的IP地址和端口号,并将地址
阅读全文
摘要:引用:前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ、MSN和Skype等一些即时通信软件传输层都是应用UDP协议的)底层的传输基础,所以在本专题中就简单介绍下UDP的工作原理和UDP编程的只是,希望可以对刚接触网络编程的朋友起到入门的作用。一、UDP介绍UDP和TCP都是构建在IP层之上传输层的协议,但UDP是一种简单、面向数据报(Sock_Dgram)的无连接协议,提供的是不一定可靠的传输服务。然而TCP是一种面向连接、可靠的,面向字节流(Sock_Stream)的传输协议,对于“无连接”是指在正式通信前不必与
阅读全文
摘要:前言前面专题的例子都是基于应用层上的HTTP协议的介绍, 现在本专题来介绍下传输层协议——TCP协议,主要介绍下TCP协议的工作过程和基于TCP协议的一个简单的通信程序,下面就开始本专题的正文了。一、TCP的工作过程首先TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议。TCP的工作过程可以分为三个阶段:一、连接的建立; 二、传输数据; 三、断开连接,下面就对这三个过程分别介绍下:1.1 连接的建立TCP的连接建立就像打电话一样, 我们打电话时,拨一个号码的号码并不是立即就可以接通的,期间会有一个“嘟 嘟”的呼叫过程, 这就好比是TCP协议的连接的建立阶段。当我们用TCP编写的程序,必
阅读全文
摘要:前言:前一个专题介绍了自定义的Web服务器,然而向Web服务器发出请求的正是本专题要介绍的Web浏览器,本专题通过简单自定义一个Web浏览器来简单介绍浏览器的工作原理,以及帮助一些初学者揭开浏览器这层神秘的面纱(以前总感觉这些应用感觉很深奥的,没想到自己也可以自定义一个浏览器出来),下面不啰嗦了,进入正题。一、Web浏览器的介绍Web浏览器是指可以显示Web服务器或者本地文件系统中的Html文件内容,并让用户与这些文件交互的一种软件,它是网络服务的客户端浏览程序,可向Web服务器发送请求,并对服务器返回的超文本信息和各种媒体、图片进行解释和显示。浏览器主要通过Http协议与服务器交互并获得网页
阅读全文
摘要:前言:经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网络中的协议有了大致的了解的, 本专题将针对HTTP协议定义一个Web服务器,我们平常浏览网页通过在浏览器中输入一个网址就可以看到我们想要的网页,这个过程中浏览器只是一个客户端,浏览器(应用层应用程序)通过HTTP协议把用户请求发送到服务端, 服务器接受到发送来的HTTP请求,然后对请求进行处理和响应,最后把响应的内容发送给客户端(浏览器这里充当了用户代理的客户端),浏览器再对接受到的响应内容(一般是HTML文件)进行解释并且显示出来。这就是一次完整的用户请求/响应模型,本专题所讲述的是一个简单的Web服务器,其他一些大型的W
阅读全文
摘要:我们在用Asp.net技术开发Web应用程序后,当用户在浏览器输入一个网址时就是再向服务器发送一个HTTP请求,此时就使用了应用层的HTTP协议,在上一个专题我们简单介绍了网络协议的知识,主要是为了后面讲HTTP协议做一个铺垫的,只有对HTTP协议有一个清楚的认识,这样当我们用Asp.net技术开发Web应用程序时,我们可以多从网络协议的方面去思考我们的应用程序,而不是只是单单停留在对服务器控件的拖拉的使用,这样也可以帮助我们开发一个自己的自定义web服务器。在这里我想同时把我对Asp.net的本质的理解和大家分享下,如果有什么不对的地方,还请大家指出,首先,当我们设计一个算法的时候要明确输入
阅读全文
摘要:因为这段时间都在研究C#网络编程的一些知识, 所以在这里把我学习到的在这里和大家分享下的,这样既可以达到分享的目的也可以让大家监督我,如果有什么地方理解错了,还请大家不吝赐教的。很多人写网络编程这快都没有怎么讲网络中的协议,然而我觉得既然是网络编程肯定要介绍下网络编程中一些协议的,这样可以让更好的梳理网络编程的知识的,所以我在这系列中会用两个专题去讲协议,第一个专题简单介绍网络分层以及各层之间如何通信的只是,第二专题将会介绍下应用层协议——Http协议,了解这个不仅对网络编程有个理论基础,也可以帮助更好地理解Web(Asp.net)的开发。一、网络分层网络上的计算机之所以可以互相通信,是因为它
阅读全文
摘要:TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer),TCP协议能够检测和恢复IP层提供的主机到主机的信道中可能发生的报文丢失、重复以及其他错误。由于TCP协议是一种面向连接协议:在使用它进行通信之前,两个应用程序之间首先要建立一个TCP连接。TCP能够在网络中提供双工和可靠的的服务。阅读目录: 1.TCP概述 2.在.NET平台TCP应用的工作模式 2.1 了解TcpListener和TcpClient 3.解决TCP的消息无边界问题...
阅读全文
摘要:经过前面基础知识作为背景,现在对Socket编程进行进一步的学习。在System.Net.Socket命名空间提供了Socket类,利用该类我们可以直接编写Socket的客户端和服务的的程序。但是直接使用Socket类编写Socket程序会比较麻烦、而且容易出错,所以.NET为我们提供了进一步封装好的TcpListener类、TCPClient类和UdpClient类。同时,当我们希望通过网络传输数据时,首先应该将数据转换为数据流。阅读目录: 1.Socket的类型 2.第一个Socket程序 2.1 服务端程序 2.2 客户端程序 2.3 程...
阅读全文
摘要:在网络通信中,很多情况下:比如说QQ聊天,通讯双方直接传递的都是字符信息。但是字符信息并不能够直接通过网络传输,这些字符集必须先转换成一个字节序列后才能够在网络中传输,于是这里就产生了编码和解码的概念:将字符序列转换为字节序列的过程称之为:编码将编码的字节序列转换为字符序列的过程称之为:解码例如:对于Unicode字符来说,编码是指将一组Unicode字符转换为一个字节序列的过程,解码就是讲一个编码字节序列转换为一组Unicode字符。目录索引: 1.字符编码基础知识 1.1 ASCII字符集 1.2 非ASCII字符集 1.3 Unicode字符集 ...
阅读全文
摘要:通过前面的笔记我们可以知道:一个客户端想要发起一次通信,先决条件就是需要知道运行着服务器端程序的主机的IP地址是多少,端口号是多少。然后我们才能够通过这个地址向服务器特定的应用程序发送信息。对于网络上的两台计算机来说,用户操作的计算机称为本地主机,与该计算机通信的另一台计算机称为远程主机。识别远程主机依靠两部分组成:一是主机标识,用于识别与本地主机通信的远程主机;二是端口号,用于识别是再和远程主机中的哪个进程通信。阅读目录: 1.获取主机地址信息 2.获取网卡信息和网络检测 2.1 获取网卡信息 2.2 网络流量检测 2.3 网络连接检测 3.参考资料...
阅读全文
摘要:计算机程序能够相互联网,相互通讯,这使一切都成为可能,这也是当今互联网存在的基础。那么程序是如何通过网络相互通信的呢?这就是我记录这系列的笔记的原因。C#语言从一开始就是为了互联网而设计的,它为实现程序的相互通信提供了许多有用API,这类应用编程接口被称为套接字(Socket)。在开始学习C# Socket之前我们需要先来了解一下基本的术语和概念。阅读目录: 1.计算机网络 2.分组报文 3.协议 3.1 IP协议 3.2 TCP协议 3.2 UDP协议 4.网络地址 4.1 回环地址 5.DNS和本地配置数据库 6.客户端和服务器 7.什么是Socke...
阅读全文
摘要:题目很有意思,在C#世界里,有一种实现叫做“显示实现”,它说的其实是对接口的实现方式,一般地,我们用到的实现都是隐示实现(VS里叫做实现接口)为什么我们没有用过“显示实现接口”呢?当类只继承一个接口时,显式实现接口与实现接口(我习惯称它为隐示实现)没有区别,如果你非要找个区别,那就是显示接口后,所有接口方法都必须是public,而“显示实现接口“则对类来说不是public,如果你需要用到接口方法时,在声明对象时,必须使用接口作声明,而如果使用“隐示实现接口”,则使用类或者接口作声明都是可以的。例如:显示实现接口,只能使用接口作声明,如果使用类作声明,那么接口中的方法由于在类中不是public,
阅读全文
摘要:static修饰符我们不会陌生,它代表静态,可以修饰你的类,方法,字段和属性等等,今天主要说一个为静态字段加ThreadStatic特性会给程序代来什么样的变化。静态字段static field,我更习惯称它为“类的字段”,即它与类的具体实例无关,对于所有线程里,它的值都是一个,即它的唯一性。如代码:class Instance{ static DataContext context=new LinqToSql(conn); protected static DataContext {get{return context;}}}上面的代码中,context为静态字段,它的值在所有线程中都...
阅读全文
摘要:网站bin目录下的程序集一般由系统项目,项目引用的外部DLL及外挂DLL组成,它们在网站运行时会自动加载,这一点很重要,项目本身DLL及项目引入的DLL会自动加载,这没有问题,而外挂在bin目录的DLL也会自动加载,这很重要,因为,它可以使我们的应用程序更加灵活,在开发通用功能上,也显得扩展性更强!一个例子,比如一个HttpModule,它是一个通用的功能,向页面添加一些缓存过期的共用信息,这对于你所有网站都是共用的,这时,可以建立一个HttpModule项目,它代码可能是这样namespace TestHttpModule{ public class SEOModule : IHttp...
阅读全文
摘要:在 Visual Basic 中,数据类型是基于其类别实现。根据特定类型的变量存储的是自己的数据还是指向数据的指针,可以对 Visual Basic 数据类型进行分类。如果它存储的是自己的数据,则它是值类型;如果它保存指向内存中其他位置的数据的指针,则它是引用类型。值类型如果数据类型在它自己的内存分配中存储数据,则该数据类型就是“值类型”。值类型包括:所有数字数据类型Boolean、Char和Date所有结构,即使其成员是引用类型枚举,因为其基础类型总是SByte、Short、Integer、Long、Byte、UShort、UInteger或ULong每个结构是值类型,因此,即使它包含引用类
阅读全文
摘要:你是否真正了解TransactionScope?相关文章将不确定变为确定~transactionscope何时提升为分布式事务将不确定变为确定~transactionscope何时提升为分布式事务~续将不确定变为确定~transactionscope何时提升为分布式事务~再续(避免引起不必要的MSDTC)一 了解事务选项,用它来控制嵌套事务 public enum TransactionScopeOption { //如果存在环境事务(我认为应该叫嵌套事务,氛围事务,ambient transaction),那么就加入其中, 如果不存在就创建新事务。如果...
阅读全文
摘要:无论是.net还是java,在开发程序时都难免会用到throw关键字,对于初学者一般会认为它与try...catch捆绑在一起,这当然是错误的,事实上,throw的一个最重要的作用就是:让程序告诉用户一些事情,这些事情一般是开发人员之前定义好的,如对于一个输入文本框,你需要输入给定数字,但如果输入的不是给定的数据范围,则可以通过throw告诉用户!让程序告诉开发人员一些事情,这些事情一般是底层开发人员之前定义好的,如果一些业务规范,如果开发人员输入的不合法,程序就会抛出一个异常,以告诉表层开发人员!下面是一个程序中的throw用法: if (vp.ContainsKey("f...
阅读全文
摘要:位运算无论在C#,VB还是在T-SQL里都有对它支持,位运算即对数值类型的每位进行计算,对于程序里,你可以使用十进制,十六进制,二进制对它进行位运算,事实上无论你使用哪种进制,对于计算机来说最后都为把它转换成二进制(0,1)的形式,因为二进制为简单,呵呵。下面是关于位运算的表格运算符号位运算操作符运算对象类型运算结果类型对象操作数实例~非运算整型整型1个~x&与运算2个x & y|或运算2个x | y^异或运算2个x ^ y<<左移运算2个x << 2>>右移运算2个x >> 2一般地,这种位运算中,我们的操作数多用于2的N次方的
阅读全文
摘要:在时我们需要搞清楚一些值类型的初始值,即当你声明一个变量后,它事实上是有一个默认值的,下面选自MSDN:http://msdn.microsoft.com/zh-cn/library/83fhsxwc.aspx值类型默认值boolfalsebyte0char'\0'decimal0.0Mdouble0.0Denum表达式 (E)0 产生的值,其中 E 为 enum 标识符。float0.0Fint0long0Lsbyte0short0struct将所有的值类型字段设置为默认值并将所有的引用类型字段设置为null时产生的值。uint0ulong0ushort0下表显示了整型的大小
阅读全文
摘要:首先,非常感谢赵老大的CodeTimer,它让我们更好的了解到代码执行的性能,从而可以让我们从性能的角度来考虑问题,有些东西可能我们认为是这样的,但经理测试并非如何,这正应了我之前的那名话:“机器最能证明一切”!费话就不说了,看代码吧: 1 /// <summary> 2 /// 执行代码规范 3 /// </summary> 4 public interface IAction 5 { 6 void Action(); 7 } 8 9 /// <summary> 10 /// 老赵的性能测试工...
阅读全文
摘要:委托,一个不错的东西,.net中的委托用着挺爽,它的重要性以至于微软把它单拿出来,定义了几个现成的委托,如,Func和Action,既然人家把最特殊的委托签名拿 出来了,所以咱们就不自己去定义了,就用Func和Action委托去讲一个如何定义他们的实例吧,呵呵。第一 规规矩矩定义方法method1 /// <summary>2 /// 与Func<string>相同的方法签名3 /// </summary>4 /// <returns></returns>5 static string StandardFunc() ...
阅读全文
摘要:事实上,本扩展主要是将linq中的lambda表达式的写法改为了传统的SQL写法Dynamic Expressions and Queries in LINQDatabase applications frequently rely on “Dynamic SQL”—queries that are constructed at run-time through program logic. The LINQ infrastructure supports similar capabilities through dynamic construction of expression trees
阅读全文
摘要:.net中的事务可以分为显式的和稳式的,显式的就是说需要我们手动去指定事务的提交和回滚,而稳式的是.net帮助我们进行管理的,当你的事务代码段没有发生异常时,它会帮助我们进行提交,反之,进行事务加滚,这也是合情合理的。以下是MSDN中的说明:CommittableTransaction类为应用程序使用事务提供了一种显式方法,而不是隐式地使用TransactionScope类。与TransactionScope类不同,应用程序编写器需要明确调用Commit和Rollback方法以提交或中止事务。但是,只有事务的创建者才能提交事务。因此,通过Clone方法获得的可提交事务的副本不是可提交的。显式事
阅读全文
摘要:众所周知,自从.net中出现了特性(attribute)之后,代码变得更加简洁,可读性更强了,今天主要说一下Conditional特性,Conditional它主要是约束你的代码段在哪种条件下进行执行,我们今天主要针对DEBUG和TRACE这两个条件约束,它们可以当作是Conditional特性的输入参数,形式如下:1 [Conditional("DEBUG")]2 protected static void LogDebugInfo()3 {4 //在debug模式输出一些调试信息5 Console...
阅读全文
摘要:我之前写一篇关于事件订阅的文章(事件的好处~实现对修改的封闭,对扩展的开放!~续),但它主要是订阅静态事件,而今天主要讲的是实例事件,即,当一个事件发布者被实例化后,去订阅它里面的事件,然后当这个事件发布者去触发该事件时,自己执行你订阅的内容,这没什么可说的,一切都很正常。但在B/s系统中,常常都有这样一种需求,即:Order类中有方法GeneratorOrder,即生成订单的方法,这个方法会被UI层的很多方法调用,以实现对不同业务产品的购买,如:购买家电产品,购买成功后应该去和家电有关的成功页;而购买日常用品,成功后应该去与日常用户相关的页面;以后还会有其它业务产品的成功页,需要我们去实现。
阅读全文
摘要:概念:一个对象的延迟初始化(也称延迟实例化)意味着该对象的创建将会延迟至第一次使用该对象时。延迟初始化主要用于提高性能,避免浪费计算,并减少程序内存要求。以下是最常见的方案:有一个对象的创建开销很大时,应用程序可能不会使用它。例如,假定您在内存中有一个Customer对象,该对象的Orders属性返回一个Orders对象。初始化Orders对象可能需要创建Orders对象的一个大数组(Orders[]),并可能需要数据库连接。如果用户从不访问Orders属性,则没有理由使用系统内存或计算周期来创建Orders对象。通过使用Lazy<Orders>将Orders对象声明为延迟初始化,
阅读全文
摘要:当进行“与”运算时,从左向右比较,出现一个为false时,立即退出,不会比较后台的,即使后面的有异常程序也不报错 当进行“或”运算时,从左向右比较,出现一个为true时,立即退出,不会比较后台的,即使后面的有异常程序也不报错 List<int> arr = null; if ( arr != null && arr.Count > 0) //其实arr.Count会报语法错误,但这里是正确的用法,先比较是否为null,如果为空,后面的语句则不会被执行 Console.WriteLine("ok"); else ...
阅读全文
摘要:一个人(people),在他60岁之后,就宣布进入晚年了,在这个期间要多注意身体,多体检。namespace NET基础才是重中之重{ /// <summary> /// 人类 /// </summary> public class People { private int age; public string name = "张占占"; //姓名 public string gander = "男"; // 性别 #region 构造方法 public People...
阅读全文
摘要:.NET中使用stack(栈)和heap(堆)两种结构在内存中存储数据,今天咱们就来说说这两个结构Value Types,值类型 在C#中,值类型继承自System.ValueType的,它们分别是 Bool, byte , char, decimal, double, enu, float, int, long, sbyte, short, struct, uint, ulong, ushortReference Types 引用类型引用类型包括所有的从System.Object继承下来的类型,它们分别是 class, interface, delegate, object,string,其
阅读全文
摘要:很多人都不用var,说它在运行时会影响程序的性能,比如下面两个var i = 10; // implicitlyint i = 10; //explicitly说强类型比隐式类型的运行时效率高,其实不是这样的,这两行代码运行时效率一样,因为var是在编译时由编译器把它解释成强类型的。从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型 var。 隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。所以,以后大家可以放心的用var了,呵呵,只是程序可读性不如强类型。最后说一名,对不起“var",我之前一直冤枉你了。
阅读全文
摘要:我们挂在嘴过的一句话就是“static是静态对象,在类第一次被使用,或者第一次被实例化时执行“,但是你是否真正理解这句话,或者说你是否有对这句话进行一个实际的验证,如果没有,那我来带您完成这次旅行吧!首先有一张表,不会经常发生变化,比如分类表,他是一种树型结构表,结构可能是这样 1 /// <summary> 2 /// 分类表 3 /// </summary> 4 public partial class Common_Category : IDataEntity 5 { 6 //初始字段 7 #region o...
阅读全文
摘要:派生类可以直接强转为类基类型,而反之则不可以,它们的集合也具有这种特性以下实例是parent是基类,sub是它的派生类,如果有一个sub类型的集合希望转换为parent,那是可以的,它可以广泛的应用于面向接口和面向抽象的编程环境中。 1 class parent 2 { 3 public string name { get; set; } 4 } 5 class sub : parent { } 6 7 #region 由派生类集合强转成父类集合(正确) 8 List<sub> sublist ...
阅读全文
摘要:上一篇文章主要让大家知道了基类与派生类,及它们的转换关系,即它们不能相互转换,只能从派生类转换到基类,下面来看一个抽象类和它派生类实现的一种编程方式,即面向抽象的编程。以下是面向抽象的编程实例:(完整代码) 1 /// <summary> 2 /// 基类 3 /// </summary> 4 abstract class parent 5 { 6 public string name { get; set; } 7 } 8 /// <summary> 9 /// 派生类110 /// </summary>...
阅读全文
摘要:对于一个程序员来说,有必要知道一个概念的同时也解它的执行过程,这样对于写出更好更安全的程序是有帮助的。大牛们不是一天就成为大牛的,而是经过一步一步的实践,不断的知识的积累才成为大牛的,呵呵。今天是我“基础才是重中之重”文章系列的又一讲,也是最基础的一讲,类,已经class主要从出生到死亡都讲一下,呵呵。1 类的建立public class Person{static person(){} //不写,默认也有个空的public person(){}//不写,默认也有个空的public string Name{get;private set;} //属性,只对本类开放写权限}这样,一个人就产生了,
阅读全文
摘要:我们在服务器上安装Win2003时,有时会遇到硬盘驱动导致的故障。2003操作系统已经发布多年,对近年来服务器上使用的一些新型SATA或SCSI控制器并不能很好地支持。由于2003内置的驱动程序无法识别新型的SCSI或SATA控制器,因此安装2003时会出现安装向导找不到硬盘,无法继续安装。解决这种问题的标准方法应该是在光盘启动时根据屏幕提示按下F6键,然后安装向导会提示我们插入包含硬盘控制器驱动程序的软盘,这样安装向导就可以从软盘中加载硬盘控制器的驱动,然后就可以顺理成章地识别硬盘了。由于软驱已经不再是计算机上的标准配置了,因此使用软盘加载驱动的方法在无软驱的服务器上会遇到麻烦,因此今天我们
阅读全文

浙公网安备 33010602011771号