博文

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) ......

阅读全文(1592) | 评论: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,......

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

Attribute在.NET编程中的应用(一)(2009-12-13 12:09: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 { get {......

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

Attribute在.NET编程中的应用(一)(2009-12-13 12:07: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; usi......

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

【多篇好文摘录】C#中override和new的区别(2009-10-19 22:47:00)

摘要: OO思想现在已经在软件开发项目中广泛应用,其中最重要的一个特性就是继承,最近偶简单的复习了下在C#中涉及到继承这个特性时,所需要用到的关键字,其中有一些关键点,特地整理出来,方便大家查阅。

一、在C#中,new这个关键字使用频率非常高,主要有3个功能:   

a)    作为运算符用来创建一个对象和调用构造函数。

b)    作为修饰符。

c)      用于在泛型声明中约束可能用作类型参数的参数的类型。

    在本文中,只具体介绍new作为修饰符的作用,在用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。

这里有个注意事项就是New和Override这两个关键字是互斥的。不可以同时使用。

二、    Override关键字主要是提供派生类对基类方法的新实现,重写的基类方法必须和Override的方法具有相同的签名,此关键字不可以用于重写非虚方法和静态方法,与其配套使用的关键字是Virtual、abstract、Override。与此同时,Override方法还不可以修改Virtual方法的可访问性,Override方法和Virtual方法必须具有相同的访问修饰符,不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。

以下是一个小demo,展示了new和override的本质区别:



class Program

    {

        static void Main(string[] args)

        {      &nb......

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

VS.Net中程序集的Debug版本和Release版本的区别(2008-09-22 11:46:00)

摘要:Visual Studio 项目对程序的发布和调试版本分别有单独的配置。顾名思义,生成调试版本的目的是用于调试,而生成发布版本的目的是用于版本的最终分发。
如果在 Visual Studio 中创建程序,Visual Studio 将自动创建这些配置并设置适当的默认选项和其他设置。在默认设置下: 
程序的“调试”配置用全部符号调试信息编译,不进行优化。(优化会使调试复杂化,因为源代码和生成的指令间的关系更加复杂。)
程序的“发布”配置被完全优化,不包含任何符号调试信息。调试信息可在单独的 PDB 文件中生成。 当在程序集的属性页中选Debug模式时,设置如下:

当选择Release模式时,设置如下:

两者的不同点如下:

项目 Debug Release 条件编译常数 Debug;Trace Trace 优化代码 False True 输出路径 bin\Debug bin\Release 生成调试信息 True False Debug模式下生成的程序集为调试版本,未经优化;在bin\debug\目录中有两个文件,除了要生成的.exe或.dll文件外,还有个.pdb文件,这个.pdb文件中就记录了代码中的断点等调试信息;Release模式下不包含调试信息,并对代码进行了优化,\bin\release\目录下只有一个.exe或.dll文件。 注意若要更改项目的生成模式,不能只从项目属性页上点“配置”下拉框更改,那样不起作用,必须点右上角的“配置管理器”按钮才能更改。 编译是分模块编译的,每个模块的编译结果就保存在了OBJ目录下。最后会合并为一个exe或者dll文件保存到bin之中。因为每次编译都是增量编译,也就是只重新编译改变了的模块,所以这个OBJ的目录的作用就是保存这些小块的编译结果,加快编译速度。 ......

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

.NET Framework程序设计(2008-01-19 22:49:00)

摘要:花了半年,才终于把第一章搞得比较清楚了。相信不是自己笨,而是这些东西确实有点深度。......

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

关键字集合和IDictionary (2007-08-26 11:02:00)

摘要:关键字集合和IDictionary  public abstract class Animal
    {
        protected string name;         public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }        ......

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