<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[c#天堂]]></title>
<link>http://blog.pfan.cn/Csharpsky</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[WF持久化机制剖析]]></title>
		<link>http://blog.pfan.cn/Csharpsky/31109.html</link>
		<description><![CDATA[1 为什么要持久化状态？ 
&nbsp;
1.1 内存是有限的，将等待或者休眠的流程暂时从内存中卸载有利于提供性能
1.2 运行时可能会出现不稳定因素导致流程崩溃，持久化可以提供流程恢复的可能
1.3 流程中的事务或者补偿机制需要隔离的流程状态来辅助完成
2 什么时候会发生流程被持久化？
2.1 在流程中加入的活动被标有PersistOnClose属性，这是人为设定的强制持久化策略， 即流程执行到该步骤必须要保存一下，不表示从内从中卸载。
2.2 活动的运行时状态被设置为Executing时（即运行中）（如果DelayActivity），下一个活动必须在将来的某个时候到达， 这时引擎会决定使流程进行持久化。
2.3 当在流程实例之外手动调用卸载流程的方法时会导致持久化
2.4 当具有补偿特性的活动(如CompensatableSequenceActivity)被创建多于一个执行上下文时会发生持久化（请原谅这话说的有点专业，因为解释它需要费长篇大论）
3 什么时候会发生流程被反持久化？
流程被保存后是不具有自我激活的功能的，必须通过外部方法去激活它。
3.1 当调用引擎的获取一个工作流实例的方法时， 如果实例不在内存中，引擎会自动向已注册的持久化服务发出装载其状态的指令
4 什么是流程阻塞态？
4.1 在流程执行过程中，当遇到例如Delay这样的活动时，流程被指示进入休眠状态（钝化）,即被挂起， 此时流程根活动被标记为阻塞态，引擎发出持久化指令。
4.2 什么时候出现非阻塞态持久化化行为？
4.2.1 手动调用持久化或者设置持久化点（PersistOnCloseAttribute）的时候
5 什么是流程锁定态?
5.1 当流程执行从事务范围（TransacationScope）退出或结束了一个具有持久点标记的活动时， 引擎自动持久化该流程状态，此时流程被标记为锁定态，即独占的。
5.2 为什么需要这个状态？
5.2.1 因为流程实例有可能被多个HOST加载，如果没有这个状态表示， 当出现上述情况时，使开发者可以根据自己的设计要求去做排他操作，这样流程状态会发生紊乱，或破坏局部流程的原子操作。
6 如何唤醒流程？
6.1 流程被持久化以后就变成了数据，而不具有任何行为，所以它不具有自我唤醒的功能
6.2 流程可以通过定时器轮]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-11-23 09:26:00</pubDate>
		</item>
				<item>
		<title><![CDATA[从这里开始认识&nbsp;MS&nbsp;Workflow&nbsp;Foundation(即&nbsp;WF)]]></title>
		<link>http://blog.pfan.cn/Csharpsky/31108.html</link>
		<description><![CDATA[从这里开始认识 MS Workflow Foundation(即 WF)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近正在学习WF，收集了一些资料，再此也提供出来供有兴趣的朋友参考。1.系统必备&nbsp;
—我们需要安装WinFX（下载）和Visual Studio 2005 extensions for .NET Framework 3.0 (Windows Workflow Foundation)。这是我们必备的开发组件。 
—WF作为net3.0的一部分发布，要运行需要安装net3.0
—&nbsp;WF提供了一个在VS2005中可视化设计工作流的设计器,Visual Studio 2005 Extensions for Windows Workflow Foundation,只有安装后才能在VS2005中建立WF项目。2.WF是什么？&nbsp; 
—WF本身并不是一个业务平台，它只是为开发人员提供创建工作流软件的一个平台，也就是说WF不是工作流应用平台，而是一个开发工作流应用的平台。 
&nbsp;—MS将WF作为Vista的一个基本API发布，而不是一个独立的软件(如BizTalk，Office)。 3.WF适合做什么？
&nbsp;—使用WF可以开发具有以下特点的工作流平台： 
&nbsp;&nbsp;&nbsp;&nbsp;1.业务流程辅助办公软件&nbsp;&nbsp;&nbsp; 2.软件内部工作的顺序控制&nbsp;&nbsp;&nbsp; 3.自动筛选查询类系统&nbsp;&nbsp;&nbsp; 4.自动化控制中 
4.WF的工作模式&nbsp;
—WF提供了两类工作流模式，流模式（Sequential）与状态机模式(State Machine ):
&nbsp;—顺序工作流 非常适合以下类型的操作，即该操作由依次执行直至最后一个活动完成的步骤的管线表示。但是，顺序工作流的执行并非完全是顺序的。它们仍然可以接收外部事件或者启动并行任务，在这种情况下，确切的执行顺序可能有所不同。 
—状态机工作流 由一组状态、转换和操作组成。首先，将一个状态表示为起始状态，然后，基于事件执行向另一个状态的转换。状态机工作流可以具有确定工作流结束的最终状态。
—可以简单的将状态机模式看成是有交互点与G]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-11-23 09:26:00</pubDate>
		</item>
				<item>
		<title><![CDATA[用javascript实现html页面之间的参数传递的四种方法&nbsp;]]></title>
		<link>http://blog.pfan.cn/Csharpsky/27101.html</link>
		<description><![CDATA[我们知道，在服务器端asp，jsp等程序可以接受html页面上的form传来的参数。那么，可不可以传递参数给html页面呢。可以。原理：通过window.location.href中的分割符获得各个参数方法一：
/*&nbsp;*函数功能：从href获得参数&nbsp;*sHref:&nbsp;&nbsp;&nbsp;http://www.cscenter.com.cn/arg.htm?arg1=d&amp;arg2=re&nbsp;*sArgName:arg1,&nbsp;arg2&nbsp;*return:&nbsp;&nbsp;the&nbsp;value&nbsp;of&nbsp;arg.&nbsp;d,&nbsp;re&nbsp;*/function&nbsp;GetArgsFromHref(sHref,&nbsp;sArgName){&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;args&nbsp;&nbsp;=&nbsp;sHref.split("?");&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;retval&nbsp;=&nbsp;"";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(args[0]&nbsp;==&nbsp;sHref)&nbsp;/*参数为空*/&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;retval;&nbsp;/*无需做任何处理*/&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;str&nbsp;=&nbsp;args[1];&nbsp;&nbsp;&nbsp;&nbsp;args&nbsp;=&nbsp;str.split("&amp;");&nbsp;&nbsp;&nbsp;&nbsp;for(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;args.length;&nbsp;i&nbsp;++)&nbsp;&nbsp;&nbsp;&nbsp;{&nb]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-06-26 15:10:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C#中对Excel的操作&nbsp;]]></title>
		<link>http://blog.pfan.cn/Csharpsky/26881.html</link>
		<description><![CDATA[Excel表格文档由于其简单易用，普遍应用于不少单位或部门，因而在编写应用程序过程中，有时会需要对Excel文档进行操作，最简单的情况通常有两种：（1）需要获取文档中一些单元格的值；（2）将文档导入至数据库。
&nbsp;
1).在操作Excel文档之前，需要添加对Excel对象库的引用：
引用—COM—Microsoft Excel 11.0 Object Library（版本号可能不同）
&nbsp;
2).以下代码示意打开一个已有的Excel文档的第一个sheet页，获取单元格“B1”的内容，并判断其值是否为“my”：
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;Operate(string&nbsp;pFileName)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Excel.Application&nbsp;app&nbsp;=&nbsp;new&nbsp;Excel.Application();//打开一个Excel应用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(app&nbsp;==&nbsp;null)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-06-18 19:13:00</pubDate>
		</item>
				<item>
		<title><![CDATA[.Net&nbsp;机制下委托（一）&nbsp;事件委托]]></title>
		<link>http://blog.pfan.cn/Csharpsky/26805.html</link>
		<description><![CDATA[一、 认识委托&nbsp;&nbsp;&nbsp; 一个简单的例子：&nbsp;&nbsp;&nbsp;&nbsp; 张三看到餐桌上有一个桔子，由于自己怕动（主要是出于自己要玩游戏，走不开），立刻就对着他妈妈喊：“我要吃桔子，妈妈帮我拿过来。”，接着，他妈妈听到乖儿子要吃桔子，就立刻送去给儿子了。&nbsp;&nbsp;&nbsp; 从某种意义上来说，把儿子发出消息要桔子的动作与妈妈送桔子给儿子的动作相关联的过程就称为委托，也就是说儿子发出消息要桔子这个事件委派妈妈根据他的消息内容去完成他想要做的事。&nbsp;二、 理解.net机制下的委托概念&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 关于委托的声明:&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; delegate 返回类型 方法声明（ 参数1，参数2，参数3… ）;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 例如：delegate void ButtonTextChangeEvent( object sender, EventArgs e );&nbsp;&nbsp;&nbsp;&nbsp; 注意：声明一个ButtonTextChangeEvent，就是创建了一个“委托类”，在编译期间，就会产生个委托类在代码区，因而它可以在类里面声明，也可以跟类在同一域（即命名空间中定义），享受与类同等待遇，那么在这个类里面会有一个最关键的函数就是&nbsp;&nbsp;&nbsp;&nbsp; virtual 返回类型 方法声明（参数1，参数2，参数3…）;
图示：&nbsp;
&nbsp;&nbsp;&nbsp; 那么这个Ivoke虚函数是用做干什么的呢？它主要是用来调用某个绑定了的函数，说白了，delegate充其量就是一个中间件（相当于我们所见的媒婆）。&nbsp;namespace ConsoleApplicationTest{//声明一个委托(如果您学过C++那么它很像C++里面的typedef.)&nbsp;&nbsp;&nbsp; public delegate int FunPtr();&nbsp;&nbsp;&nbsp; public class A&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-06-15 10:22:00</pubDate>
		</item>
				<item>
		<title><![CDATA[用C#编写发手机中文短信息Windows服务]]></title>
		<link>http://blog.pfan.cn/Csharpsky/26659.html</link>
		<description><![CDATA[最近在电脑城上买了一根NOKIA3210的数据线，玩了几天改LOGO、改铃声后也将数据线扔在一边。直到前几天在Http://oxygensoftware.com上看到有发手机短信息的二次开发控件，才想起多日不用的数据线，而且最近在学C#，觉得用C#做个发短信息的程序也不错，经过多天的测试，终于实现用电脑+数据线+手机的模式，实现在单位的局域网平台上发送短信息了。 
　　由于在单位使用到发手机短信息的地方有很多，可能是从网页、可能是OUTLOOK中的窗体、也可能是某台非Windows操作系统的主机的某个系统，所以经过思考探讨，觉得最好的解决方案是采用Windows的“服务”，定时从一个目录中固定格式的文本文件中读取出相应的信息，发送出去。而其它客户端只需往该目录写入文本信息即可。思路定下来后就让我们开始吧！ 
　　先交待一下开发平台：Windows 2000 Advance Server操作系统、Visual Studio .Net 、Oxygen Sms ActiveX Control V2.3 （Share Ware）、 Nokia 3210手机通过数据线接在COM1上。运行Visual Studio .Net，新建一个C#的项目，选择“Windows Server”类型的项目，命名为“SmsServer”。在Server1的设计画面，将“ServerName”命名为“SmsServer”。点击“视图设计器按钮”切换到设计画面，在“Windows Forms”工具箱中拖一时钟控件，命名为“SmsTimer”，在“Components”工具箱中拖一“EventLog”控件。命名为“eventLog1”。在“项目”菜单中点击“添加引用”，选择“COM”页，浏览到安装Oxygen Sms ActiveX Control V2.3程序的目录，找到SMSControl.ocx添加到“选定的组件”中。 
　　将Server1.cs代码替换为 
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; using System.IO; using]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-06-11 11:48:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C#编写IP_MAC防欺骗程序]]></title>
		<link>http://blog.pfan.cn/Csharpsky/26658.html</link>
		<description><![CDATA[单位的学生成绩管理系统是ASP.NET做的，很担心非法人员修改。为了方便管理，单位的每台机子IP是固定的。由于只是允许办公计算机访问成绩修改的页面，计算机数量并不多，所以我把所有办公计算机的IP－MAC专门做一张数据库表，且一一对应。操作之前判断来访的IP－MAC地址，且IP－MAC成对限制。两个地址必须同时正确才可以访问，若不一致则拒绝访问，并且记录该信息，方便我们找出非法操作者。这是我们最初方案，但是程序做好以后，却发现了新的问题。当有人要做非法操作，会出现以下情况：只修改IP、只修改MAC、同时修改IP－MAC。对于前两种情况，我们的服务器端已全可以判断、限制了。但是对于情况三，非法操作者成对修改IP－MAC，而且该IP－MAC对是其他被授权的主机的正确IP－MAC对，在服务器端我们已经无力限制。于是便有了方案二：做一个判断MAC地址是否被修改的Windows服务，这个服务安装在每个客户机上，如果MAC地址被修改，关闭客户端的IE，从而限制访问， 方案一服务器端实现，实现的关键代码如下：using System.Runtime.InteropServices ;//请注意引用动态链接库，则需要此命名空间，它提供各种各样支持 COM interop 及平台调用服务的成员。其中最重要的属性有 DllImportAttribute（可以用来定义用于访问非托管 API 的平台调用方法）[DllImport("iphlpapi.dll", ExactSpelling=true)] //在.net中使用动态链接库public static int SendARP( int DestIP, int SrcIP, [Out] byte[] pMacAddr, ref int PhyAddrLen ); [DllImport("Ws2_32.dll")] private static extern Int32 inet_addr(string ip);private void Button1_Click(object sender, System.EventArgs e){string client_ip=Request.UserHostAddress ;//获得客户端IPLabel_ip.Text =client_ip;Int32 ldest= inet_addr(clien]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-06-11 11:43:00</pubDate>
		</item>
				<item>
		<title><![CDATA[c#中异步基于消息通信的完成端口的TCP/IP协议的组件实现(源代码)&nbsp;服务器端]]></title>
		<link>http://blog.pfan.cn/Csharpsky/26657.html</link>
		<description><![CDATA[using System;using System.IO;using System.ComponentModel;using System.Collections;using System.Diagnostics;using System.Net;using System.Net.Sockets;using System.Threading;
namespace MyKJ...{&nbsp;&nbsp;&nbsp; /**//// &lt;summary&gt;&nbsp;&nbsp;&nbsp; /// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的服务端 &nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;&nbsp;&nbsp;&nbsp; public class MyTcpIpServer : System.ComponentModel.Component&nbsp;&nbsp;&nbsp; ...{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int bufferSize=2048;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string tcpIpServerIP="";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int tcpIpServerPort=11000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Socket listener=null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private ManualResetEvent allDone = new ManualResetEvent(false);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private ManualResetEvent sendDone = new ManualResetEvent(false);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Thr]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-06-11 11:42:00</pubDate>
		</item>
				<item>
		<title><![CDATA[c#中异步基于消息通信的完成端口的TCP/IP协议的组件实现(源代码)&nbsp;客户端&nbsp;]]></title>
		<link>http://blog.pfan.cn/Csharpsky/26656.html</link>
		<description><![CDATA[using System;using System.IO;using System.ComponentModel;using System.Collections;using System.Diagnostics;using System.Net;using System.Net.Sockets;using System.Threading;
namespace MyKJ...{&nbsp;&nbsp;&nbsp; /**//// &lt;summary&gt;&nbsp;&nbsp;&nbsp; /// MyTcpIpClient 提供在Net TCP_IP 协议上基于消息的客户端 &nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;&nbsp;&nbsp;&nbsp; public class MyTcpIpClient : System.ComponentModel.Component&nbsp;&nbsp;&nbsp; ...{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int bufferSize=2048;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private string tcpIpServerIP="127.0.0.1";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int tcpIpServerPort=11000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Socket ClientSocket=null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private ManualResetEvent connectDone = new ManualResetEvent(false);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private ManualResetEvent sendDone = new ManualResetEvent(false);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-06-11 11:41:00</pubDate>
		</item>
				<item>
		<title><![CDATA[我的&nbsp;C#+flash&nbsp;socket&nbsp;聊天程序(C#源代码)]]></title>
		<link>http://blog.pfan.cn/Csharpsky/26655.html</link>
		<description><![CDATA[此篇文章为roading所有,欢迎转载,但请注明原处.
看见还有很多人在研究flash的socket,其中经常会出现一些问题,所以将我以前写的一个程序代码拿出来给大家参考...
这是c#的代码,经过测试的,本来想把源程序都放上来,可以我用的是vs2005(而且现在又坏了,系统出问题了),下面是程序的主要源代码,不包含一些自动生成的代码.这些代码是根据一个开源的C#socket程序改编的,而且我已经写了比较详细的注释了,如果你看了这些代码还是发现有问题,可以向我索取完整的源程序:
把源文件传上来,大家可以下载(gmail又打不开了,不能给留email的同学发了,自己下载吧):
&nbsp;点击下载此文件//--------------------------------
//---------------------------------------------------------------------------------------------------------------//form1.csusing System;using System.IO;using System.Drawing;using System.Collections;//ArrayList引用到这个命名空间的类using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.Net;using System.Net.Sockets;using System.Threading;
namespace ChatServer//服务器端命名空间{&nbsp;/// &lt;summary&gt;&nbsp;/// Form1 的摘要说明。&nbsp;/// &lt;/summary&gt;&nbsp;public class Form1 : System.Windows.Forms.Form&nbsp;{&nbsp; private int listenport = 9050;//监听端口&nbsp; private TcpListener listener;//监听者&nbsp; private ArrayList clients;//所有的client&nbsp]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-06-11 11:39:00</pubDate>
		</item>
				<item>
		<title><![CDATA[用C#编写获取远程IP,MAC的方法]]></title>
		<link>http://blog.pfan.cn/Csharpsky/26653.html</link>
		<description><![CDATA[如果要想获得远程的地址，需要用sendarp这个函数来实现。具体的代码如下： [DllImport("Iphlpapi.dll")] private static unsafe extern int SendARP(Int32 dest,Int32 host,ref IntPtr mac,ref IntPtr length); [DllImport("Ws2_32.dll")] private static extern Int32 inet_addr(string ip); Int32 ldest= inet_addr("157.60.68.163");//目的地的ip Int32 lhost= inet_addr("157.60.68.33");//本地的ip try { Byte[] macinfo=new Byte[6]; Int32 length=6; IntPtr mac=new IntPtr(macinfo[0]); IntPtr len=new IntPtr(6); int ii=SendARP(ldest,lhost, ref mac, ref len); Console.WriteLine("Mac Add:"+mac); Console.WriteLine("length:"+len); } catch(Exception err) { Console.WriteLine(err); }]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-06-11 11:31:00</pubDate>
		</item>
				<item>
		<title><![CDATA[treeview问题.每个结点包含多个值的实现。（添加、删除、拖拉、连接数据库等]]></title>
		<link>http://blog.pfan.cn/Csharpsky/26418.html</link>
		<description><![CDATA[利用TreeNode&nbsp;的&nbsp;Tag属性，因为它是一个很灵活的属性，它的类型可以定义成任何类型，包括自定义类型。我们定义一个如下的类：public&nbsp;class&nbsp;TreeNodeTag{public&nbsp;string&nbsp;ID&nbsp;;//当前ID值public&nbsp;string&nbsp;LB;//类别public&nbsp;string&nbsp;parentID;//父节点IDpublic&nbsp;int&nbsp;js;//级数public&nbsp;string&nbsp;zf;//是否作废}那么在定义TreeNode的时候应该如下设置它的Tag值TreeNode&nbsp;node&nbsp;=&nbsp;New&nbsp;TreeNode();TreeNodeTag&nbsp;Ttag&nbsp;=&nbsp;New&nbsp;TreeNodeTag();Ttag.ID="12"'Ttag.js="1";Ttag.LB="资产类";node.Tag=Ttag;node.Text="测试节点";以下是如何取节点的多个数据信息：假如node是TreeView的一个节点，要得到它的各种信息如下：TreeNodeTag&nbsp;Ttag&nbsp;=&nbsp;node.Tag&nbsp;as&nbsp;TreeNodeTag;string&nbsp;ID=&nbsp;Ttag.ID.Trim();string&nbsp;js=&nbsp;Ttag.js.Trim();string&nbsp;LB=&nbsp;Ttag.LB.Trim();这样就完成了一个树节点的存取工作了。]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-06-04 21:15:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C#中判断空字符串的3种方法性能分析]]></title>
		<link>http://blog.pfan.cn/Csharpsky/25293.html</link>
		<description><![CDATA[C#中判断空字符串的3种方法性能分析
&nbsp;3种方法分别是：string a="";1.if(a=="")2.if(a==String.Empty)3.if(a.Length==0)
3种方法都是等效的，那么究竟那一种方法性能最高呢？本人用实验说明问题。
建立3个aspx页面（为什么用网页，主要是利用Microsoft Application Center Test ）
WebForm1.aspxprivate void Page_Load(object sender, System.EventArgs e)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;string a="";&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;=1000000;i++)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;if(a=="")&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;}
WebForm2.aspxprivate void Page_Load(object sender, System.EventArgs e)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;string a="";&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;=1000000;i++)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;if(a==String.Empty)&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;}
WebForm3.aspxprivate void Page_Load(object sender, System.EventArgs e)&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;string a="";&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;=1000000;i++)&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbs]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-04-28 16:03:00</pubDate>
		</item>
				<item>
		<title><![CDATA[类继承中构造函数和析构函数的调用]]></title>
		<link>http://blog.pfan.cn/Csharpsky/25292.html</link>
		<description><![CDATA[类继承中构造函数和析构函数的调用
现在，有三个类，类的定义如下
class CA{public:&nbsp;CA(){cout&lt;&lt;"CA constructor"&lt;&lt;endl;}&nbsp;&nbsp;&nbsp;&nbsp; ~CA(){cout&lt;&lt;"CA desstructor"&lt;&lt;endl;}
};
class CB:public CA{public:&nbsp;CB(){cout&lt;&lt;"CB constructor"&lt;&lt;endl;}&nbsp;&nbsp;~CB(){cout&lt;&lt;"CB desstructor"&lt;&lt;endl;}};
class CC:public CB{public:&nbsp;CC(){cout&lt;&lt;"CC constructor"&lt;&lt;endl;}&nbsp;&nbsp;~CC(){cout&lt;&lt;"CC desstructor"&lt;&lt;endl;}};
CA是爷爷，CB是爸爸，CC是儿子。
那么任何一本C++的书都会讲，构造函数的调用顺序是CA CB CC，析构函数的调用顺序是CC,CB,CA，什么？？？你的书没讲，靠，扔了吧
于是
(1) int main(){&nbsp;&nbsp; CC p ;}这个程序运行结果是CA constructorCB constructorCC constructor
CC desstructorCB desstructorCA desstructor
靠，太简单了，一个鸡蛋飞过来了，：（
继续……………………
(2) 再做第二个试验之前，先做一点小小修改~CA(){cout&lt;&lt;"CA desstructor"&lt;&lt;endl;}&nbsp; -----&gt;&gt;&gt;virtual&nbsp; ~CA(){cout&lt;&lt;"CA desstructor"&lt;&lt;endl;}
修改main 代码如下int main(){&nbsp;&nbsp; CA * p = new CC();
&nbsp;&nbsp; delete p;
&nbsp;&nbsp; return 0;}
yeah结果一模一样哦]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-04-28 16:02:00</pubDate>
		</item>
				<item>
		<title><![CDATA[史上20个最令人讨厌的技术产品排行榜]]></title>
		<link>http://blog.pfan.cn/Csharpsky/25291.html</link>
		<description><![CDATA[IT无大事，PC World编写了一个名单，列出了史上最令人讨厌的技术产品。前10个来源于读者的投票，后面10个是编辑们想增加浏览量添上去的。排在第一位的是AOL免费发送的CD，自1993年起到2006年，AOL发放的CD超过10亿张，对环境造成了可怕的灾难，也令很多人苦恼。" 2.Windows Me (2000)：千年（Millennium）应该指的是修补程序故障要花的时间3.Apple iTunes, Microsoft Windows Media Player, Microsoft Zune, Napster (2003至今)；糟糕的DRM4.McAfee Internet Security, Symantec Norton Internet Security (1998至今)：唠叨的软件，我们的电脑已经够糟了，它们还要添乱，时不时的提醒你去升级或者购买新版。5.Real Networks (Progressive Networks) RealPlayer (1996到2004)：声名狼藉的Real总是想从你身上攒钱6.Bonzi Buddy (1999-2004)7.MySpace (2003 至今）8.Microsoft Windows Vista (2007)：对硬件的苛求，令人讨厌的“取消—继续”提示。9.Microsoft Windows Update (1998年 至今)：喜欢WGA吗？10.Apple QuickTime for Windows (2001 至今)：如果你安装了它，你会发现它会阴魂不散的跟着你。" 后面还有Microsoft Office 97 (1997)；Adobe (Macromedia) Flash (1996年至今)；AOL Instant Messenger, Microsoft Windows Messenger, Yahoo Messenger (1997 至今)；Sony PlayStation 3 (2006)；eBay (1995 至今)；Microsoft Office Outlook 2003 (2003)等等。PC World还总结了14条让消费者生气的方法：第一条就是安装或卸载软件时强迫用户重启电脑。]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-04-28 16:02:00</pubDate>
		</item>
				<item>
		<title><![CDATA[&quot;==&quot;和equals方法有什么区别]]></title>
		<link>http://blog.pfan.cn/Csharpsky/24158.html</link>
		<description><![CDATA[&nbsp;&nbsp;
"=="和equals方法有什么区别
&nbsp;==是判断两个变量或实例是不是指向同一个内存空间equals是判断两个变量或实例所指向的内存空间的值是不是相同
==是指对内存地址进行比较 squals()是对字符串的内容进行比较 
==指引用是否相同 equals（）指的是值是否相同 
A.==操作符专门用来比较变量的值是否相等,由于变量名只是内存地址的引用名称,所以而不代表变量本身,由此可知道变量的值指的是好像某一块内在地址,请看示例
Int intA=10;
Int intB=10;
int intArrA[]=new int[2];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int intArrB[]=new int[2];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;2;i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intArrA[i]=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intArrB[i]=0;
}
System.out.println("(intA==intB)="+(intA==intB));
System.out.println("(intArrA==intArrB)="+(intArrA==intArrB));
System.out.println("(intArrA[0]==intArrB[0])="+(intArrA[0]==intArrB[0]));
输出结果是:
(intA==intB)=true
(intArrA==intArrB)=false
(intArrA[0]==intArrB[0])=true
从结果可知, intArrA和intArrB是数组名称,故代表的是内存指针,所以上述结论在此可以通过,另外
因: intArrA[0],intArrB[0]分别在不同的地址,所以(intArrA[0]==intArrB[0])好像是在为false,]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-03-21 12:56:00</pubDate>
		</item>
				<item>
		<title><![CDATA[UNION&nbsp;和UNION&nbsp;ALL&nbsp;的区别]]></title>
		<link>http://blog.pfan.cn/Csharpsky/24136.html</link>
		<description><![CDATA[&nbsp;
在数据库中，UNION和UNION ALL关键字都是将两个结果集合并为一个，但这两者从使用和效率上来说都有所不同。
UNION在进行表链接后会筛选掉重复的记录，所以在表链接后会对所产生的结果集进行排序运算，删除重复的记录再返回结果。
实际大部分应用中是不会产生重复的记录，最常见的是过程表与历史表UNION。如： 


select * from gc_dfys 


union 


select * from ls_jg_dfys 


这个SQL在运行时先取出两个表的结果，再用排序空间进行排序删除重复的记录，最后返回结果集，如果表数据量大的话可能会导致用磁盘进行排序。 


而UNION ALL只是简单的将两个结果合并后就返回。这样，如果返回的两个结果集中有重复的数据，那么返回的结果集就会包含重复的数据了。 


从效率上说，UNION ALL 要比UNION快很多，所以，如果可以确认合并的两个结果集中不包含重复的数据的话，那么就使用UNION ALL，如下： 


select * from gc_dfys 


union all 


select * from ls_jg_dfys]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-03-20 17:20:00</pubDate>
		</item>
				<item>
		<title><![CDATA[关于WebService最大的请求问题]]></title>
		<link>http://blog.pfan.cn/Csharpsky/24134.html</link>
		<description><![CDATA[我写了一个传输文件的WebService当我传一个大于3MB的XML文件时出现如下错误:System.Web.Services.Protocols.SoapException: 在运行配置文件中指定的扩展时出现异常。 ---&gt; System.Web.HttpException: 超过了最大请求长度。at System.Web.HttpRequest.GetEntireRawContent()at System.Web.HttpRequest.get_InputStream()at System.Web.Services.Protocols.SoapServerProtocol.Initialize()--- 内部异常堆栈跟踪的结尾 ---at System.Web.Services.Protocols.SoapServerProtocol.Initialize()at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean&amp; abortProcessing)3MB以下的XML文件是OK的,是不是WebService有最大请求限制能不能把这个限制改大一点呢帮帮我呀!
在Web.config和App.config中加入&lt;microsoft.web.services2&gt;&lt;messaging&gt;&lt;maxRequestLength&gt;628000&lt;/maxRequestLength&gt;&lt;/messaging&gt;&lt;diagnostics /&gt;&lt;/microsoft.web.services2&gt; maxRequestLength里填入你想要的大小kb为单位详见 ：http://calmzeal.cnblogs.com/archive/2006/01/05/311429.html
&nbsp;
那就配置这个：&lt;configuration&gt;&lt;system.web&gt; &lt;httpRuntime maxRequestLength="4096]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-03-20 13:55:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Xml&nbsp;WebService完全实例解析]]></title>
		<link>http://blog.pfan.cn/Csharpsky/24133.html</link>
		<description><![CDATA[Xml WebService完全实例解析(一)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先,我们必须了解什么是webservice.就概念上来说,可能比较复杂,不过我们可以有个宏观的了解:webservice就是个对外的接口,里面有函数可供外部客户调用(注意:里面同样有客户不可调用的函数).假若我们是服务端,我们写好了个webservice,然后把它给了客户(同时我们给了他们调用规则),客户就可以在从服务端获取信息时处于一个相对透明的状态.即是客户不了解(也不需要)其过程,他们只获取数据.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; webservice传递的数据只能是序列化的数据,典型的就是xml数据,这里我们也只讨论xml数据的传输.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有了一些对xml webservice的初步了解后,我们将切入正题,即是用一个具体的webservice事例的形式来讲解具体的webservice用法,用具体的事例来讲解一个概念我想怎么也要比单纯的说理能让人容易理解吧.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里,我们将以一个简单的分布式课件搜索系统为例来讲解.使用VS2003为编译环境,C#为语言,SqlServcer2000为数据库.(这个例子来源于一位网上朋友的文章的启发,觉得很能代表webservice的特点,就按那个想法做了这么个系统来示例了)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先,明确我们要做什么.我们需要一个对客户的接口,也就是个站点,我们把它称做ServiceGatherSite,它是何种形式都无所谓,甚至它本身并不需要数据库,它只是提供给用户一个查询的接口,真正的服务,普通用户是不接触到的.然后,这里我们还需要若干个提供服务的站点,我们可以称它们为资源站,这里为简单起见,假设有两个资源站,分别叫WebSiteA,WebSiteB,它们可以是不对外公布的,只是为了丰富查询数据而存在.最后,是我们最需要关注的东]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-03-20 13:52:00</pubDate>
		</item>
				<item>
		<title><![CDATA[麻将高级技巧]]></title>
		<link>http://blog.pfan.cn/Csharpsky/23463.html</link>
		<description><![CDATA[中华麻将高级技巧 
中华麻将竞技，历史悠久，远远流长。相传麻将系郑和下西洋时发明，由于长期在海洋上航行，船上的人都很无聊，郑和便想出此种玩耍方法，借以缓解船员们的苦闷。筒（饼）子代表当时的铜钱，一饼便是一个铜板，是当时货币的最小单位。条（索）子代表铜钱以上的单位，大致是“贯”或“串”的意思。万字代表最高货币单位，即万贯的意思。东西南北风代表方向和方位。箭牌中发白代表平安吉祥。而花牌是替代牌，即所谓的听用，花样很多，如财神等，据说是后来添加的，郑和原发明并没有此序列。众所周知，长期以来，麻将被作为是一种较为低级的赌博工具。因此，人们往往感到或想到的就是赌博，而很少想到它的技巧性、灵活性、应变性。更很少有人认识到，麻将作为一种运动，它对人的大脑的锻炼作用，以及性情磨练作用。要达到麻将的正面效应，降低负面恶性，必须提高麻将技巧，使自己成为一个好牌手，高手、甚至跻身超一流之列。 　身心意志修炼1、修炼身心玩麻将必须要有非常好的心理素质和心理承受能力，这里所讲的心理素质，不仅是指对胜负输赢有个平常心，还包括无小人心和无整人之心。如果说，内心世界平常存在着，捞一把、整人之心，对别人钱财、能力忌妒，甚至报复心，均属“心魔”重之列。对于“心魔”较重的人，一般不适合玩麻将，最好不要与麻将沾边。玩麻将时，应重点修炼自己持平时心，不对一付牌，一场竞技的胜负计较。不对大小牌（分值高低）计较。更不能与初学者、牌力弱的人计较或理论。2、修炼竞技心理前面讲述的“心魔”是一个人的日常社会生活中的非善意心理。这里说讲的是牌手在麻将竞技过程中的心理。如，1、大多数的牌手都喜欢“碰牌”，而好牌手则普遍认为“碰牌”属于“恶手”。实战中经典的总结是“上碰下自模”。2、成都麻将竞技中，很多的牌手是“见牌就杠”。在实战中，“杠牌”无功的概率约占55%-60%以上，被抢的概率约占10%，杠上炮的概率约占30%，杠上开花概率仅占1%-5%。“杠牌”在错牌效果方面，实质上与碰牌差不多。因此，在杠后下家自模的情况约占30%左右。在重庆、雅安等地麻将竞技中，见杠得分的情形下，只要不被抢，则多多益善。3、成都麻将竞技中，不少牌手害怕点炮或开出生张后被碰下听，扣牌不打，结果常常将对手逼成大牌。4、上桌就打跟张、划船等等消极打法均表现出竞技心理素质差，这点与牌手的文化素质底蕴深度不够，文化教育与修养不够存在直接的关系。3、修]]></description>
		<author><![CDATA[heilong05]]></author>
		<pubDate>2007-02-25 14:45:00</pubDate>
		</item>
		</channel>
</rss>