博文

[摘录]C#.NET当中一些常见知识点和问题(2009-12-30 22:29:00)

摘要:  语言  
  C#  
  String   对象是不可改变的。每次使用   System.String   类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的   String   对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用   System.Text.StringBuilder   类。例如,当在一个循环中将许多字符串连接在一起时,使用   StringBuilder   类可以提升性能。  
   
  通过用一个重载的构造函数方法初始化变量,可以创建   StringBuilder   类的新实例,正如以下示例中所阐释的那样。  
   
  [C#]  
  StringBuilder   MyStringBuilder   =   new   StringBuilder("Hello   World!");  
   
  设置容量和长度  
  虽然   StringBuilder   对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前   StringBuilder   对象容纳的字符串长度混淆在一起。例如,可以创建   StringBuilder   类的带有字符串“Hello”(长度为   5)的一个新实例,同时可以指定该对象的最大容量为   25。当修改   StringBuilder   时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。可以使用重载的构造函数......

阅读全文(3289) | 评论:0

中国古代思想精髓:天人合一(2009-12-19 23:12:00)

摘要:        中国人最基本的思维方式,具体表现在天与人的关系上。它认为人与天不是处在一种主体与对象之关系,而是处在一种部分与整体、扭曲与原貌或为学之初与最高境界的关系之中。主要有道家、儒家、佛教三家观点。         在儒家来看,天是道德观念和原则的本原,人心中天赋地具有道德原则,这种天人合一乃是一种自然的,但不自觉的合一。但由于人类后天受到各种名利、欲望的蒙蔽,不能发现自己心中的道德原则。人类修行的目的,便是去除外界欲望的蒙蔽,“求其放心”,达到一种自觉地履行道德原则的境界,这就是孔子所说的“七十从心所欲而不逾矩”。         在禅宗来看,人性本来就是佛性,只缘迷于世俗的观念、欲望而不自觉,一旦觉悟到这些观念、欲望都不是真实的. 真如本性自然显现,也就达到最后成佛的境界,因此,他们提出“烦恼即菩提,凡夫即佛”.真正达到觉悟后的境界是什么呢?从某种秤谌看,仍有点象道家的一切顺应自然之意。故禅宗语录有言:“悟得来,担柴挑水,皆是妙道。”“禅便如这老牛,渴来喝水,饥来吃草。”         在道家来看,天是自然,人是自然的一部分。因此庄子说:“有人,天也;有天,亦天也。”天人本是合一的。但由于人制定了各种典章制度、道德规范,使人丧失了原来的自然本性,变得与自然不协调。人类行的目的,便是“绝圣弃智”,打碎这些加于人身的藩篱,将人性解放出来,重新复归于自然,达到一种“万物与我为一”的精神境界。 (摘自 中华文化信息网)......

阅读全文(2303) | 评论:1

存储区域网络SAN(2009-12-17 16:37:00)

摘要: 存储区域网络(SAN)是通过专用高速网将一个或多个网络存储设备和服务器连接起来的专用存储系统,未来的信息存储将以SAN存储方式为主。SAN在最基本的层次上定义为互连存储设备和服务器的专用光纤通道网络,它在这些设备之间提供端到端的通讯,并允许多台服务器独立地访问同一个存储设备。与局域网(LAN)非常类似,SAN提高了计算机存储资源的可扩展性和可靠性,使实施的成本更低、管理更轻松。与存储子系统直接连接服务器(称为直连存储或DAS)不同,专用存储网络介于服务器与存储子系统之间。 SAN被视为迈向完全开放、联合的计算环境进程的第一步。......

阅读全文(1848) | 评论:0

学堂:“iSCSI”是什么?(2009-12-16 17:33:00)

摘要:iSCSI技术是一种由IBM公司研究开发的,是一个供硬件设备使用的可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。   iSCSI技术是一种由IBM公司研究开发的,是一个供硬件设备使用的可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。iSCSI技术是一种新储存技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,使服务器可与使用IP网络的储存装置互相交换资料。   iSCSI:Internet 小型计算机系统接口 (iSCSI:Internet Small Computer System Interface) Internet 小型计算机系统接口(iSCSI)是一种基于 TCP/IP 的协议,用来建立和管理 IP 存储设备、主机和客户机等之间的相互连接,并创建存储区域网络(SAN)。SAN 使得 SCSI 协议应用于高速数据传输网络成为可能,这种传输以数据块级别(block-level)在多个数据存储网络间进行。 SCSI 结构基于客户/服务器模式,其通常应用环境是:设备互相靠近,并且这些设备由 SCSI 总线连接。iSCSI 的主要功能是在 TCP/IP 网络上的主机系统(启动器 initiator)和存储设备(目标器 target)之间进行大量数据的封装和可靠传输过程。此外,iSCSI 提供了在 IP 网络封装 SCSI 命令,且运行在 TCP 上。 如今我们所涉及的 SAN (Storage Area Network),其实现数据通信的主要要求是:1. 数据存储系统的合并;2. 数据备份;3. 服务器群集;4. 复制;5. 紧急情况下的数据恢复。另外,SAN 可能分布在不同地理位置的多个 LANs 和 WANs 中。必须确保所有 SAN 操作安全进行并符合服务质量(QoS)要求,而 iSCSI 则被设计来在 TCP/IP 网络上实现以上这些要求。   ISCSI(Internet SCSI)是2003年IETF(InternetEngineering Task Force,互联网工程任务组)制订的一项标准,用于将SCSI数据块映射成以太网数据包。SCSI......

阅读全文(2126) | 评论:0

解析Windows虚拟存储技术VDS(2009-12-16 16:34:00)

摘要: 摘要:VDS (Virtual Disk Service, 虚拟磁盘业务), 是Windows 2003推出的一项虚拟存储技术,针对目前的中小型企业存储管理现状,它通过一套标准化的存储管理接口,来管理各个厂商的存储阵列以及DAS,从而达到简化管理的目的。VDS提供了一种基础架构,用于管理存储资源,包括磁盘和卷,使得DAS和网络存储资源能够很方便地被使用。这样,不仅减轻了不同厂商采用各自的非标准化管理工具的问题,同时也使管理员对各种存储设备有更加全面的了解。 标签:windows 2003  VDS  虚拟存储 VDS (Virtual Disk Service, 虚拟磁盘业务), 是Windows 2003推出的一项虚拟存储技术,针对目前的中小型企业存储管理现状,它通过一套标准化的存储管理接口,来管理各个厂商的存储阵列以及DAS,从而达到简化管理的目的。VDS提供了一种基础架构,用于管理存储资源,包括磁盘和卷,使得DAS和网络存储资源能够很方便地被使用。这样,不仅减轻了不同厂商采用各自的非标准化管理工具的问题,同时也使管理员对各种存储设备有更加全面的了解。 一 VDS概述 管理网络存储,特别是SAN环境,对于管理员来说,和管理本地存储(DAS)有不同的需求。DAS环境下,由于存储资源和服务器相关联,使得存储资源的分布比较困难,从而导致管理的难题。网络存储,虽然从另一方面来说,整合了存储资源,但是围绕资源的共享,也引入了一系列的管理问题。其中,包括存储设备的检测、发现、访问,以及容错情况下的路由等;因此,需要更多的存储管理人员来处理这些增加的业务。但是,即使增加额外的人员,也并不是一个完整的解决方案。尽管对于企业级市场,高端设备商的存储管理方案已经在市场上推出一些时间,但是对于中小型企业(SMB),各个厂商的存储管理工具软件,还是比较缺乏。而开发这样的工具,对于希望实现网络存储方案的企业,能够简化存储管理的复杂度。 VDS采用COM技术,来消除不同厂商(包括System SW provider,SW Provider,和Hardware Provider)的差异性,从而对上层应用(Application)提供统一的接口,如图-1所示。
图-1 VDS分层框架图 VDS能够提供管理员非常灵......

阅读全文(2551) | 评论:0

Win2003服务器监视中较重要的一些性能计数器(2009-12-14 10:57:00)

摘要:影响服务器性能的四个主要子系统:
内存、处理器、磁盘和网络   什么是性能计数器?
操作系统中内置了各种性能对象,如内存、 处理器、 磁盘、 网络等。
每个性能对象都提供了性能计数器。
性能计数器是于度量性能的各个方面。
如:Memory对象中的Pages/sec计数器可以跟踪记录内存页面调度的速度
什么是计数器日志?
计数器日志可以用于选择收集性能数据的计数器。
使用“性能日志和警报”来创建计数器日志。
计数器日志是按照指定的性能对象、计数器和时间间隔记录硬件资源和系统服务的采样数据。
监视内存系统的计数器:
Pages/sec——被请求页面的数量。
Available Bytes——可用物理内存的数量。
Committed Bytes——已分配给物理 RAM 用于存储或分配给页面文件的虚拟内存。
Pool Nonpaged Bytes——未分页池系统内存区域中的 RAM 数量。
Page Faults/sec——是每秒钟出错页面的平均数量。
监视处理器的计数器:
% Processor Time——测量处理器繁忙的时间
System: Processor Queue Length——处理器请求队列中请求的数量
Server Work Queues: Queue Length——选中的处理器的队列中请求的数量。
Interrupts/sec——处理器正在处理的来自应用程序或硬件的中断的数量
监视磁盘的计数器:
% Disk Time——指示所选磁盘驱动器忙于为读取或写入请求提供服务所用的时间的百分比。
Current Disk Queue Length——指示被挂起的磁盘 I/O 请求的数量。如果这个值始终高于 2,就表示产生了拥塞
Avg.Disk Bytes/Transfer——写入或读取操作时向磁盘传送或从磁盘传出字节的平均数。
Disk Bytes/sec——在读写操作中,从磁盘传出或传送到磁盘的字节速率。
LogicalDisk \% Free Space
监视网络的计数器:
Network Interface:Bytes Sent/sec——使......

阅读全文(3855) | 评论:0

Attribute在.NET编程中的应用(六)(2009-12-13 12:17:00)

摘要:(承上节) .NET Framework拦截机制的设计中,在客户端和对象之间,存在着多种消息接收器,这些消息接收器组成一个链表,客户端的调用对象的过程以及调用返回实行拦截,你可以定制自己的消息接收器,把它们插入了到链表中,来完成你对一个调用的前处理和后处理。那么调用拦截是如何构架或者说如何实现的呢? 在.NET中有两种调用,一种是跨应用域(App Domain),一种是跨上下文环境(Context),两种调用均通过中间的代理(proxy),代理被分为两个部分:透明代理和实际代理。透明代理暴露同对象一样的公共入口点,当客户调用透明代理的时候,透明代理把堆栈中的帧转换为消息(上一节提到的实现IMessage接口的对象),消息中包含了方法名称和参数等属性集,然后把消息传递给实际代理,接下去分两种情况:在跨应用域的情况下,实际代理使用一个格式化器对消息进行序列化,然后放入远程通道中;在跨上下文环境的情况下,实际代理不必知道格式化器、通道和Context拦截器,它只需要在向前传递消息之前对调用实行拦截,然后它把消息传递给一个消息接收器(实现IMessageSink的对象),每一个接收器都知道自己的下一个接收器,当它们对消息进行处理之后(前处理),都将消息传递给下一个接收器,一直到链表的最后一个接收器,最后一个接收器被称为堆栈创建器,它把消息还原为堆栈帧,然后调用对象,当调用方法结果返回的时候,堆栈创建器把结果转换为消息,传回给调用它的消息接收器,于是消息沿着原来的链表往回传,每个链表上的消息接收器在回传消息之前都对消息进行后处理。一直到链表的第一个接收器,第一个接收器把消息传回给实际代理,实际代理把消息传递给透明代理,后者把消息放回到客户端的堆栈中。从上面的描述我们看到穿越Context的消息不需要格式化,CLR使用一个内部的通道,叫做CrossContextChannel,这个对象也是一种消息接收器。 有几种消息接收器的类型,一个调用拦截可以在服务器端进行也可以在客户端进行,服务器端接收器拦截所有对服务器上下文环境中对象的调用,同时作一些前处理和后处理。客户端的接收器拦截所有外出客户端上下文环境的调用,同时也做一些前处理和后处理。服务器负责服务器端接收器的安装,拦截对服务器端上下文环境访问的接收器称为服务器上下文环境接收器,那些拦截调用实际对象的接收器是对象接收器。通......

阅读全文(1883) | 评论:2

Attribute在.NET编程中的应用(五)(2009-12-13 12:16:00)

摘要: Attribute在拦截机制上的应用 从这一节开始我们讨论Attribute的高级应用,为此我准备了一个实际的例子:我们有一个订单处理系统,当一份订单提交的时候,系统检查库存,如果库存存量满足订单的数量,系统记录订单处理记录,然后更新库存,如果库存存量低于订单的数量,系统做相应的记录,同时向库存管理员发送邮件。为了方便演示,我们对例子进行了简化://Inventory.cs using System; using System.Collections; namespace NiwalkerDemo { public class Inventory { private Hashtable inventory=new Hashtable(); public Inventory() { inventory["Item1"]=100; inventory["Item2"]=200; } public bool Checkout(string product, int quantity) { int qty=GetQuantity(product); return qty>=quantity; } public int GetQuantity(string product) { int qty=0; if(inventory[product]!=null) qty = (int)inventory[product]; return qty; } public void Update(string product, int quantity) { int qty=GetQuantity(product); inventory[product]=qty-quantity; } } } ......

阅读全文(2435) | 评论:0

Attribute在.NET编程中的应用(四)(2009-12-13 12:15:00)

摘要: SqlCommandGenerator类的设计 SqlCommandGEnerator类的设计思路就是通过反射得到方法的参数,使用被SqlCommandParameterAttribute标记的参数来装配一个Command实例。 引用的命名空间://SqlCommandGenerator.cs using System; using System.Reflection; using System.Data; using System.Data.SqlClient; using Debug = System.Diagnostics.Debug; using StackTrace = System.Diagnostics.StackTrace; 类代码: namespace DataAccess { public sealed class SqlCommandGenerator { //私有构造器,不允许使用无参数的构造器构造一个实例 private SqlCommandGenerator() { throw new NotSupportedException(); } //静态只读字段,定义用于返回值的参数名称 public static readonly string ReturnValueParameterName = "RETURN_VALUE"; //静态只读字段,用于不带参数的存储过程 public static readonly object[] NoValues = new object[] {}; public static SqlCommand GenerateCommand(SqlConnection connection, MethodInfo method, object[] values) { //如果没有指定方法名称,从堆栈帧得到方法名称 if (method == null) ......

阅读全文(1666) | 评论:0

Attribute在.NET编程中的应用(三)(2009-12-13 12:13:00)

摘要:用于参数的Attribute 在编写多层应用程序的时候,你是否为每次要写大量类似的数据访问代码而感到枯燥无味?比如我们需要编写调用存储过程的代码,或者编写T_SQL代码,这些代码往往需要传递各种参数,有的参数个数比较多,一不小心还容易写错。有没有一种一劳永逸的方法?当然,你可以使用MS的Data Access Application Block,也可以使用自己编写的Block。这里向你提供一种另类方法,那就是使用Attribute。 下面的代码是一个调用AddCustomer存储过程的常规方法:
public int AddCustomer(SqlConnection connection, string customerName, string country, string province, string city, string address, string telephone) { SqlCommand command=new SqlCommand("AddCustomer", connection); command.CommandType=CommandType.StoredProcedure; command.Parameters.Add("@CustomerName",SqlDbType.NVarChar,50).Value=customerName; command.Parameters.Add("@country",SqlDbType.NVarChar,20).Value=country; command.Parameters.Add("@Province",SqlDbType.NVarChar,20).Value=province; command.Parameters.Add("@City",SqlDbType.NVarChar,20).Value=city; command.Parameters.Add("@Address",SqlDbType.NVarChar,60).Value=address; command.Parameters.Add("@Telephone",SqlDbType.NvarChar,......

阅读全文(2036) | 评论:0