可能是难题哦:两个等长的字符串,既有汉字也有数字,如何比较这两个字符串中字符不同的个数?(汉字算一个字符)

lovelypengpeng 2003-08-04 12:58:41
敬请帮忙
...全文
43 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovelypengpeng 2003-08-06
  • 打赏
  • 举报
回复
谢谢
tutu2223 2003-08-04
  • 打赏
  • 举报
回复
类型错了,应该用widestring
tutu2223 2003-08-04
  • 打赏
  • 举报
回复
var
s1,s2,s3:string;
i:integer;
begin
s1 := edit1.Text; s2 := edit2.Text; s3 := '';
if length(s1) <> length(s2) then
showmessage('两个串不等长!')
else
begin
for i := 1 to length(s1) do
begin
if pos(s2[i],s1)=0 then s3 := s3 + s2[i];
if pos(s1[i],s2)=0 then s3 := s3 + s1[i];
end;
edit3.Text := '共有'+inttostr(length(s3))+'个字符不同,他们是:'+s3;
end;
end;
S.F. 2003-08-04
  • 打赏
  • 举报
回复
比较的时候用WideString 类型即可。
S.F. 2003-08-04
  • 打赏
  • 举报
回复
var WStr:WideString;
AStr:String;
begin
AStr = "123456中国文字!"
WStr = WideString(AStr);
Showmessage(format("按英文计算长度 %d",[length(AStr)]));
Showmessage(format("按混合计算长度 %d",[length(WStr)]));
Showmessage(format("取中文数 %d",[length(WStr)-Length(AStr)]));
end;


还有问题吗?
mingjunlee 2003-08-04
  • 打赏
  • 举报
回复
var
str1,str2: String;
StrLenth,i,Count: Integer;
begin
str1 :='fdfasdfdasf';
str2 :='345wgsdgreg';
StrLenth := Length(str1);
i := StrLenth;
j := i;
for i := 1 to StrLenth do
begin
for j := 1 to StrLenth do
begin
If Copy(str1,i,1) = Copy(str2,j,1) then Break
else If j = StrLenth then Count := Count +1;
end;
end;
end;
elilor 2003-08-04
  • 打赏
  • 举报
回复
这句if (pos(s1[2],s3)=0)and(pos(s2[i],s1)=0) then s3:=s3+s2[i];写错了
应该是if (pos(s2[i],s3)=0)and(pos(s2[i],s1)=0) then s3:=s3+s2[i];
elilor 2003-08-04
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
s1, s2, s3: WideString;
i: integer;
begin
s1:='我是一个好人啊lilor';
s2:='我是一个坏人吗lilor';
for i:=1 to length(s1) do
begin
if (pos(s1[i],s3)=0)and(pos(s1[i],s2)=0) then s3:=s3+s1[i];
if (pos(s1[2],s3)=0)and(pos(s2[i],s1)=0) then s3:=s3+s2[i];
end;
ShowMessage(Format('不同的字符有%d, 它们是(%s)', [length(s3), s3]));
end;

运行结果
---------------------------
test
---------------------------
不同的字符有4, 它们是(好坏啊吗)
---------------------------
OK
---------------------------
WWWWA 2003-08-04
  • 打赏
  • 举报
回复
function GetStrLength(const S: string): integer;
begin
Result:=Length(WideString(S));
end;
lovelypengpeng 2003-08-04
  • 打赏
  • 举报
回复
具体如何做?我是生手啊
DWGZ 2003-08-04
  • 打赏
  • 举报
回复
用WideString
第一部分 程序员必读 第一章 对程序错误的处理 在我们开始介绍Microsoft Windows应该提供的许多特性之前,我们首先必须了解Windows的各个函数是如何进行错误处理的。 当你调用一个Windows函数时,它首先要检验你传递给它的的各个参数的有效性,然后再设法执行它的任务。如果你传递了一个无效参数,或者由于某种原因它无法执行这项操作,那么该函数就会返回一个值,指明该函数在某种程度上运行失败了。表1-1列出了大多数Windows函数使用的数据类型的返回值。 表1-1 Windows函数常用的返回值类型 数据类型 表示失败的值 VOID 该函数的运行不可能失败。Windows函数的返回值类型很少 是VOID。 BOLL 如果函数运行失败,那么返回值是0,否则返回的是非0值。最 好对返回值进行测试,以确定它是0还是非0。如果它是TRUE ,则不要测试返回值。 HANDLE 如果函数运行失败,则返回值通常是NULL,否则返回值为 HANDLE,,用于标识你可以操作的一个对象。对于这个返回 值,你应该小心处理,因为有些函数会返回一个句柄 值INVALID_HANDLE_VALUE,它被定义为-1。该函数的 Platform SDK资料将会清楚地说明该函数是返回NULL还 是INVALID_HANDLE_VALID,以便指明函数运行已经失败。 PVOID 如果函数运行失败,则返回值是NULL,否则返回PVOID,以 标识数据块的内存地址。 LONG/DWORD 这是个难以处理的值。返回数量的函数通常返回LONG 或DWORD。如果由于某种原因,函数无法对你想要进行计数 的对象进行计数,那么该函数通常返回0或-1(根据该函数而定) 。如果你调用的函数返回了LONG/DWORD,那么请认真阅 读Platform SDK资料,以确保你能正确检查潜在的错误。 当一个Windows函数返回一个错误代码时,它常常可以用来了解函数为什么会运行失败。Microsoft公司编译了一个所有可能的错误代码的列表,并且为每个错误代码分配了一个32位的号码。 从系统内部来讲,当一个Windows函数检测到一个错误时,它会使用一个称为线程本地存储器的机制,将相应的错误代码号码与调用的线程关联起来。(“线程本地存储器”将在第21章介绍)。这将使线程能够互相独立地运行,而不会影响各自的错误代码。当函数返回给你时,它的返回值就能指明一个错误已经发生。若要确定这是个什么错误,请调用GetLastError函数: 见原书P4的程序(1) 该函数只返回线程的32位错误代码。 当你拥有32位错误代码的号码时,你必须将该号码转换成更有用的某种对象。WinError.h头文件包含了Microsoft公司定义的错误代码的列表。下面我显示了该列表的某些内容,使你能够看到它的大概样子: 见原书P4的程序(2)和P5的程序 你可以看到,每个错误都有3种表示法:即一个消息ID(这是你可以在源代码使用的一个宏,以便与GetLastError的返回值进行比较),消息文本(对错误的英文描述)和一个号码(你应该避免使用这个号码,而应该使用消息ID)。请记住,我只选择了WinError.h头文件的很少一部分内容来向你进行展示,整个文件的长度超过21000行。 当Windows函数运行失败时,你应该立即调用GetLastError函数,否则,如果你调用另一个Windows函数,它的值很可能被改写。 说明 GetLastError能返回线程产生的最后一个错误。如果该线程调用的Windows 函数运行成功,那么最后一个错误代码就不被改写,并且不指明运行成功。有少 数Windows函数并不遵循这一规则,并且它会更改最后的错误代码,但是Platform SDK资料通常指明,当函数运行成功时,该函数会更改最后的错误代码。 Windows 98 许多Windows 98的函数实际上是用Microsoft公司的16位Windows 3.1产 品产生的16位代码来实现的。这种比较老的代码并不通过GetLastError之类函 数来报告错误,而且Microsoft公司并没有在Windows 98修改16位代码,以 支持这种错误处理方式。对于我们来说,这意味着Windows 98的许多Win32 函数在运行失败时不能设置最后的错误代码。该函数将返回一个值,指明运行失 败,这样你就能够发现该函数确实已经运行失败。但是你无法确定运行失败的原 因。 有些Windows函数之所以能够成功运行,那是若干个原因产生的结果。例如,创建指明的事件内核对象之所以能够取得成功,原因是你实际上创建了该对象,或者是因为已经存在带有相同名字的事件内核对象。你的应用程序必须知道成功的原因。为了将该信息返回给你,Microsoft公司选择使用最后错误代码机制。这样,当某些函数运行成功时,你就能够通过调用GetLadtError函数来确定其他的一些信息。对于具有这种行为特性的函数来说,Platform SDK资料清楚地说明了GetLastError函数可以这样来使用。请参见该资料,以便找出CreateEvent函数的例子。 当你进行调试的时候,我发现监控线程的最后错误代码是非常有用的。在Microsoft Visual studio 6.0,Microsoft的调试程序支持一个非常有用的特性,即你可以配置Watch窗口,以便始终都能向你显示线程的最后错误代码的号码和该错误的英文描述。通过选定Watch窗口的一行,并键入“@err,hr",你就能够做到这一点。观察图1-1,你会看到我已经调用了CreateFile函数。该函数返回INVALID_HANDLE_VALUE(-1)的HANDLE,表示它未能打开指定的文件。但是Watch窗口向我们显示最后错误代码(即如果我调用GetLastErro函数,该函数返回的错误代码)是0x00000002。该Watch窗口又进一步指明错误代码2是指“系统不能找到指定的文件。”你会发现它与WinError.h头文件的错误代码2所指的字符是相同的。 图1-1 在Visual Studio 6.0的Watch窗口键入 “@err,hr",你就可以查看当前线程的最后错误代码。 Visual studio还配有一个小的实用程序,称为Error Lookup。你可以使用Error Lookup将错误代码的号码转换成它的文本描述。 见P7的Error Lookup插图 如果我在我编写的应用程序发现一个错误,我可能想要向用户显示该错误的文本描述。Windows提供了一个函数,可以将错误代码转换成它的文本描述。该函数称为FormatMessage。请看下面的代码: 见原书P8的程序(1) FormatMessage函数的功能实际上是非常丰富的,在创建向用户显示的字符信息时,它是人们首选的函数。该函数之所以有这样大的作用,原因之一是它很容易用多种语言来进行操作。该函数能够检测出用户首选的语言(在Regional Settings Control Panel小应用程序设定),并返回相应的文本。当然,你首先必须自己转换字符,然后将已转换的消息表资源嵌入你的.exe文件或DLL模块,不过,这时该函数会选定正确的嵌入对象。ErrorShow示例应用程序(本章后面将加以介绍)展示了如何调用该函数,以便将Microsoft公司定义的错误代码转换成它的文本描述。 有些人常常问我,Microsoft公司是否建立了一个主控列表,以显示每个Windows函数可能返回的所有错误代码。可惜,答案是没有这样的列表,而且Microsoft公司将永远不会建立这样的一个列表。因为在创建系统的新版本时,建立和维护该列表实在太困难了。 建立这样一个列表时存在的问题是,你可以调用一个Windows函数,但是该函数能够在内部调用另一个函数,而这另一个函数又可以调用另一个函数,如此类推。由于各种不同的原因,这些函数的任何一个函数都可能运行失败。有时,当一个函数运行失败时,较高级的函数对它进行恢复,并且仍然可以执行你想执行的操作。为了创建该主控列表,Microsoft公司必须跟踪每个函数的运行路径,并建立所有可能的错误代码的列表。这项工作很困难。当创建系统的新版本时,这些函数的运行路径就会改变。 1.1 你也能够定义自己的错误代码 好了,我已经说明Windows函数是如何向函数的调用者指明发生的错误。Microsoft公司也使你能够将该机制用于你自己的函数。比如说,你编写了一个你希望其他人调用的函数。你的函数可能因为这样或那样的原因而运行失败,你必须向函数的调用者说明它已经运行失败。 若要指明函数运行失败,你只需要设定线程的最后的错误代码,然后让你的函数返回FALSE,INVALID_HANDLE_VALUE,NULL,或者返回任何合适的信息。若要设定线程的最后错误代码,你只需要调用下面的代码: 见原书P8的程序(2) 请将你认为合适的任何32位号码传递给该函数。我设法使用WinError.h已经存在的代码,只要该代码能够正确地指明我想要报告的错误即可。如果你认为WinError.h的任何代码都不能正确地反映该错误的性质,那么你可以创建你自己的代码。错误代码是个32位的数字,它可以划分成下表所示的各个域。 位 31-30 29 28 27-16 15-0 内容 严重性 Microsoft/ 保留 设备代码 异常代码 客户 含义 0=成功 0=Microsoft 必须是0 由Microsoft 由Microsoft/ 1=供参考 公司定义的 公司定义 客户定义 2=警告 代码 3=错误 1=客户定义 的代码 这些域将在第24章详细讲述。现在,你需要知道的重要域是第29位的信息。Microsoft公司规定,他们建立的所有错误代码的这个信息位均使用0。如果你创建自己的错误代码,你必须在这个信息位输入1。这样,就可以确保你的错误代码与Microsoft公司目前或者将来定义的错误代码不会发生冲突, 1.2 ErrorShow示例应用程序 ErrorShow应用程序“01 ErrorShow.exe"(在图1-2列出)展示了如何获取错误代码的文本描述的方法。该应用程序的源代码和资源文件位于本书所附光盘上的01-ErrorShow目录下。一般来说,该应用程序用于显示调试程序的Watch窗口和Error Lookup程序是如何运行的。当你启动该程序时,就会出现下面这个窗口。 见原书P9的插图 你可以将任何错误代码键入该编辑控件。当你单击Look Up按钮时,在底部的滚动窗口就会显示该错误的文本描述。该应用程序唯一令人感兴趣的特性是如何调用FormatMessage函数。下面是我使用该函数的方法: 见原书P10的程序(1) 第一个代码行用于从编辑控件检索错误代码的号码。然后,建立一个内存块的句柄并将它初始化为NULL。FormatMessage函数在内部对内存块进行分配,并将它的句柄返回给我们。 当调用FormatMessage函数时,我传递了FORMAT_MESSAGE_FROM_SYSTEM标志。该标志告诉FormatMessage函数,我们想要系统定义的错误代码的字符。我还传递了FORMAT_MESSAGE_ALLOCATE_BUFFER标志,告诉该函数为错误代码的文本描述分配足够大的内存块。该内存块的句柄将在hlocal变量返回。第三个参数指明我们想要查找的错误代码的号码,第四个参数指明我们想要文本描述使用什么语言。 如果FormatMessage函数运行成功,那么错误代码的文本描述就位于内存块,我将它拷贝到对话框底部的滚动窗口。如果FormatMesage函数运行失败,我设法查看NetMsg.dll模块的消息代码,以了解该错误是否与网络有关。使用NetMsg.dll模块的句柄,我再次调用FormatMessage函数。你会看到,每个DLL(或.exe)都有它自己的一组错误代码,你可以使用Message Compiler(MC.exe)将这组错误代码添加给该模块,并将一个资源添加给该模块。这就是Visual Studio的Error Lookup工具允许你用Modules对话框进行的操作。 图1-2 ErrorShow示例应用程序 见原书P11—16 第2章 UNICODE 随着Microsoft公司的Windows操作系统在全世界日益广泛的流行,对于我们这些软件开发人员来说,将我们的目标瞄准国际上的各个不同市场,已经成为一个越来越重要的问题。美国的软件版本比国际版本提前6个月推向市场,这曾经是个司空见惯的现象。但是,由于各国对Windows操作系统提供了越来越多的支持,因此就更加容易为国际市场生产各种应用软件,从而缩短了软件的美国版本与国际版本推出的时间间隔。 Windows操作系统始终不逾地提供各种支持,以帮助软件开发人员进行应用程序的本地化工作。应用软件可以从各种不同的函数获得特定国家的信息,并可观察控制面板的设置,以确定用户的首选项。Windows甚至支持不同的字体,以适应我们的应用的需要。 我之所以将这一章放在本书的开头,是因为我考虑到Unicode是开发任何应用程序时要采用的基本步骤。关于Unicode的问题,我在本书的每一章几乎都要讲到,而且本书给出的所有示例应用程序都是“用Unicode实现的”。如果你为Microsoft Windows 2000或Microsoft Windows CE开发应用程序,你应该使用Unicode进行开发。如果你为Microsoft Windows 98开发应用程序,你必须对某些问题作出决定。本章也要讲述Windows 98的有关问题。 2.1 字符集 软件的本地化要解决的真正问题,实际上就是如何来处理不同字符集。多年来,我们许多人一直将文本串作为一系列单字节字符来进行编码,并在结尾处放上一个零。对于我们来说,这已经成了习惯。当我们调用strlen函数时,它在以0结尾的单字节字符数组返回字符的数目。 问题是,有些文字和书写规则(比如日文汉字就是个典型的例子)的字符的符号太多了,因此单字节(它提供的符号最多不能超过256个)是根本不敷使用的。为此我们创建了双字节字符集(DBCS),以支持这些文字和书写规则。 2.1.1 单字节与双字节字符集 在双字节字符字符的每个字符可以包含一个字节,也可以包含两个字节。例如,日文汉字,如果第一个字符在0x81与0x9F之间,或者在0xE0与0xFC之间,那么你就必须观察下一个字节,才能确定字符的这个完整的字符。如果要使用双字节字符集,对于程序员来说简直是个很大的难题,因为有些字符只有一个字节宽,而有些字符则是两个字节宽。 如果只是调用strlen函数,那么你无法真正了解字符究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。ANSI的C运行期库没有配备相应的函数,使你能够对双字节字符集进行操作。但是,Microsoft Visual C++的运行期库却包含许多函数,如_mbslen,它可以用来操作多字节(既包括单字节也包括双字节)字符。 为了帮助你对DBCS字符进行操作,Windows提供了下面的一组帮助函数。 函数 描述 PTSTR CharNext 返回字符的下一个字符的地址 (PCTSTR pszCurrentChar); PTSTR CharPrev 返回字符的上一个字符的地址 (PCTSTR pszStart, PCTSTR pszCurrentChar); BOOL IsDBCSLendByte 如果该字节是DBCS字符的第一个字节,则返 (BYTE bTestChar); 回TRUE 2.1.2 Unicode:宽字节字符集 Unicode是Apple和Xerox公司于1988年建立的一个技术标准。1991年,成立了一个集团机构负责Unicode的开发和推广应用。该集团由Apple、Compaq、HP、IBM、Microsoft、Oracle、Silicon Graphics、Sybase、Unisys和Xerox等公司组成。(若要了解该集团的全部成员,请通过网址www.Unicode.org查找。)该集团公司负责维护Unicode标准。Unicode的完整描述可以参阅AddisonWesley出版的《Unicode Standard》一书。(该书可以通过网址www.Unicode.org订购。) Unicode提供了一种简单而又一致的表示字符的方法。Unicode字符的所有字符都是16位的字符两个字节)。它没有专门的字节来指明下一个字节是属于同一个字符的组成部分,还是一个字符。这意味着你只需要对指针进行递增或递减,就可以遍历字符的各个字符。你不再需要调用CharNext,CharPrev和IsDBCSLeadByte之类的函数。 由于Unicode用一个16位的值来表示每个字符,因此总共可以得到65000个字符,这样,它就能够对世界各国的书面文字的所有字符进行编码。这远远超过了单字节字符集的256个字符的数目。 目前,已经为阿拉伯文、文拼音、西里尔字母(俄文)、希腊文、西伯莱文、日文、韩文和拉丁文(英文)字母定义了Unicode代码点1。这些字符还包含了大量的标点符号、数学符号、技术符号、箭头、装饰标志、区分标志和其他许多字符。如果你将所有这些字母和符号加在一起,总计约达35000个不同的代码点,这样,总计的65000个代码点,大约还有一半可供将来扩充时使用。 这65536个字符可以分成不同的区域。下面这个表显示了一部分这样的区域以及分配给这些区域的字符。 16位代码 字符 16位代码 字符 0000-007F ASCII 0300-036F 通用区分标志 0080-00FF 拉丁文1字符 0400-04FF 西里尔字母 0100-017F 欧洲拉丁文 0530-058F 亚美尼亚文 0180-01FF 扩充拉丁文 0590-05FF 西伯莱文 0250-02AF 标准拼音 0600-06FF 阿拉伯文 02B0-02FF 修改型字母 0900-097F 梵文 注1. 代码点是指字符一个符号的位置 目前尚未分配的代码点大约还有29000个,不过它们是保留供将来使用的。另外,大约有6000个代码点是保留供你个人使用的。 2. 2 为何应该使用Unicode 当你开发应用程序时,你当然应该考虑利用Unicode的优点。即使现在你不打对你的应用程序进行本地化,开发时将Unicode放在心上,肯定可以简化将来的代码转换工作。此外,Unicode还具备下列功能: * 可以很容易地在不同语言之间进行数据交换 * 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件 * 提高你的应用程序的运行效率(本章后面还要详细介绍) 2.3 Windows 2000与Unicode Windows 2000是使用Unicode从头进行开发的,用于创建窗口、显示文本、进行字符操作等的所有核心函数都需要Unicode字符。如果你调用任何一个Windows函数并给它传递一个ANSI字符,那么系统首先要将字符转换成Unicode,然后将Unicode字符传递给操作系统。如果你希望函数返回ANSI字符,系统就会首先将Unicode字符转换成ANSI字符,然后将结果返回给你的应用程序。所有这些转换操作都是在你看不见的情况下发生的。当然,进行这些字符的转换需要占用系统的时间和内存开销。 例如,如果你调用CreateWindowEx函数,并传递类名字和窗口标题文本的非Unicode字符,那么CreateWindowEx必须分配内存块(在你的进程的默认堆),将非Unicode字符转换成Unicode字符,并将结果存储在分配到的内存块,然后调用Unicode版本的CreateWindowEx函数。 对于用字符填入缓存的函数来说,系统必须首先将Unicode字符转换成非Unicode字符,然后你的应用程序才能处理该字符。由于系统必须执行所有这些转换操作,因此你的应用程序需要更多的内存,并且运行的速度比较慢。通过从头开始用Unicode来开发应用程序,你就能够使你的应用程序更加有效地运行。 2. 4 Windows 98与Unicode Windows 98不是一种全新的操作系统。它继承了16位Windows操作系统的特性,它不是用来处理Unicode。如果要增加对Unicode的支持,其工作量非常大,因此在该产品的特性列表没有包括这个支持项目。由于这个原因,Windows 98象它的前任产品一样,几乎都是使用ANSI字符来进行所有的内部操作的。 你仍然可以编写用于处理Unicode字符字符的Windows应用程序,不过,使用Windows函数要难得多。例如,如果你想要调用CreateWindowEx函数并将ANSI字符传递给它,这个调用的速度非常快,不需要从你进程的默认堆栈分配缓存,也不需要进行字符转换。但是,如果你想要调用CreateWindowEx函数并将Unicode字符传递给它,你就必须明确分配缓存,并调用函数,以便执行从Unicode到ANSI字符的转换操作。然后你可以调用CreateWindowEx,传递ANSI字符。当CreateWindowEx函数返回时,你就能释放临时缓存。这比使用Windows 2000上的Unicode要麻烦得多。在本章的后面部分,我要介绍如何在Windows 98下进行这些转换。 虽然Unicode函数的大多数代码在Windows 98不起任何作用,但是有少数Unicode函数确实拥有非常有用的实现代码。这些函数是: 见原书的P21 可惜的是,这些函数有许多函数在Windows 98会出现各种各样的错误。有些函数无法使用某些字体,有些函数会破坏内存堆栈,有些函数会使打印机驱动程序崩溃,如此等等。如果你要使用这些函数,你必须对它们进行大量的测试。即使这样,你可能仍然无法解决问题。因此你必须向用户说明这些情况。 2. 5 Windows CE与Unicode Windows CE操作系统是为小型设备开发的,这些设备的内存很小,并且不带磁盘存储器。你可能认为,由于Microsoft公司的主要目标是建立一种尽可能小的操作系统,因此它会使用ANSI作为自己的字符集。但是Microsoft公司并不是鼠目寸光。他们懂得,采用Windows CE的设备要在世界各地销售,他们希望降低软件开发成本,这样就能更加容易地开发应用程序。为此,Windows CE本身就是使用Unicode的一种操作系统。 但是,为了使Windows CE尽量做得小一些,Microsoft公司决定完全不支持ANSI Windows函数。因此,如果你要为Windows CE开发应用程序,你必须懂得Unicode,并且在整个应用程序使用Unicode。 2. 6 需要注意的问题 下面让我们进一步明确一下“Microsoft公司对Unicode支持的情况”: * Windows 2000既支持Unicode,也支持ANSI,因此你可以为它们当的任何一种开发应用程序 * Windows 98 只支持ANSI,你只能为ANSI开发应用程序 * Windows CE只支持Unicode,你只能为Unicode开发应用程序 虽然Microsoft公司试图让软件开发人员能够非常容易地开发在这3种平台上运行是软件,但是Unicode与ANSI之间的差异使得事情变得困难起来,并且这种差异通常是我遇到的最大的问题之一。请不要误解,Microsoft公司坚定地支持Unicode,并且我也坚决鼓励你使用它。不过你应该懂得,你可能遇到一些问题,需要一定的时间来解决这些问题。我建议你尽可能使用Unicode。如果你运行Windows 98,那么只有在必要时才要转换到ANSI。 不过,还有另一个小问题你应该了解,那就是COM。 2.7 对COM的简单说明 当Microsoft公司将COM从16位Windows转换成Win32时,公司作出了一个决定,即,需要字符的所有COM接口方法都只能接受Unicode字符。这是个了不起的决定,因为COM通常用于使不同的组件能够互相之间进行通信,而Unicode则是传递字符的最佳手段。 如果你为Windows 2000或Windows CE开发应用程序,并且也使用COM,那么你将会如虎添翼。在你的整个源代码使用Unicode,将使与操作系统进行通信和与COM对象进行通信的操作变成一件轻而易举的事情。 如果你为Windows 98开发应用程序,并且也使用COM,那么你将会遇到一些问题。COM要求你使用Unicode字符。操作系统的大多数函数要求你使用ANSI字符。那是多么难办的事情啊!我曾经从事过若干个项目的开发,在这些项目,我编写了许多代码,仅仅是为了来回进行字符的转换。 2. 8 如何编写Unicode源代码 Microsoft公司为Unicode设计了Windows API,这样,它可以尽量减少对你的代码的影响。实际上,你可以编写单个源代码文件,以便使用或者不使用Unicode来对它进行编译。你只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。 2. 8.1 C运行期库对Unicode的支持 为了利用Unicode字符,因此定义了一些数据类型。标准的C头文件String.h已经作了修改,以便定义一个名字为wchar_t的数据类型,它是一个Unicode字符的数据类型: 见原书P23的程序(1) 例如,如果你想要创建一个缓存,用于存放最多为99个字符的Unicode字符一个结尾为零的字符,你可以使用下面这个语句: 见原书P23的程序(2) 该语句创建了一个由100个16位值组成的数组。当然,标准的C运行期字符函数,如strcpy、strchr和strcat等,只能对ANSI字符进行操作,它们不能正确地处理Unicode字符。因此,ANSI C也拥有一组补充函数。图2-1显示了一些标准的ANSI C字符函数,后面是它们的等价Unicode函数。 图2-1 标准的ANSI C字符函数和它们的等价Unicode函数 见原书P23的程序(3)和P24的程序 请注意,所有的Unicode函数均以wcs开头,wcs是宽字符的英文缩写。若要调用Unicode函数,只需用前缀wcs来取代任何ANSI字符函数的前缀str即可。 说明 大多数软件开发人员可能已经不记得这样一个非常重要的问题了,那就 是Microsoft公司提供的C运行期库与ANSI的标准C运行期库是一致的。 ANSI C规定,C运行期库支持Unicode字符字符。这意味着你始终都可 以调用C运行期函数,以便对Unicode字符字符进行操作,即使你是在 Windows 98上运行,也可以调用这些函数。换句话说,wcscat,wcslen和wcstok 等函数都能够在Windows 98上很好地运行,这些都是你必须关心的操作系统函数。 对于包含了对str函数或wcs函数进行显式调用的代码来说,你无法非常容易地同时为ANSI和Unicode对这些代码进行编译。在本章前面部分的内容,我说过可以创建同时为ANSI和Unicode进行编译的单个源代码文件。若要建立这种双重功能,你必须包含Tchar.h文件,而不是包含String.h文件。 Tchar.h文件的唯一作用是帮助你创建ANSI/Unicode通用源代码文件。它包含你应该用在源代码的一组宏,而不应该直接调用str函数或者wcs函数。如果你在编译源代码文件时定义了_UNICODE,这些宏就会引用wcs这组函数。如果你没有定义_UNICODE,那么这些宏将引用str这组宏。 例如,在Tchar.h一个宏称为_tcscpy。如果在你包含该头文件时没有定义_UNICODE,那么_tcscpy就会扩展为ANSI的strcpy函数。但是如果定义了_UNICODE,_tcscpy将扩展为Unicode的wcscpy函数。拥有字符参数的所有C运行期函数都在Tchar.h文件定义了一个通用宏。如果你使用通用宏,而不是ANSI/Unicode的特定函数名,你就能够顺利地创建可以为ANSI或Unicode进行编译的源代码。 但是,除了使用这些宏之外,还有一些操作你是必须进行的。Tchar.h文件包含了一些其他的宏。 若要定义一个ANSI/Unicode通用的字符数组,请使用下面的TCHAR数据类型。如果定义了_UNICODE,TCHAR将声明为下面的形式: 见原书P25的程序(1) 如果没有定义_UNICODE,则TCHAR将声明为下面的形式: 见原书P25的程序(2) 使用该数据类型,你可以象下面这样分配一个字符: 见原书P25的程序(3) 你也可以创建对字符的指针: 见原书P25的程序(4) 不过上面这行代码存在一个问题。按照默认设置,Microsoft公司的C++编译器能够编译所有的字符,就象它们是ANSI字符,而不是Unicode字符。因此,如果没有定义_UNICODE,该编译器将能正确地编译这一行代码。但是,如果定义了_UNICODE,就会产生一个错误。若要生成一个Unicode字符而不是ANSI字符,你必须将该代码行改写为下面的样子: 见原书P25的程序(5) 原义字符前面的大写字母L,用于告诉编译器该字符应该作为Unicode字符来编译。当编译器将字符置于程序的数据部分时,它在每个字符之间分散插入零字节。这种变更带来的问题是,现在只有当定义了_UNICODE时,程序才能成功地进行编译。我们需要另一个宏,以便有选择地在原义字符的前面加上大写字母L。这项工作由_TEXT宏来完成,_TEXT宏也在Tchar.h文件做了定义。如果定义了_UNICODE,那么_TEXT定义为下面的形式: 见原书P25的程序(6)
因pdf的容量过大分4个压缩包打包,还有一个源码另外下载。 《.NET深入体验与实战精要》作者身为从事.NET一线开发的资深开发专家,常年耕耘技术博客,惠及无数.NET新知。此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习路线。本书既考虑到实际开发经常遇到的困惑和难题,也分析了解决问题的思路和方法,更总结出项目开发不可或缺的技术点及思想。读者可以在欣赏一个个有趣例子的过程,不知不觉具备开发真正商业项目的能力。 本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例代码及独家披露的商业系统,供读者参考学习。 本书适合于.NET初、级开发人员参考学习,特别有助于.NET从业者进入实战层次,也可作为相关培训机构的参考教材,还可以作为高等院校相关专业师生的参考书。 目录 第1篇 技术基础总结 第1章 .NET,你真的知道了吗 3 1.1 搞清自己是干什么的 4 1.2 .NET的几个特性 7 1.3 万丈高楼平地起:面试者必会 9 1.3.1 C#介绍 10 1.3.2 命名空间 10 1.3.3 C#语法格式要点 10 1.3.4 变量 12 1.3.5 类型推断 12 1.3.6 变量的作用域 13 1.3.7 常量 16 1.3.8 流程控制 16 1.3.9 字符常见操作 21 1.3.10 几个常用的数学函数 27 1.4 .NET的面向对象之门 27 1.4.1 继承——“子承父业” 28 1.4.2 委托——“任务书” 35 1.4.3 事件——“年终分红” 42 1.4.4 反射——“解剖” 49 1.5 .NET开发几把小刀 52 1.5.1 using之多变身 52 1.5.2 @符号的妙用 54 1.5.3 预处理指令,有你更轻松 55 1.6 Visual Studio.NET 2008 实战 58 1.6.1 如何创建ASP.NET项目 58 1.6.2 如何创建Windows项目 61 1.6.3 Visual Studio.NET 2008 操作与使用技巧 61 1.6.4 常见开发调试技巧 66 1.6.5 错误异常处理方法 70 本章常见技术面试题 76 常见面试技巧之面试前的准备 76 本章小结 77 第2章 细节决定成败 79 2.1 Equals()和运符==的区别 80 2.2 const和readonly的区别 82 2.3 private、protected、public和internal的区别 86 2.4 sealed、new、virtual、abstract与override 87 2.5 abstract class与interface 91 2.6 公共变量与属性的区别 93 2.7 参数修饰符params、out和ref的区别 96 2.8 值类型和引用类型的区别 100 2.9 结构与类的区别 103 2.10 Dispose()和Close()、Finalize()的 区别 106 2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和Release版本的 区别 108 本章常见技术面试题 111 常见面试技巧之细节决定成败 111 本章小结 112 第3章 ASP.NET开发大杂烩 113 3.1 页面生命周期 114 3.1.1 独立页面生命周期事件顺序 114 3.1.2 具有Master页的生命周期事件顺序 116 3.1.3 ASP.NET生命周期详解 118 3.2 页面状态管理 120 3.2.1 Cookie 121 3.2.2 HtmlInputHidden隐藏域 123 3.2.3 ViewState 123 3.2.4 查询字符Request 124 3.2.5 Aplication对象 125 3.2.6 Session对象 125 3.2.7 示例项目:在线用户列表统计 128 3.3 服务器和客户端数据交互 131 3.3.1 页面数据绑定全攻略 131 3.3.2 Bind和Eval的区别 140 3.4 ASP.NET编程的技巧 142 3.4.1 页面之间传值的7种方法 142 3.4.2 get与post方法的区别 146 3.4.3 ASP.NET服务器控件和 HTML控件的区别 146 3.4.4 Server.Transfer和Response.Redirect的区别 148 3.4.5 刷新页面的方法汇总 149 3.4.6 页面事件控制 150 3.4.7 在URL传递文的解决方案 152 3.4.8 增强用户体验的一些技巧 153 3.4.9 XHTML与HTML的区别 156 3.5 打造自己的页面基类PageBase 161 本章常见技术面试题 164 常见面试技巧之如何做好自我介绍 164 本章小结 165 第4章 Windows窗体编程你也行 167 4.1 创建简单的WinForm项目 168 4.2 创建MDI窗体应用 170 4.3 获取应用程序路径信息 174 4.4 回车跳转控件焦点 175 4.5 窗体间传递复杂数据 176 4.5.1 构造传递 176 4.5.2 公有字段传递 177 4.5.3 委托与事件传递 179 4.6 实现个性化窗体界面 181 4.7 无标题窗体拖动的两种方法 183 4.8 让程序只启动一次——单实例运行 184 4.9 实现系统托盘和热键呼出 185 4.10 进程与多线程的区别 190 4.11 创建多线程应用程序 191 4.12 WinForm开发常见问题 194 4.12.1 如何设置运行时窗体的起始位置 194 4.12.2 如何使一个窗体在屏幕的最顶端 194 4.12.3 实现窗体渐显效果 194 4.12.4 设置窗口背景为渐变色 195 4.12.5 模态窗口和非模态窗口 196 4.12.6 屏蔽窗口右上角的关闭 操作 196 4.12.7 调用执行外部的程序 197 本章常见技术面试题 197 常见面试技巧之经典问题巧回答 198 本章小结 198 第5章 数据库开发 199 5.1 ADO.NET与抽水的故事 200 5.1.1 ADO.NET的定义 200 5.1.2 趣味理解ADO.NET对象模型 202 5.1.3 进水笼头——建立Connection 204 5.1.4 抽水机——Command 206 5.1.5 输水管——DataAdapter 209 5.1.6 输水管——DataReader 210 5.1.7 随用随关,释放资源 212 5.1.8 水库管理——DataSet 212 5.1.9 水池子——DataTable 214 5.2 数据库操作类的封装详解 217 5.2.1 执行命令方法的封装 217 5.2.2 查询数据方法的封装 220 5.2.3 数据统计方法的封装 221 5.2.4 实现SqlParameter方式 222 5.2.5 实现多数据库的访问 223 5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 5.4.4 企业级服务COM+事务 231 5.4.5 System.Transactions 事务处理 236 5.5 Oracle开发常见问题 240 5.5.1 Oracle和SQL Server的常用函数对比 240 5.5.2 Oracle和SQL Server的语句区别 244 5.5.3 ASP.NET连接Oracle失败的解决方法 245 本章常见技术面试题 246 常见面试技巧之经典问题巧回答 246 本章小结 247 第6章 关于XML 249 6.1 XML概述 250 6.1.1 XML和HTML有什么区别 250 6.1.2 XML的优势 250 6.2 文档结构与基本语法 251 6.3 XML操作 253 6.3.1 XmlDocument创建XML文档 253 6.3.2 XmlTextWriter创建XML文档 254 6.3.3 XmlDocument读取XML文档 256 6.3.4 XmlTextReader读取XML文档 257 6.3.5 在HTML显示XML的数据 258 6.3.6 JavaScript获取XML内容 259 6.3.7 项目案例:通用自定义XML配置类 263 6.4 ADO.NET与XML 266 6.4.1 读XML文档到DataSet 266 6.4.2 DataSet转为XML文档 267 6.5 项目案例1:实现网站的RSS应用 267 6.6 项目案例2:在线实现RSS阅读器 270 本章常见技术面试题 275 常见面试技巧之经典问题巧回答 275 本章小结 276 第7章 Web Service开发详解 277 7.1 Web Service基本概念 278 7.2 Web Service的应用场景 278 7.3 创建简单的Web Service项目应用 280 7.4 Web Service属性介绍 282 7.5 ASP.NET如何调用Web Service 286 7.6 JavaScript如何调用Web Service 288 7.6.1 通过webbehavior.htc调用Web Service 288 7.6.2 通过Microsoft.XMLDOM调用Web Service 291 7.6.3 XMLHTTP POST调用Web Service 293 7.6.4 SOAP调用Web Service 293 7.7 WinForm如何调用Web Service 295 7.7.1 .NET的WinForm调用Web Service 295 7.7.2 手动发送HTTP请求调用Web Service 295 7.8 实现异步调用Web Service 297 7.9 如何保证Web Service的安全 299 7.9.1 通过SoapHeader来增强 Web Service的安全性 299 7.9.2 采用SSL实现加密传输 302 7.9.3 访问IP限制 315 7.10 Web Service开发需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1 Ajax概述 324 8.1.1 什么是Ajax 324 8.1.2 Ajax技术的核心 325 8.1.3 Ajax的工作原理 326 8.1.4 Ajax的优点 326 8.1.5 Ajax的问题 327 8.1.6 Ajax适用场景 327 8.1.7 Ajax不适用场景 329 8.1.8 XMLHttpRequest开发实例 329 8.2 微软VS.NET的Ajax开发 333 8.2.1 安装ASP.NET 2.0 Ajax Extensions 333 8.2.2 创建ASP.NET Ajax应用程序 333 8.2.3 ScriptManager控件使用技巧 335 8.2.4 UpdaetPanel控件使用技巧 336 8.2.5 AsyncPostBackTrigger实现 外部控件引发局部刷新 338 8.2.6 Ajax错误处理 341 8.2.7 告诉用户你正在做什么—— UpdateProgress控件 342 8.2.8 ASP.NET AjaxControToolKit简介 345 8.3 使用第三方组件 Ajax.dll 开发 347 8.4 使用第三方组件AjaxPro的开发 351 8.5 使用第三方组件MagicAjax的开发 351 8.6 Ajax开发原则 352 本章常见技术面试题 353 常见面试技巧之经典问题巧回答 353 本章小结 354 第9章 系统与文件操作 355 9.1 获取系统信息 356 9.1.1 用SystemInformation类获取系统信息 356 9.1.2 用Environment 类获取系统信息 357 9.1.3 通过WMI获取系统信息 358 9.1.4 用RegistryKey 类读取系统信息 361 9.1.5 用API函数获取系统信息 363 9.1.6 获取系统服务信息 365 9.2 文件操作 368 9.2.1 StreamWriter类实现写文件 368 9.2.2 通过File类创建文件 369 9.2.3 通过FileStream类创建文件 370 9.2.4 通过FileInfo类创建文件 370 9.2.5 追加文本 370 9.2.6 读取文本文件 371 9.2.7 读写二进制文件 372 9.2.8 文件复制、移动、删除 374 9.3 文件夹目录操作 375 9.4 读写INI文件 376 9.5 读写注册表 379 本章常见技术面试题 381 常见面试技巧之经典问题巧回答 381 本章小结 382 第10章 网络应用开发 383 10.1 Socket基本编程 384 10.1.1 Socket基本知识 384 10.1.2 Socket服务端开发步骤 386 10.1.3 Socket客户端开发步骤 388 10.2 异步Socket通信——实现MSN机器人 390 10.2.1 机器人服务端 390 10.2.2 客户端实现步骤 395 10.3 基于TCP协议的客户端和服务端 398 10.3.1 TcpListener 实现网络服务端 398 10.3.2 TcpClient实现网络客户端 399 本章常见技术面试题 401 常见面试技巧之经典问题巧回答 401 本章小结 402 第11章 Windows Service开发 403 11.1 什么是Windows服务 404 11.2 创建Windows服务 404 11.3 Windows服务开发常见问题 408 11.4 安装/卸载Windows服务 409 11.4.1 安装Windows服务 409 11.4.2 卸载Windows服务 410 11.4.3 Windows服务应用程序体系结构 411 11.5 调试Windows服务 414 11.5.1 日志调试法 414 11.5.2 附加进程断点调试法 414 本章常见技术面试题 416 职场智慧之初入江湖 416 本章小结 418 第12章 新技术初探 419 12.1 WPF 421 12.1.1 WPF简介 421 12.1.2 WPF何以令人佩服 422 12.1.3 XAML概述 422 12.1.4 WPF开发环境配置 423 12.1.5 项目示例:开发一个简单的WPF应用程序 424 12.2 WCF 427 12.2.1 SOA是什么 427 12.2.2 WCF是什么 428 12.2.3 WCF的优势是什么 428 12.2.4 WCF开发环境 431 12.2.5 项目示例:订票服务WCF开发步骤 431 12.3 LINQ 440 12.3.1 LINQ的架构 441 12.3.2 传统的查询 441 12.3.3 LINQ查询实例 444 12.3.4 LINQ查询语法 448 本章常见技术面试题 449 职场智慧之学习方法 449 本章小结 450 第2篇 系统架构设计思想 第13章 面向对象思想 453 13.1 为什么要面向对象 454 13.2 什么是面向对象 456 13.3 面向对象的特点 458 13.3.1 封装 459 13.3.2 继承 459 13.3.3 多态 460 13.4 面向对象设计和开发实例 466 13.4.1 传统过程化设计实现播放器功能 466 13.4.2 基于面向对象设计实现播放器功能 467 13.4.3 面向对象封装、继承、多态的应用 468 13.4.4 设计模式、条件外置及反射技术的应用 471 13.5 面向对象分析(OOA)的方法 475 13.6 面向对象设计的原则 478 13.6.1 优先使用(对象)组合,而非(类)继承 478 13.6.2 针对接口编程,而非(接口的)实现 481 13.6.3 开放-封闭法则(OCP) 482 13.6.4 Liskov替换法则(LSP) 485 13.6.5 单一职责原则(SRP) 486 13.6.6 依赖倒置原则(DIP) 486 13.6.7 接口分离原则(ISP) 489 13.6.8 面向对象设计时需要注意的 问题 490 本章常见技术面试题 491 本章小结 491 第14章 三层架构项目开发 493 14.1 什么是三层架构 494 14.1.1 常用的三层架构设计 494 14.1.2 趣味理解:三层架构与养猪 496 14.2 为什么要用三层架构 497 14.3 三层架构项目开发示例 500 14.3.1 数据库设计 500 14.3.2 创建整体解决方案 501 14.3.3 业务实体Model的实现 502 14.3.4 数据访问层的实现 504 14.3.5 业务逻辑层的实现 509 14.3.6 表示层的实现 510 14.4 实现基于工厂模式的三层架构 512 14.4.1 扩展新增数据访问层 512 14.4.2 IDAL抽象接口的实现 513 14.4.3 创建DAL对象的封装 517 14.4.4 实现抽象工厂模式 519 14.4.5 工厂模式的三层架构图 521 本章常见技术面试题 522 职场智慧之程序员的职业规划 523 本章小结 524 第15章 大型网站的性能优化与安全 525 15.1 高效C#编码优化 526 15.2 页面(HTML)优化的方法 534 15.3 ASP.NET开发性能优化 540 15.3.1 如没必要,尽量使用静态HTML页面 540 15.3.2 避免不必要的回送操作 541 15.3.3 尽量在客户端进行用户输入验证 541 15.3.4 关闭不必要的Session状态 542 15.3.5 优先使用HTML控件,而非服务器控件 542 15.3.6 不必要时关闭ViewState 542 15.3.7 禁用调试模式 543 15.4 系统缓存管理 543 15.4.1 缓存的分类 544 15.4.2 传统缓存方式 545 15.4.3 页面输出缓存 545 15.4.4 页面输出缓存API 548 15.4.5 页面局部缓存 549 15.4.6 应用程序数据缓存 554 15.4.7 文件缓存依赖 555 15.4.8 数据库缓存依赖 557 15.4.9 Memcached——分布式缓存系统 560 15.4.10 Cacheman——.NET架构 下的分布式缓存项目 561 15.5 数据库访问性能优化 562 15.5.1 选择合适的.NET数据供应器 563 15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪监视SQL Server当前链接池状态 564 15.5.4 善用数据库的存储过程 567 15.5.5 SqlDataRead和Dataset的选择 567 15.5.6 ExecuteNonQuery和 ExecuteScalar的选择 568 15.5.7 数据的绑定DataBinder 568 15.5.8 使用DataReader的注意事项 568 15.5.9 Command对象的使用 569 15.5.10 反复地执行SQL语句用 Prepare() 569 15.5.11 分页的数据访问 570 15.5.12 SQL命令的优化 570 15.5.13 tempdb的使用技巧 572 15.5.14 使用视图代替跨库操作 572 15.5.15 尽量避免大事务操作 572 15.5.16 尽量避免使用游标 573 15.5.17 为你的表建立适当的索引 573 15.6 网站安全防护 573 15.6.1 什么是SQL注入式攻击 573 15.6.2 如何防范SQL注入式攻击 574 15.6.3 实现页面验证码 575 15.6.4 实现文件防盗链 579 15.6.5 采用HTTPS进行访问 584 15.7 IIS优化 584 15.7.1 如何监测IIS服务器并发数 584 15.7.2 采用Gzip压缩页面优化 585 15.7.3 网站应用程序池配置 588 15.8 网站架构优化策略 593 本章常见技术面试题 596 职场智慧之独善其身 596 本章小结 599 第16章 系统设计的原则和技巧 601 16.1 系统设计的一些原则 602 16.1.1 最适合的才是最好的 602 16.1.2 以不变应万变 603 16.1.3 可扩展性 603 16.1.4 可复用性 604 16.2 系统设计的常用方法 604 16.3 敏捷软件开发12条原则 608 16.4 系统架构师成长之路 611 本章常见技术面试题 615 职场智慧之职场政治 615 本章小结 616 第3篇 项目实战解析 第17章 权限角色管理项目解析 619 17.1 权限角色管理概述 620 17.2 项目概述 623 17.3 数据库设计 624 17.3.1 数据库实体关系模型 624 17.3.2 表结构设计 625 17.4 数据访问层 627 17.4.1 类设计 627 17.4.2 代码实现 629 17.5 业务逻辑层 629 17.5.1 类设计 630 17.5.2 扩展.NET Framework用户处理机制 632 17.6 接口调用与Web管理实现 638 17.6.1 Web.config配置 638 17.6.2 用户身份和权限验证 638 17.6.3 用户验证接口方式:权限验证用户控件 640 17.6.4 用户验证接口方式:页面基类 642 17.6.5 用户和角色权限的后台管理 644 职场智慧之如何提升自己在公司的价值 652 本章小结 653 第18章 单点登录系统的设计与实现 655 18.1 项目概述 656 18.1.1 名词定义 656 18.1.2 项目需求描述 656 18.2 业务流程设计 657 18.2.1 用户认证流程 657 18.2.2 安全验证流程 658 18.3 功能与接口设计 659 18.3.1 接口交互设计 659 18.3.2 应用系统接口 660 18.3.3 认证服务器功能和接口 660 18.4 数据库设计 660 18.4.1 数据库实体关系模型 661 18.4.2 表结构设计 661 18.5 实现认证服务器 662 18.5.1 SSO解决方案 663 18.5.2 系统管理后台 664 18.5.3 用户通行证管理心 665 18.5.4 认证服务器接口开发 673 18.6 应用系统接入接口开发 675 18.6.1 用户身份认证 675 18.6.2 接收状态同步 676 18.6.3 用户注销 678 18.6.4 更新认证服务器状态 679 18.7 接口封装及调用 679职场智慧之晋升之道 682 本章小结 684 第19章 常用.NET开发工具介绍 685 19.1 源码版本管理: Visual SourceSafe 2005 686 19.1.1 安装和配置VSS 2005服务端 686 19.1.2 安装和配置VSS客户端 691 19.1.3 将项目加入VSS版本控制 692 19.1.4 客户端连接VSS 服务器获取源代码 694 19.1.5 设置VSS支持通过 Internet访问 696 19.1.6 版本控制的几个概念 701 19.1.7 VSS项目权限管理 703 19.1.8 VSS数据备份 705 19.1.9 VSS 2005的使用规范 707 19.2 单元测试工具:NUnit 708 19.2.1 NUnit简介 708 19.2.2 手把手教你在.NET应用NUnit 708 19.3 日志工具——Log4net 714 19.3.1 Log4net简介 714 19.3.2 使用步骤 717 19.3.3 单独配置文件的使用 719 19.4 代码规范检查工具: Microsoft Source Analysis for C# 721 19.5 生成文档注释工具:GhostDoc 723 19.6 反编译工具:Reflector for .NET 732 19.7 动软.NET代码生成器 733 19.8 帮助文档生成工具:Sandcastle 737 19.8.1 Sandcastle介绍 737 19.8.2 生成方式 738 19.8.3 具体生成步骤 740 本章小结 748 附录A 软件编码规范 A.1 概述 750 A.1.1 规范基本原则 750 A.1.2 术语定义 750 A.1.3 文件命名组织 750 A.2 代码外观 751 A.2.1 列宽 751 A.2.2 换行 751 A.2.3 缩进 751 A.2.4 空行 751 A.2.5 空格 752 A.2.6 括号——() 753 A.2.7 花括号——{} 753 A.3 程序注释 754 A.3.1 注释概述 754 A.3.2 文档型注释 755 A.3.3 类注释 755 A.3.4 单行注释 755 A.3.5 注释标签 756 A.4 声明 758 A.4.1 每行声明数 758 A.4.2 初始化 758 A.4.3 位置 758 A.4.4 类和接口的声明 759 A.4.5 字段的声明 759 A.5 命名规范 759 A.5.1 命名概述 759 A.5.2 大写规则 760 A.5.3 缩写 761 A.5.4 命名空间 761 A.5.5 类 762 A.5.6 接口 762 A.5.7 属性(Attribute) 763 A.5.8 枚举(Enum) 763 A.5.9 参数 763 A.5.10 方法 764 A.5.11 属性(property) 764 A.5.12 事件 765 A.5.13 常量(const) 766 A.5.14 字段 767 A.5.15 静态字段 768 A.5.16 集合 768 A.5.17 措词 768 A.6 语句 769 A.6.1 每行一个语句 769 A.6.2 复合语句 769 A.6.3 return语句 769 A.6.4 if、if-else、if else-if语句 770 A.6.5 for、foreach 语句 770 A.6.6 while语句 771 A.6.7 do-while语句 771 A.6.8 switch-case语句 771 A.6.9 try-catch语句 772 A.6.10 using块语句 772 A.6.11 goto语句 772 A.7 其他 773 A.7.1 表达式 773 A.7.2 类型转换 773 A.8 匈牙利命名法 773 A.9 控件命名规则 774 A.9.1 一般命名方法 774 A.9.2 主要控件名简写对照表 774 ……
因pdf的容量过大分4个压缩包打包,还有一个源码另外下载。 《.NET深入体验与实战精要》作者身为从事.NET一线开发的资深开发专家,常年耕耘技术博客,惠及无数.NET新知。此次将长期的思考、感悟,多年的系统开发、设计和团队管理经验,以及深入分析众多项目实战的宝贵成果和盘托出,力求将编程思想与具体实践融为一体,提炼出适合于广大读者快速理解和彻底掌握.NET软件开发的最佳学习路线。本书既考虑到实际开发经常遇到的困惑和难题,也分析了解决问题的思路和方法,更总结出项目开发不可或缺的技术点及思想。读者可以在欣赏一个个有趣例子的过程,不知不觉具备开发真正商业项目的能力。 本书集实用性、思想性、趣味性于一体,内容共分为技术基础总结、系统架构设计思想及项目实战解析三部分,随书所附光盘收录大量实例代码及独家披露的商业系统,供读者参考学习。 本书适合于.NET初、级开发人员参考学习,特别有助于.NET从业者进入实战层次,也可作为相关培训机构的参考教材,还可以作为高等院校相关专业师生的参考书。 目录 第1篇 技术基础总结 第1章 .NET,你真的知道了吗 3 1.1 搞清自己是干什么的 4 1.2 .NET的几个特性 7 1.3 万丈高楼平地起:面试者必会 9 1.3.1 C#介绍 10 1.3.2 命名空间 10 1.3.3 C#语法格式要点 10 1.3.4 变量 12 1.3.5 类型推断 12 1.3.6 变量的作用域 13 1.3.7 常量 16 1.3.8 流程控制 16 1.3.9 字符常见操作 21 1.3.10 几个常用的数学函数 27 1.4 .NET的面向对象之门 27 1.4.1 继承——“子承父业” 28 1.4.2 委托——“任务书” 35 1.4.3 事件——“年终分红” 42 1.4.4 反射——“解剖” 49 1.5 .NET开发几把小刀 52 1.5.1 using之多变身 52 1.5.2 @符号的妙用 54 1.5.3 预处理指令,有你更轻松 55 1.6 Visual Studio.NET 2008 实战 58 1.6.1 如何创建ASP.NET项目 58 1.6.2 如何创建Windows项目 61 1.6.3 Visual Studio.NET 2008 操作与使用技巧 61 1.6.4 常见开发调试技巧 66 1.6.5 错误异常处理方法 70 本章常见技术面试题 76 常见面试技巧之面试前的准备 76 本章小结 77 第2章 细节决定成败 79 2.1 Equals()和运符==的区别 80 2.2 const和readonly的区别 82 2.3 private、protected、public和internal的区别 86 2.4 sealed、new、virtual、abstract与override 87 2.5 abstract class与interface 91 2.6 公共变量与属性的区别 93 2.7 参数修饰符params、out和ref的区别 96 2.8 值类型和引用类型的区别 100 2.9 结构与类的区别 103 2.10 Dispose()和Close()、Finalize()的 区别 106 2.11 string和StringBuilder有什么区别 106 2.12 Debug版本和Release版本的 区别 108 本章常见技术面试题 111 常见面试技巧之细节决定成败 111 本章小结 112 第3章 ASP.NET开发大杂烩 113 3.1 页面生命周期 114 3.1.1 独立页面生命周期事件顺序 114 3.1.2 具有Master页的生命周期事件顺序 116 3.1.3 ASP.NET生命周期详解 118 3.2 页面状态管理 120 3.2.1 Cookie 121 3.2.2 HtmlInputHidden隐藏域 123 3.2.3 ViewState 123 3.2.4 查询字符Request 124 3.2.5 Aplication对象 125 3.2.6 Session对象 125 3.2.7 示例项目:在线用户列表统计 128 3.3 服务器和客户端数据交互 131 3.3.1 页面数据绑定全攻略 131 3.3.2 Bind和Eval的区别 140 3.4 ASP.NET编程的技巧 142 3.4.1 页面之间传值的7种方法 142 3.4.2 get与post方法的区别 146 3.4.3 ASP.NET服务器控件和 HTML控件的区别 146 3.4.4 Server.Transfer和Response.Redirect的区别 148 3.4.5 刷新页面的方法汇总 149 3.4.6 页面事件控制 150 3.4.7 在URL传递文的解决方案 152 3.4.8 增强用户体验的一些技巧 153 3.4.9 XHTML与HTML的区别 156 3.5 打造自己的页面基类PageBase 161 本章常见技术面试题 164 常见面试技巧之如何做好自我介绍 164 本章小结 165 第4章 Windows窗体编程你也行 167 4.1 创建简单的WinForm项目 168 4.2 创建MDI窗体应用 170 4.3 获取应用程序路径信息 174 4.4 回车跳转控件焦点 175 4.5 窗体间传递复杂数据 176 4.5.1 构造传递 176 4.5.2 公有字段传递 177 4.5.3 委托与事件传递 179 4.6 实现个性化窗体界面 181 4.7 无标题窗体拖动的两种方法 183 4.8 让程序只启动一次——单实例运行 184 4.9 实现系统托盘和热键呼出 185 4.10 进程与多线程的区别 190 4.11 创建多线程应用程序 191 4.12 WinForm开发常见问题 194 4.12.1 如何设置运行时窗体的起始位置 194 4.12.2 如何使一个窗体在屏幕的最顶端 194 4.12.3 实现窗体渐显效果 194 4.12.4 设置窗口背景为渐变色 195 4.12.5 模态窗口和非模态窗口 196 4.12.6 屏蔽窗口右上角的关闭 操作 196 4.12.7 调用执行外部的程序 197 本章常见技术面试题 197 常见面试技巧之经典问题巧回答 198 本章小结 198 第5章 数据库开发 199 5.1 ADO.NET与抽水的故事 200 5.1.1 ADO.NET的定义 200 5.1.2 趣味理解ADO.NET对象模型 202 5.1.3 进水笼头——建立Connection 204 5.1.4 抽水机——Command 206 5.1.5 输水管——DataAdapter 209 5.1.6 输水管——DataReader 210 5.1.7 随用随关,释放资源 212 5.1.8 水库管理——DataSet 212 5.1.9 水池子——DataTable 214 5.2 数据库操作类的封装详解 217 5.2.1 执行命令方法的封装 217 5.2.2 查询数据方法的封装 220 5.2.3 数据统计方法的封装 221 5.2.4 实现SqlParameter方式 222 5.2.5 实现多数据库的访问 223 5.3 常用经典SQL语句 224 5.4 事务处理 226 5.4.1 SQL和存储过程级别的事务 227 5.4.2 ADO.NET级别的事务 229 5.4.3 ASP.NET页面级别的事务 230 5.4.4 企业级服务COM+事务 231 5.4.5 System.Transactions 事务处理 236 5.5 Oracle开发常见问题 240 5.5.1 Oracle和SQL Server的常用函数对比 240 5.5.2 Oracle和SQL Server的语句区别 244 5.5.3 ASP.NET连接Oracle失败的解决方法 245 本章常见技术面试题 246 常见面试技巧之经典问题巧回答 246 本章小结 247 第6章 关于XML 249 6.1 XML概述 250 6.1.1 XML和HTML有什么区别 250 6.1.2 XML的优势 250 6.2 文档结构与基本语法 251 6.3 XML操作 253 6.3.1 XmlDocument创建XML文档 253 6.3.2 XmlTextWriter创建XML文档 254 6.3.3 XmlDocument读取XML文档 256 6.3.4 XmlTextReader读取XML文档 257 6.3.5 在HTML显示XML的数据 258 6.3.6 JavaScript获取XML内容 259 6.3.7 项目案例:通用自定义XML配置类 263 6.4 ADO.NET与XML 266 6.4.1 读XML文档到DataSet 266 6.4.2 DataSet转为XML文档 267 6.5 项目案例1:实现网站的RSS应用 267 6.6 项目案例2:在线实现RSS阅读器 270 本章常见技术面试题 275 常见面试技巧之经典问题巧回答 275 本章小结 276 第7章 Web Service开发详解 277 7.1 Web Service基本概念 278 7.2 Web Service的应用场景 278 7.3 创建简单的Web Service项目应用 280 7.4 Web Service属性介绍 282 7.5 ASP.NET如何调用Web Service 286 7.6 JavaScript如何调用Web Service 288 7.6.1 通过webbehavior.htc调用Web Service 288 7.6.2 通过Microsoft.XMLDOM调用Web Service 291 7.6.3 XMLHTTP POST调用Web Service 293 7.6.4 SOAP调用Web Service 293 7.7 WinForm如何调用Web Service 295 7.7.1 .NET的WinForm调用Web Service 295 7.7.2 手动发送HTTP请求调用Web Service 295 7.8 实现异步调用Web Service 297 7.9 如何保证Web Service的安全 299 7.9.1 通过SoapHeader来增强 Web Service的安全性 299 7.9.2 采用SSL实现加密传输 302 7.9.3 访问IP限制 315 7.10 Web Service开发需要注意的问题 316 本章常见技术面试题 320 常见面试技巧之经典问题巧回答 320 本章小结 321 第8章 用户体验的杀手锏—— Ajax 323 8.1 Ajax概述 324 8.1.1 什么是Ajax 324 8.1.2 Ajax技术的核心 325 8.1.3 Ajax的工作原理 326 8.1.4 Ajax的优点 326 8.1.5 Ajax的问题 327 8.1.6 Ajax适用场景 327 8.1.7 Ajax不适用场景 329 8.1.8 XMLHttpRequest开发实例 329 8.2 微软VS.NET的Ajax开发 333 8.2.1 安装ASP.NET 2.0 Ajax Extensions 333 8.2.2 创建ASP.NET Ajax应用程序 333 8.2.3 ScriptManager控件使用技巧 335 8.2.4 UpdaetPanel控件使用技巧 336 8.2.5 AsyncPostBackTrigger实现 外部控件引发局部刷新 338 8.2.6 Ajax错误处理 341 8.2.7 告诉用户你正在做什么—— UpdateProgress控件 342 8.2.8 ASP.NET AjaxControToolKit简介 345 8.3 使用第三方组件 Ajax.dll 开发 347 8.4 使用第三方组件AjaxPro的开发 351 8.5 使用第三方组件MagicAjax的开发 351 8.6 Ajax开发原则 352 本章常见技术面试题 353 常见面试技巧之经典问题巧回答 353 本章小结 354 第9章 系统与文件操作 355 9.1 获取系统信息 356 9.1.1 用SystemInformation类获取系统信息 356 9.1.2 用Environment 类获取系统信息 357 9.1.3 通过WMI获取系统信息 358 9.1.4 用RegistryKey 类读取系统信息 361 9.1.5 用API函数获取系统信息 363 9.1.6 获取系统服务信息 365 9.2 文件操作 368 9.2.1 StreamWriter类实现写文件 368 9.2.2 通过File类创建文件 369 9.2.3 通过FileStream类创建文件 370 9.2.4 通过FileInfo类创建文件 370 9.2.5 追加文本 370 9.2.6 读取文本文件 371 9.2.7 读写二进制文件 372 9.2.8 文件复制、移动、删除 374 9.3 文件夹目录操作 375 9.4 读写INI文件 376 9.5 读写注册表 379 本章常见技术面试题 381 常见面试技巧之经典问题巧回答 381 本章小结 382 第10章 网络应用开发 383 10.1 Socket基本编程 384 10.1.1 Socket基本知识 384 10.1.2 Socket服务端开发步骤 386 10.1.3 Socket客户端开发步骤 388 10.2 异步Socket通信——实现MSN机器人 390 10.2.1 机器人服务端 390 10.2.2 客户端实现步骤 395 10.3 基于TCP协议的客户端和服务端 398 10.3.1 TcpListener 实现网络服务端 398 10.3.2 TcpClient实现网络客户端 399 本章常见技术面试题 401 常见面试技巧之经典问题巧回答 401 本章小结 402 第11章 Windows Service开发 403 11.1 什么是Windows服务 404 11.2 创建Windows服务 404 11.3 Windows服务开发常见问题 408 11.4 安装/卸载Windows服务 409 11.4.1 安装Windows服务 409 11.4.2 卸载Windows服务 410 11.4.3 Windows服务应用程序体系结构 411 11.5 调试Windows服务 414 11.5.1 日志调试法 414 11.5.2 附加进程断点调试法 414 本章常见技术面试题 416 职场智慧之初入江湖 416 本章小结 418 第12章 新技术初探 419 12.1 WPF 421 12.1.1 WPF简介 421 12.1.2 WPF何以令人佩服 422 12.1.3 XAML概述 422 12.1.4 WPF开发环境配置 423 12.1.5 项目示例:开发一个简单的WPF应用程序 424 12.2 WCF 427 12.2.1 SOA是什么 427 12.2.2 WCF是什么 428 12.2.3 WCF的优势是什么 428 12.2.4 WCF开发环境 431 12.2.5 项目示例:订票服务WCF开发步骤 431 12.3 LINQ 440 12.3.1 LINQ的架构 441 12.3.2 传统的查询 441 12.3.3 LINQ查询实例 444 12.3.4 LINQ查询语法 448 本章常见技术面试题 449 职场智慧之学习方法 449 本章小结 450 第2篇 系统架构设计思想 第13章 面向对象思想 453 13.1 为什么要面向对象 454 13.2 什么是面向对象 456 13.3 面向对象的特点 458 13.3.1 封装 459 13.3.2 继承 459 13.3.3 多态 460 13.4 面向对象设计和开发实例 466 13.4.1 传统过程化设计实现播放器功能 466 13.4.2 基于面向对象设计实现播放器功能 467 13.4.3 面向对象封装、继承、多态的应用 468 13.4.4 设计模式、条件外置及反射技术的应用 471 13.5 面向对象分析(OOA)的方法 475 13.6 面向对象设计的原则 478 13.6.1 优先使用(对象)组合,而非(类)继承 478 13.6.2 针对接口编程,而非(接口的)实现 481 13.6.3 开放-封闭法则(OCP) 482 13.6.4 Liskov替换法则(LSP) 485 13.6.5 单一职责原则(SRP) 486 13.6.6 依赖倒置原则(DIP) 486 13.6.7 接口分离原则(ISP) 489 13.6.8 面向对象设计时需要注意的 问题 490 本章常见技术面试题 491 本章小结 491 第14章 三层架构项目开发 493 14.1 什么是三层架构 494 14.1.1 常用的三层架构设计 494 14.1.2 趣味理解:三层架构与养猪 496 14.2 为什么要用三层架构 497 14.3 三层架构项目开发示例 500 14.3.1 数据库设计 500 14.3.2 创建整体解决方案 501 14.3.3 业务实体Model的实现 502 14.3.4 数据访问层的实现 504 14.3.5 业务逻辑层的实现 509 14.3.6 表示层的实现 510 14.4 实现基于工厂模式的三层架构 512 14.4.1 扩展新增数据访问层 512 14.4.2 IDAL抽象接口的实现 513 14.4.3 创建DAL对象的封装 517 14.4.4 实现抽象工厂模式 519 14.4.5 工厂模式的三层架构图 521 本章常见技术面试题 522 职场智慧之程序员的职业规划 523 本章小结 524 第15章 大型网站的性能优化与安全 525 15.1 高效C#编码优化 526 15.2 页面(HTML)优化的方法 534 15.3 ASP.NET开发性能优化 540 15.3.1 如没必要,尽量使用静态HTML页面 540 15.3.2 避免不必要的回送操作 541 15.3.3 尽量在客户端进行用户输入验证 541 15.3.4 关闭不必要的Session状态 542 15.3.5 优先使用HTML控件,而非服务器控件 542 15.3.6 不必要时关闭ViewState 542 15.3.7 禁用调试模式 543 15.4 系统缓存管理 543 15.4.1 缓存的分类 544 15.4.2 传统缓存方式 545 15.4.3 页面输出缓存 545 15.4.4 页面输出缓存API 548 15.4.5 页面局部缓存 549 15.4.6 应用程序数据缓存 554 15.4.7 文件缓存依赖 555 15.4.8 数据库缓存依赖 557 15.4.9 Memcached——分布式缓存系统 560 15.4.10 Cacheman——.NET架构 下的分布式缓存项目 561 15.5 数据库访问性能优化 562 15.5.1 选择合适的.NET数据供应器 563 15.5.2 及时地关闭数据库连接 563 15.5.3 跟踪监视SQL Server当前链接池状态 564 15.5.4 善用数据库的存储过程 567 15.5.5 SqlDataRead和Dataset的选择 567 15.5.6 ExecuteNonQuery和 ExecuteScalar的选择 568 15.5.7 数据的绑定DataBinder 568 15.5.8 使用DataReader的注意事项 568 15.5.9 Command对象的使用 569 15.5.10 反复地执行SQL语句用 Prepare() 569 15.5.11 分页的数据访问 570 15.5.12 SQL命令的优化 570 15.5.13 tempdb的使用技巧 572 15.5.14 使用视图代替跨库操作 572 15.5.15 尽量避免大事务操作 572 15.5.16 尽量避免使用游标 573 15.5.17 为你的表建立适当的索引 573 15.6 网站安全防护 573 15.6.1 什么是SQL注入式攻击 573 15.6.2 如何防范SQL注入式攻击 574 15.6.3 实现页面验证码 575 15.6.4 实现文件防盗链 579 15.6.5 采用HTTPS进行访问 584 15.7 IIS优化 584 15.7.1 如何监测IIS服务器并发数 584 15.7.2 采用Gzip压缩页面优化 585 15.7.3 网站应用程序池配置 588 15.8 网站架构优化策略 593 本章常见技术面试题 596 职场智慧之独善其身 596 本章小结 599 第16章 系统设计的原则和技巧 601 16.1 系统设计的一些原则 602 16.1.1 最适合的才是最好的 602 16.1.2 以不变应万变 603 16.1.3 可扩展性 603 16.1.4 可复用性 604 16.2 系统设计的常用方法 604 16.3 敏捷软件开发12条原则 608 16.4 系统架构师成长之路 611 本章常见技术面试题 615 职场智慧之职场政治 615 本章小结 616 第3篇 项目实战解析 第17章 权限角色管理项目解析 619 17.1 权限角色管理概述 620 17.2 项目概述 623 17.3 数据库设计 624 17.3.1 数据库实体关系模型 624 17.3.2 表结构设计 625 17.4 数据访问层 627 17.4.1 类设计 627 17.4.2 代码实现 629 17.5 业务逻辑层 629 17.5.1 类设计 630 17.5.2 扩展.NET Framework用户处理机制 632 17.6 接口调用与Web管理实现 638 17.6.1 Web.config配置 638 17.6.2 用户身份和权限验证 638 17.6.3 用户验证接口方式:权限验证用户控件 640 17.6.4 用户验证接口方式:页面基类 642 17.6.5 用户和角色权限的后台管理 644 职场智慧之如何提升自己在公司的价值 652 本章小结 653 第18章 单点登录系统的设计与实现 655 18.1 项目概述 656 18.1.1 名词定义 656 18.1.2 项目需求描述 656 18.2 业务流程设计 657 18.2.1 用户认证流程 657 18.2.2 安全验证流程 658 18.3 功能与接口设计 659 18.3.1 接口交互设计 659 18.3.2 应用系统接口 660 18.3.3 认证服务器功能和接口 660 18.4 数据库设计 660 18.4.1 数据库实体关系模型 661 18.4.2 表结构设计 661 18.5 实现认证服务器 662 18.5.1 SSO解决方案 663 18.5.2 系统管理后台 664 18.5.3 用户通行证管理心 665 18.5.4 认证服务器接口开发 673 18.6 应用系统接入接口开发 675 18.6.1 用户身份认证 675 18.6.2 接收状态同步 676 18.6.3 用户注销 678 18.6.4 更新认证服务器状态 679 18.7 接口封装及调用 679职场智慧之晋升之道 682 本章小结 684 第19章 常用.NET开发工具介绍 685 19.1 源码版本管理: Visual SourceSafe 2005 686 19.1.1 安装和配置VSS 2005服务端 686 19.1.2 安装和配置VSS客户端 691 19.1.3 将项目加入VSS版本控制 692 19.1.4 客户端连接VSS 服务器获取源代码 694 19.1.5 设置VSS支持通过 Internet访问 696 19.1.6 版本控制的几个概念 701 19.1.7 VSS项目权限管理 703 19.1.8 VSS数据备份 705 19.1.9 VSS 2005的使用规范 707 19.2 单元测试工具:NUnit 708 19.2.1 NUnit简介 708 19.2.2 手把手教你在.NET应用NUnit 708 19.3 日志工具——Log4net 714 19.3.1 Log4net简介 714 19.3.2 使用步骤 717 19.3.3 单独配置文件的使用 719 19.4 代码规范检查工具: Microsoft Source Analysis for C# 721 19.5 生成文档注释工具:GhostDoc 723 19.6 反编译工具:Reflector for .NET 732 19.7 动软.NET代码生成器 733 19.8 帮助文档生成工具:Sandcastle 737 19.8.1 Sandcastle介绍 737 19.8.2 生成方式 738 19.8.3 具体生成步骤 740 本章小结 748 附录A 软件编码规范 A.1 概述 750 A.1.1 规范基本原则 750 A.1.2 术语定义 750 A.1.3 文件命名组织 750 A.2 代码外观 751 A.2.1 列宽 751 A.2.2 换行 751 A.2.3 缩进 751 A.2.4 空行 751 A.2.5 空格 752 A.2.6 括号——() 753 A.2.7 花括号——{} 753 A.3 程序注释 754 A.3.1 注释概述 754 A.3.2 文档型注释 755 A.3.3 类注释 755 A.3.4 单行注释 755 A.3.5 注释标签 756 A.4 声明 758 A.4.1 每行声明数 758 A.4.2 初始化 758 A.4.3 位置 758 A.4.4 类和接口的声明 759 A.4.5 字段的声明 759 A.5 命名规范 759 A.5.1 命名概述 759 A.5.2 大写规则 760 A.5.3 缩写 761 A.5.4 命名空间 761 A.5.5 类 762 A.5.6 接口 762 A.5.7 属性(Attribute) 763 A.5.8 枚举(Enum) 763 A.5.9 参数 763 A.5.10 方法 764 A.5.11 属性(property) 764 A.5.12 事件 765 A.5.13 常量(const) 766 A.5.14 字段 767 A.5.15 静态字段 768 A.5.16 集合 768 A.5.17 措词 768 A.6 语句 769 A.6.1 每行一个语句 769 A.6.2 复合语句 769 A.6.3 return语句 769 A.6.4 if、if-else、if else-if语句 770 A.6.5 for、foreach 语句 770 A.6.6 while语句 771 A.6.7 do-while语句 771 A.6.8 switch-case语句 771 A.6.9 try-catch语句 772 A.6.10 using块语句 772 A.6.11 goto语句 772 A.7 其他 773 A.7.1 表达式 773 A.7.2 类型转换 773 A.8 匈牙利命名法 773 A.9 控件命名规则 774 A.9.1 一般命名方法 774 A.9.2 主要控件名简写对照表 774 ……

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧