Google [站内搜索]

分类: Web编程预览模式: 普通 | 列表

Effective C# 原则10: 明白GetHashCode()的缺陷

这是本书中唯一一个被一整个函数占用的原则,你应该避免写这样的函数。GetHashCode()仅在一种情况下使用:那就是对象被用于基于散列的集合的关键词,如经典的HashTable或者Dictionary容器。这很不错,由于在基类上实现的GetHashCode()存在大量的问题。对于引用类型,它可以工作,但高效不高;对于值类型,基类的实现经常出错。这更糟糕。你自己完全可以写一个即高效又正确的GetHashCode()。没有那个单一的函数比GetHashCode()讨论的更多,且令人困惑。往下看,为你解释困惑。

如果你定义了一个类型,而且你决不准备把它用于某个容器的关键词,那就没什么事了。像窗体控件,网页控件,或者数据库链接这样的类型是不怎像要做为某个任何的关键词的。在这些情况下,什么都不用做了。所有的引用类型都会得到一个正确的散列值,即使这样效率很糟糕。值类型应该是恒定的(参见原则7),这种情况下,默认的实现总是工作的,尽管这样的效率也是很糟糕的。在大多数情况下,你最好完全避免在类型的实例上使用GetHashCode()。

然而,在某天你创建了一个要做为HashTable的关键词来使用的类型,那么你就须要重写你自己的GetHashCode()的实现了。继续看,基于散列(算法)的集合用散列值来优化查找。每一个对象产生一个整型的散列值,而该对象就存储在基于这个散列值的“桶”中。为了查找某个对象,你通过它的散列值来找到这个(存储了实际对象的)“桶”。在.Net里,每一对象都有一个散列值,它是由System.Object.GetHashCode()断定的。任何对GetHashCode()的重写都必须遵守下面的三个规则:

查看更多...

分类:Web编程 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 5677
以前曾经动笔写过一片《字符串比较方法的性能对比》的文章,很多朋友提出了非常好的意见和建议。碰巧最近看到好多人在这样比较字符串

if (string.Compare(keyState, "M", true, CultureInfo.InvariantCulture) == 0) {

似乎很有意思,大家都喜欢另辟蹊径的使用字符串比较,为了较为客观的反应各种字符串比较的优势,我特地做了一个本地测试,分别区分字符串长度一致以及长度不一致的情况,另外每种情况下还对字符串的比较方式上使用4种不同方法:
1、使用地球人都知道的“==”比较运算符

查看更多...

分类:Web编程 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3911

两种不同字符串比较方法的性能对比

最近比较关注C#书写出来的代码性能问题,越研究就越觉得很有意思。
在日常的编程过程总,由于编程需要,我们经常会比较两个字符串是否相等,然后再做相应的处理。代码书写起来是觉得很爽,不是吗?if (a==b) then ……else……但是有没有更快的方式呢?为此查阅了一些资料了MSDN文档。当我们调用 a==b的时候,通过IL代码可以看到内部实际上调用了String.Equals(string,string)这个方法

IL_0021:  call       bool [mscorlib]System.String::op_Equality(string,string)
IL_0026:  stloc.s    re

查看更多...

分类:Web编程 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3594

在ashx中使用Session

默认在ashx中是不能正常使用Session的(能存入不能取出),查阅相关文档,说明只有实现IRequiresSessionState接口后ashx才能正常使用Session,代码如下:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;

查看更多...

分类:Web编程 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 4215
明白ReferenceEquals(), static Equals(), instance Equals(), 和运算行符==之间的关系。

当你创建你自己的类型时(不管是类还是结构),你要定义类型在什么情况下是相等的。C#提供了4个不同的方法来断定两个对象是否是相等的:

public static bool ReferenceEquals

查看更多...

分类:Web编程 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3620
.Net系统默认所有的对象初始化时都为0。这并没有提供一个方法来预防其他程序员创建的值类型数据的实例在初始化是都是0。请让你的数据类型默认值也是0。

一个特殊情况是在枚举类型数据中。决不要创建一个不包括0在内的枚举类型。所有的枚举类型都是从System.ValueType派生的。枚举类型的值是从0开始的,但你可以改变这一行为:

public enum Planet

查看更多...

分类:Web编程 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 4101

使用SOAP 标头提高Web 服务安全性

默认情况下,只要知道一个Web 服务的地址,我们就可以随意调用他,今天我们通过在SOAP 标头添加对调用Web 服务用户身份的验证,进而提高Web 服务安全性。

在Web 服务中接收和处理 SOAP 标头的基本步骤:

·创建一个从 SoapHeader 派生的类,表示传入 SOAP 标头的数据。

查看更多...

分类:Web编程 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3847

使用.NET进行WAP开发

WAP应用程序结构

首先你拥有一个Web应用,那么集成WAP服务就相当容易。
你不必为原来的业务逻辑进行重新构建,而且如果你Web本身的应用就有分层的,那么扩展到WAP是很方便的。
对于我们目前的应用,我们可以简单的认为是WEB应用的Mobile迁移。更多的是在UI\UE上的调整。

查看更多...

分类:Web编程 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3327

在C#程序设计中使用Win32类库

C# 用户经常提出两个问题:"我为什么要另外编写代码来使用内置于 Windows 中的功能?在框架中为什么没有相应的内容可以为我完成这一任务?"当框架小组构建他们的 .NET 部分时,他们评估了为使 .NET 程序员可以使用 Win32 而需要完成的工作,结果发现 Win32 API 集非常庞大。他们没有足够的资源为所有 Win32 API 编写托管接口、加以测试并编写文档,因此只能优先处理最重要的部分。许多常用操作都有托管接口,但是还有许多完整的 Win32 部分没有托管接口。

平台调用 (P/Invoke) 是完成这一任务的最常用方法。要使用 P/Invoke,您可以编写一个描述如何调用函数的原型,然后运行时将使用此信息进行调用。另一种方法是使用 Managed Extensions to C++ 来包装函数,这部分内容将在以后的专栏中介绍。

要理解如何完成这一任务,最好的办法是通过示例。在某些示例中,我只给出了部分代码;完整的代码可以通过下载获得。

查看更多...

分类:Web编程 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3586

用DataReader还是DataSet

ADO.NET提供了两个主要的类来读取数据。通过本文我们可以学习如何在两者之间进行选择。

我经常听到有人问这个问题:"在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?"在很多文章以及新闻组的贴子中我经常看到这样的误解,即认为DataReader(SqlDataReader或OleDbDataReader的缩写)比DataSet好。有时候我也会看到相反的说法。事实上,Microsoft创建了这两个数据存取类是因为它们都是我们所需要的。每个类都有其优点和不足,你可以根据应用环境来选择用哪一个。

本文就两者的选择问题做了很清楚的讲述,可以让你在运用ASP.NET时,在选择DataReader类或DataSet类的方面得到一些指南。在基于客户端的Windows Form应用程序环境下,这些规则可能会改变。我在做这些讲述时,假设你已经用过DataReader和DataSet类了,并对它们很熟悉。

查看更多...

分类:Web编程 | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 3644