11 2008 档案
摘要:
.Net修改页面的keywords、description和title
阅读全文

摘要:Javascript控制文本框只能输入数字
阅读全文
摘要:
C#2.0,在2005年已经可以使用了,它有一些主要的新功能。这样使得目前使用的一些最好的实际经验可能会有所改变,这也会随着下一代工具的发布而修改。尽管目前你还可以不使用这些功能,但你应该这些做些准备。
阅读全文

摘要:
ECMA标准是C#语言所有功能的官方说明。ECMA-334定义了C#语言1.0的标准,你可以从The C# Programming Language这本书上学习C#2.0的计划(译注:现在已经不是计划了),这本书的作者是Anders Hejlsberg, Scott Wiltamuth, 和 Peter Golde (Addison-Wesley, 2003)。这本书是一个语言手册,而不是指南。它详细说明了这门语言书面定义的每一个功能。每一种语言都只一种标记,可以让你更加明白每一种语言的功能。当我还在写这本书的时候,我还经常把这书放在我的桌子上参考。
阅读全文

摘要:
对于C#以及.Net来说这是激动人心的时候。这些工具目前还是比较新的,整个社区都在学习如何使用这些工具。一些资源可以帮助你提高你的知识,以及为.Net和C#创建一个更大的知识社区。这些工具是我每天都向C#开发人员推荐的。关于C#实践的全部内容还在写作当中,跟进它们而且不断了解相关的内容。
阅读全文

摘要:
.Net运行时已经设计好了,一些怀有恶意的代码不能渗透到远程计算机上并执行。目前一些分部式系统依懒于从远程机器上下载和执行代码。如果你可以通过Internet或者以太网来发布你的软件,或者直接从web上运行,但你须要明白CRL在你的程序集中的一些限制。如果CLR不是完全相信一个程序集,它会限制一些的行为。这些调用代码要有访问安全认证(CAS)。从另一方面来说,CLR强制要求基于角色的安全认证,这样这些代码才能或者不能在基于一个特殊的角色帐号下运行。
阅读全文

摘要:
当你抛出异常时,你就在应用程序中引入了一个中断事件。而且危机到程序的控制流程。使得期望的行为不能发生。更糟糕的是,你还要把清理工作留给最终写代码捕获了异常的程序员。而当一个异常发生时,如果你可以从你所管理的程序状态中直接捕获,那么你还可以采取一些有效的方法。谢天谢地,C#社区不须要创建自己的异常安全策略,C++社区里的人已经为我们完成了所有的艰巨的工作。以Tom Cargill的文章开头:“异常处理:一种错误的安全感觉,” 而且Herb Sutter,Scott Meyers,Matt Austern,Greg Colvin和Dave Abrahams也在后继写到这些。C++社区里的大量已经成熟的实践可以应用在C#应用程序中。关于异常处理的讨论,一直持续了6年,从1994年到2000年。他们讨论,争论,以及验证很多解决困难问题的方法。我们应该在C#里利用所有这些艰难的工作。
阅读全文

摘要:
异常是一种的报告错误的机制,它可以在远离错误发生的地方进行处理错误。所有关于错误发生的的信息必须包含在异常对象中。在错误发生的过程中,你可能想把底层的错误转化成详细的应用程序错误,而且不丢失关于错误的任何信息。你须要仔细考虑关于如何在C#应用程序中创建特殊的异常类。第一步就是要理解什么时候以及为什么要创建新的异常类,以及如何构造继承的异常信息。当开发者使用你的库来写catch语句时,他们是基于特殊的进行时异常在区别为同的行为的。每一个不同的异常类可以有不同的处理要完成:
阅读全文

摘要:
因为两个原则,把DataSet的名声搞的不好。首先就是使用XML序列化的DataSet与其它的非.Net代码进行交互时不方便。如果在Web服务的API中使用DataSet时,在与其它没有使用.Net框架的系统进行交互时会相当困难。其次,它是一个很一般的容器。你可以通过欺骗.Net框架里的一些安全类型来错误DataSet。但在现代软件系统中,DataSet还可以解决很多常规的问题。如果你明白它的优势,避免它的缺点,你就可以扩展这个类型了。
阅读全文

摘要:
当你创建了一个与反射相关的系统时,你应该为你自己的类型,方法,以及属性定义一些自己的特性,这样可以让它们更容易的被访问。自定义的特性标示了你想让这些方法在运行时如何被使用。特性可以测试一些目标对象上的属性。测试这些属性可以最小化因为反射时可能而产生的类型错误。
阅读全文

摘要:
创建二进制的组件时,同时也意味着你要使用迟后绑定和反射来查找你所须要的具有特殊功能代码。反射是一个很有力的工具,而且它让你可以写出可动态配置的软件。使用反射,一个应用程序可以通过添加新的组件来更新功能,而这些组件是在软件最开始发布时没有的。这是有利的。
这一灵活性也带来了一些复杂的问题,而且复杂问题的增加又会增加出现其它问题的可能。当你使用反射时,你是围绕着C#的安全类型。然而,成员调用的参数和返回值是以System.Object类型存在的。你必须在运行时确保这些类型是正确的。简单的说,使用反射可以让创建动态的程序变得很容易,但同时也让程序出现错误变得很容易。通常,简单的思考一下,你就可以通过创建一系列接口集合来最小化或者移除反射,而这些接口集合应该表达你对类型的假设。
反射给了你创建类型实例的功能,以及在对象上调用成员方法,以及访问对象上的成员数据
阅读全文

摘要:
如果要问 “哪种集合是最好的?”我的回答是:“视需要而定。”不同的集合有不同的功能特性,并且针对其行为的不同进行了优化。.Net Framework支持许多相似的集合:列表、数组、队列、栈等等。另外,C#支持多维数组,其性能特点不同于其它的一维数组或者交错数组。.Net Framework中还包含了很多专门化的集合,你可以回顾一下以前创建的程序中用到的那些集合。由于所有的集合都实现了ICollection接口,你可以非常快速的找到它们。在描述ICollection接口的文档中列出了所有实现这个接口的类。这二十多个类都是可供我们使用的集合。
阅读全文

摘要:
用户的输入可能是多种多样的:你必须在交互式的控件中尽可能的验证输入。写一些用户输入验证可能很做作,而且也有出错的可能,但还是很有必要的。不能太相信用户的输入,用户可能会输入任何内容导致异常发生,进而进行SQL注入式攻击。我们不希望任何类似这样的事情发生。你应该了解足够的信息来怀疑用户的输入。很好,每个人都应该这样做,这也就是为什么.Net框架已经扩展了这样的功能,你可以使用这些功能从而使自己的代码编写工作减到最小,因为我们要对用户输入的每一块数据都要进行验证。
阅读全文

摘要:
.Net提供了通用的框架,可以让你支持数据绑定。你的工作就是为你的应用程序和数据提供一些特殊的事件句柄。Windows表单和Web表单以及子系统都包含了丰富的数据绑定功能。框架库已经包含了所有你须要的工具,因此,你的UI代码应该真实的描述数据源和要显示的属性,以及在把这些元素存储到数据源时须要遵守的规则。你应该集中精力创建数据类型,用于描述显示的参数,然后Winform以及Webform的数据绑定完成其它的。不应该在把数据从用户控件到数据源之间进行传输时写相关的代码(译注:指用数据绑定,而不用其它的方法)。不管怎样,数据必须从你的业务对象关联到UI控件上与用户进行交互。通过创建类型层以及使用数据绑定的概念,你就可以少写很多代码。.Net框架已经 同时在Windows和Web应用程序中为你处理了传输的工作。
阅读全文

摘要:
我们要寻求一种避免直接写代码的应用程序配置和信息设置方法,我们已经创建了多种不同的策略来存储配置信息。而我们是要寻求一种正确的方法,我们要不断提高和改我们的想法,关于哪里是放置这些信息的好地方。INI文件?这是Windows3.1做的事,配置信息的结构是受限制的,而且在文件名上可能还会与其它程序程序相冲突。注册表?是的,是这个正确的想法,但它也有它的限制。
阅读全文

摘要:
当有问题发生时,它们往往并不是在实验的时候发生的,机器有轻松调试的工具。在很多实际情况中,你不好修正的问题总是发生在用户的机器上,那里没有调试环境,也没有好的方法计算出问题的情况。在实际情况中,有经验的开发人员会创建一个方法,让系统在运行时捕获尽可能多的信息。.Net框架已经包含一些类集合,利用这些集合,你可以做一些通用的调试。而且这些类可以在运行时或者编译时进行配置。如果你利用它们,你就可以轻松的发现在实际运行时的问题。使用框架里已经存在的代码,你可以发送一条诊断信息到一个文件,或者到调试终端。另外,你还可以为你的产品指定特殊的调试输出级别。你应该尽快的在你的开发环境中使用这些功能,以确保你可以利用这些输出信息来修正在实际运行中没有预料到的一些问题。不要自己写诊断库除非你已经明白框架已经提供了哪些。
阅读全文

摘要:
许多.net类库中的类都提供了两种不同的处理事件句柄的方法。既可以为其添加事件,也可以重写其基类的事件抽象方法。为什么要为同一件事提供两种不同的方法呢?这是为了对应不同的情况。在实现派生类的时候,更好的选择是重写基类中的抽象方法。
阅读全文

摘要:
通信协议的开销与麻烦就是对数据媒体的如何使用。在通信过程中可能要不同的使用媒体,例如电话,传真,地址,和电子邮件。让我们再回头来看看上次的订购情况,当你用电话订购时,你要回答售货员的一系列问题:
阅读全文

摘要:
并不是所有的人都须要知道所有的事。也不是所有的类型须要是公共的。对于每个类型,在满足功能的情况下,应该尽可能的限制访问级别。而且这些访问级别往往比你想像的要少得多。在一个私有类型上,所有的用户都可以通过一个公共的接口来访问这个接口所定义的功能。
阅读全文

摘要:
这一条款实际应该取这个名字:“应该创建大小合理而且包含少量公共类型的程序集”。但这太沉长了,所以就以我认为最常见的错误来命名:开发人员总是把所有的东西,除了厨房里水沟以外(译注:夸张说法,kitchen sink可能是个口语词,没能查到是什么意思,所以就直译了。),都放到一个程序集。这不利于重用其中的组件,也不利于系统中小部份的更新。很多以二进制组件形式存在的小程序集可以让这些都变得简单。
阅读全文

摘要:
对于有经验的程序员来说,不论在接触C#之前使用什么语言,都有一些提高代码效率的方法。不过有些做法虽然在之前的语言中有效,但在.Net环境中却适得其反。
这一点在我们尝试手动为C#编译器优化算法时尤为明显。我们的举动往往使得JIT编译无法做出更加有效的优化。那些以优化为目的的工作,结果往往是生成更慢的代码。我们完全不必追求创建最直截了当的代码,有些工作完全可以交给编译器完成。有些过分优化会造成问题,一个典型的例子就是我们为了避免进行函数调用而创建一个又长又复杂的函数。这样的做法会降低.Net应用程序的表现,是和初衷相违背的。让我们来注意一下其中的细节。
阅读全文

摘要:
我们一般在类成员上使用new修饰符,来重新定义继承自基类的非虚成员。我们可以这么做并不意味着我们就应该这么做。重新定义非虚方法会导致含混不清的行为。
阅读全文

摘要:
转换操作符为类之间引入了一层“替换性(substitutability)”。“替换”意味着一个类的实例可以被替换为另一个类的实例。这对我们来说可以是一种好处:一个派生类的对象可以被当做一个基类对象来使用。
阅读全文
