博文
Attribute在.net编程中的应用(二)(2011-04-27 12:06:00)
摘要:.NET Framework中对Attribute的支持是一个全新的功能,这种支持来自它的Attribute类。在你的程序中适当地使用这个类,或者是灵活巧妙地利用这个类,将使你的程序获得某种在以往编程中很难做到的能力。我们来看一个例子:
假如你是一个项目开发小组中的成员,你想要跟踪项目代码检查的信息,通常你可以把代码的检查信息保存在数据库中以便查询;或者把信息写到代码的注释里面,这样可以阅读代码的同时看到代码被检查的信息。我们知道.NET的组件是自描述的,那么是否可以让代码自己来描述它被检查的信息呢?这样我们既可以将信息和代码保存在一起,又可以通过代码的自我描述得到信息。答案就是使用Attribute.
下面的步骤和代码告诉你怎么做:
首先,我们创建一个自定义的Attribute,并且事先设定我们的Attribute将施加在class的元素上面以获取一个类代码的检查信息。
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.Class)] //还记得上一节的内容吗?
public class CodeReviewAttribute : System.Attribute //定义一个CodeReview的Attribute
{
private string reviewer; //代码检查人
private string date; //检查日期
private string comment; //检查结果信息
//参数构造器
public CodeReviewAttribute(string reviewer, string date)
{
this.reviewer=reviewer;
this.date=date;
}
public string Reviewer
{
get
{
return reviewer;
}
}
public string Date
{
get
{
return date;
}
}
public string Comment......
Attribute在.net编程中的应用(一)(2011-04-27 12:06:00)
摘要:Attribute的基本概念经常有朋友问,Attribute是什么?它有什么用?好像没有这个东东程序也能运行。实际上在.Net中,Attribute是一个非常重要的组成部分,为了帮助大家理解和掌握Attribute,以及它的使用方法,特地收集了几个Attribute使用的例子,提供给大家参考。
在具体的演示之前,我想先大致介绍一下Attribute。我们知道在类的成员中有property成员,二者在中文中都做属性解释,那么它们到底是不是同一个东西呢?从代码上看,明显不同,首先就是它们的在代码中的位置不同,其次就是写法不同(Attribute必须写在一对方括符中)。
什么是Atrribute
首先,我们肯定Attribute是一个类,下面是msdn文档对它的描述:
公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型、字段、方法和属性等。Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。
在.NET中,Attribute被用来处理多种问题,比如序列化、程序的安全特征、防止即时编译器对程序代码进行优化从而代码容易调试等等。下面,我们先来看几个在.NET中标准的属性的使用,稍后我们再回过头来讨论Attribute这个类本身。(文中的代码使用C#编写,但同样适用所有基于.NET的所有语言)
Attribute作为编译器的指令
在C#中存在着一定数量的编译器指令,如:#define DEBUG, #undefine DEBUG, #if等。这些指令专属于C#,而且在数量上是固定的。而Attribute用作编译器指令则不受数量限制。比如下面的三个Attribute:
Conditional:起条件编译的作用,只有满足条件,才允许编译器对它的代码进行编译。一般在程序调试的时候使用。 DllImport:用来标记非.NET的函数,表明该方法在一个外部的DLL中定义。 Obsolete:这个属性用来标记当前的方法已经被废弃,不再使用了。
下面的代码演示了上述三个属性的使用:
#define DEBUG //这里定义条件
using System;
usin......
IEnumerable和IEnumerator的理解[原](2011-04-27 11:22:00)
摘要:
在现实应用中,对于集合以及枚举这些集合的需求非常普遍,
因此在.NET中集合所依赖的接口被设计为公共的。想要实现对象的枚举就必须继承IEnumerable接口。
public interface
IEnumerable
{
public IEnumerator GetEnumerator();
}
它只有一个成员:GetEnumerator方法。该方法返回一个世纪的枚举器(enumerator)对象。那么要定义一个枚举器就要必须实现IEnumrator接口:
public
interface IEnumerator
{
public Boolean MoveNext();
public
Object Current { get; }
public void Reset();
}
也就是说如果我们希望一个类型支持枚举特性,那么我们就必须还要额外定义一个辅助类型来实现IEnumerator的所有方法。这个辅助类型通常被定义为一个Nested
class声明在主类内部。这样在实现的时候我们发现,在app调用GetEnumerator()方法时,我们需要构造一个辅助类型的实例作为返回值。
看一段别人的总结,水平高的人应该理解更深吧。我先贴出来供以后参考。
1、一个Collection要支持foreach方式的遍历,必须实现IEnumerable接口(亦即,必须以某种方式返回IEnumerator
object)。
2、IEnumerator object具体实现了iterator(通过MoveNext(),Reset(),Current)。
3、从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator
object就是一个iterator。
......
.net静态构造函数与构造函数有什么区别(2011-04-23 10:31:00)
摘要:1、静态构造函数不能带任何参数,一个类只能有一个静态构造函数
构造函数参数数目不定,可以根据需求设定。一个类可以有多个构造函数(重载)
2、静态构造函数的执行具有不定性,你只能确保静态构造函数在第一次调用类的成员之前执行,并且静态构造函数至多执行一次。
构造函数:只要创建类的实例,都会执行,具有时间的可把握性。
3、静态构造函数没有修饰符
注意:无参数的实例构造函数可以在类中与静态构造函数安全共存。尽管参数列表是相同的,但这并不茅盾,因为静态构造函数是在加载类时执行的,而实例构造函数是在创建实例时执行,所以构造函数的执行的不会有冲突的。
文章来自学IT网:http://www.xueit.com/html/2009-05/21_1797_00.html......
什么是ASP.NET MVC?(2011-04-16 20:33:00)
摘要:1,什么是ASP.NET MVC?
在了解ASP.NET MVC之前,先了解一下什么是MVC。MVC是Model-View-Controller的缩写,也就是模型—视图—控制器的意思。MVC用于表示一种软件架构模式,它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。模型(Model)一般是指“数据模型”,用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权利,例如对数据库的访问。“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。视图(View)也就是UI层,实现数据的显示。控制器(Controller)起到不同层面间的组织作用,用于控制应用程序的流程,它处理事件并作出响应。
ASP.NET MVC是在现有ASP.NET 3.5运行时的顶层提供一种新的模型-视图-控制器(MVC, Model-View-Controller)框架。这就允许开发人员利用MVC设计模式的优势创建自己的ASP.NET Web应用程序,它将内容显示(UI或者View)、业务逻辑和后台数据进行了清晰分离,可以说是MVC在ASP.NET中的实现。
2,ASP.NET MVC和ASP.NET Web Form有什么关系?
ASP.NET MVC只是另外一种开发ASP.NET应用程序的设计模式,不会取代ASP.NET Web Form模式,两者是不行的,不会冲突。
3,ASP.NET MVC的优点:
不再有ViewState:传统的ASP.NET WebForm模式利用ViewState保存表单的状态信息,由于B/S程序本身的限制,ViewState存储数据需要在隐藏表单域里面放置很大一段字符串,这会大大增加页面的字节数,导致网页加载变慢;
简介的HTML:最终生成的 HTML代码完全由自己控制,不会生成任何“垃圾代码”;
更快的服务器端处理和客户端呈现:MVC只简单地处理“模板”,而无需构建复杂的控件树,因此,无论是在服务器处理的时间,和客户端的呈现速度都会有所提高;
为多种视图只需一种模型:有时候一个页面要显示的数据是同一个,但表现形式有细微的差别,此时只需要修改视图部分,可以......
.net面试题四 WCF 技术(2011-04-13 20:42:00)
摘要:
WCF技术有什么优势
【考点】
对WCF技术的了解,WCF技术的基本内容。
【出现频率】
★★☆☆☆
【解答】
常用的分布式技术有COM+、.NET远程技术(Remoting)、Web Service和微软消息队列服务,WCF技术将这些分布式技术整合为一个高效的API。常用的那些分布式技术只能解决项目开发中某个方面的问题,并且不同技术对平台要求不同。在项目中有时要使用到多种技术从而导致这些技术所提供的服务有重叠之处,并且整个项目的维护复杂性大大增加。WCF技术提供了一个完整统一的方案解决这些问题,它提供了一个用于访问各种分布式技术的通用API,并且增加了很多必要的服务。
【分析】
本题主要考查面试者对.NET Framework新版本中WCF技术的基本认知。公司招聘.NET程序员不一定非要熟练掌握WCF这样的新技术,但是一定会要求所招聘的人才具备对新技术的了解,对新技术探索的好奇心。本题即为这样的目的而设,难度不大,只要面试者对新技术有一定程度的了解,经过
......
asp.net2.0学习历程 菜鸟到中级程序员的飞跃(2011-04-04 14:43:00)
摘要:asp.net2.0学习历程 菜鸟到中级程序员的飞跃
--30本好书点评
作者:清清月儿
主页:http://blog.csdn.net/21aspnet/ 时间:2007.5.16
学历历程
如果你是一个菜鸟或者自认为初学者那么本文非常适合你;
不能说这30本书就是最佳组合,但是可以说这个组合不差;
本人曾博览群书,很多书重复,很多书讲的不适用,这些书都是目前书店可以买到的;
达到中级程序员以后怎么成为高级程序员就靠你自己了,而此时你已经有辨明是非的能力,这也就是本文的目的!
30本好书点评:
分4大方向(
html--Web的基础;
javascript--让网页动起来;
C#--程序;
数据
图中纵向;
5个时期(入门,基础,应用,提高,飞跃),图中横向;
一.入门
1.《HTML与CSS入门经典(第7版) 》HTML入门
点评:html语言的入门,由于html极其简单所以同类其他书也可代替,本书并非经典,本书摆在这里纯属占位!你可以用其他书代替。
2.《C#入门经典(第3版)》C#入门
点评:经典中的经典,个人认为是30本书里最重要的,虽然其他讲C#的好书也很多但大多1.0版的,很多在书店已经绝版,被《程序员》等机构评选为2006年最受读者喜爱的十大IT图书之一。
3.《精通SQL--结构化查询语言详解》SQL数据入门
点评:不能说很好,但也不差,感觉吃透全书也可以应付如常SQL语句了。
4.《专家门诊--SQL SERVER开发答疑200问》SQL数据入门
点评:好书,正好结合上本,可惜的是不是Sqlserver2005。
5.《SQL SERVER 2005基础教程》SQL数据入门
点评:书一般,不过还是很全的,和同类书比起来还是不错。
入门总结......
WCF从理论到实践-异步(2011-02-08 10:30:00)
摘要:本文目的
通过阅读本文,您能了解以下知识
1) 如何在WCF中实现异步
2) 异步操作的优缺点及其应用场合
3) 总结对比各种异步操作的实现方式
4) 代码不骗人,实现一个WCF异步小范例
本文适合的读者
本文因为涉及一些常用的基础知识和开发技巧,需要对多线程等具有一定的认识,所以初学者可能不能立即掌握,本文适合WCF中级用户或有其他分布式技术开发经验的WCF初学者
如何在WCF中实现异步
在ARM(异步编程模型)中,我们经常看到BeingXXX(..),EndXXX(..)这样的函数定义,那和他们对应的同步方法还有XXX(..),比如FileStream对象,它既包括同步方式int Read(byte[] buffer,int offset,int count),还有IAsyState BeginRead(byte[] buffer,int offset,int count,IAsyCallback callback,Object asyState)和int EndRead(IAsyState ar)这样的异步方式,如果我们的WCF服务程序也和FileStream设计一样,那我们一些开发人员要跳楼了.本来一个业务方法的实现现在变为了3个,工作量增加了2倍.为何有这样的说法,因为这样的架构不是一个好架构,作为一个优秀的框架,WCF肯定不会犯如此低级的错误,异步与否本来应该是由客户端来决定的,所以我们的服务端实现无需关心......
使用 Bulk Copy 将大量数据复制到数据库(2011-01-16 15:38:00)
摘要: 如果一次要向数据库服务器提交多条记录 , 通常会执行多次Insert命令 , 这样就为要插入的每个记录执行一次与数据库服务器的往返 , 这就给服务器增加了压力 , 效率也大大的降低了……
如果一次要向数据库服务器提交多条记录 , 通常会执行多次Insert命令 , 这样就为要插入的每个记录执行一次与数据库服务器的往返 , 这就给服务器增加了压力 , 效率也大大的降低了...
.Net FrameWork 2.0 新增功能 Bulk Copy 可以很快将大量数据加载到数据库中 , 现在利用这一新功能来实现上述功能.
这里从 MS Sql Server 2000 的 NorthWind 的 Orders 表加载数据到 DateTable 模拟要向数据库服务器提交的多条记录集 . 用 Tempdb 库来模拟目标数据库服务器 .
先在 Tempdb 建一个表 temp_orders
USE TEMPDB
CREATE TABLE TEMP_ORDERS
(
TEMP_ORDERID INT,
TEMP_CUSTOMERID NCHAR(5),
TEMP_ORDERDATE DATETIME,
TEMP_SHIPNAME NVARCHAR(40)
)下面为模拟程序
protected void Page_Load(object sender, EventArgs e)
{
#region 从NorthWind的Orders表获取要插入的数据
DataTable dtNorthWindOrders = new DataTable();
using ( SqlConnection northWindConnection = new SqlConne......
浅谈C#多线程与UI响应(2011-01-16 15:35:00)
摘要:一.C#多线程概述
1.后台循环任务,少量UI更新:例如批量上传文件,并提供进度。这种情况使用BackgroundWorker组件是非常好的选择。
2.耗时的后台任务:这里的耗时任务是指一个时间较长的任务,并且不能精确获取进度,如:调用一个远程WebService接口。这种情况可以开两个线程,一个工作,一个更新UI(不能提供进度,只能显示动画表示系统在运行中)。
3.耗时的UI任务:当工作压力集中在UI响应上时,可以在工作者线程中增加延时,从而让UI线程获得响应时间。整个工作的总体时间会增加,但用户响应效果会好很多。
二.后台的循环任务,少量UI更新
这种情况使用BackgroundWorker组件是最好的选择。(详见附一)
三.后台耗时任务
在后台执行一个不可分解的耗时任务,需要进行界面更新,以便让客户看上去程序有所响应。这种情况下,UI线程一般也不知道工作线程何时结束,所以一般执行循环任务,当工作线程结束后,关闭UI线程就可以了。
Threaduithread=null; privatevoidbtnStart_Click(objectsender,EventArgse) { uithread=newThread(newThreadStart(this.UpdateProgressThread)); uithread.Start(); Threadworkthread=newThread(newThreadStart(this.DoSomething)); workthread.Start(); } privatevoidDoSomething() { Thread.Sleep(5000); uithread.Abort(); MessageBox.Show("workend"); } privatevoidUpdateProgressThread() { for(inti=0;i<10000;i++) { Thread.Sleep(100); this.Invoke(newAction(this.UpdatePro......