博文
C#中关于this关键字(2006-09-13 10:16:00)
摘要:C#中的保留字this仅限于在构造函数,类的方法和类的实例中使用。
在类的构造函数中出现的this作为一个值类型,它表示对正在构造的对象本身的引用
在类的方法中出现的this作为一个值类型,表示对调用该方法的对象的引用
在结构的构造函数中出现的this作为一个变量类型,表示对正在构造的结构的引用
在结构的方法中出现this作为一个变量类型,表示对调用该方法的结构的引用
除此之外,其他地方使用this保留字都是不合法的。
using System;
class A
{
public int x;
public void Main()
{
x=5;
Console.WriteLine("this is the value of the x:{0}",x);
Console.WriteLine("this is the value of the this.x:{0}",this.x);
}
}
这个程序不知道为什么执行的时候出现问题。
成员常量
public const double X=1.0
关键字const用于声明常量,后面要声明的常量的类型。
类的常量的修饰符号:
public ;private;protected;internal;new......
C# 静态成员和方法的学习小结(2006-09-13 09:57:00)
摘要:数据成员:
数据成员可以分静态变量、实例变量两种.
静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.
实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在.
函数成员:
方法可以主要分为静态方法,实例方法
静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量,静态方法不可以直接访问实例变量,可以在实例函数调用的情况下,实例变量做为参数传给静态方法。静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法。
实例方法:一个实例方法的执行与特定对象关联,他的执行需要一个对象存在。实例方法可以直接访问静态变量和实例变量,实例方法可以直接访问实例方法、和静态方法,静态方法的访问方式为类名加点操作符加变量名。当多个实例对象存在时,内存中并不是存在美个特定的实例方法的拷贝,而是,相同类的所有对象都共享每个实例方法的一个拷贝(实例方法只占用“一套”空间)。
如果将类中的某个成员声明为static,则称该成员为静态成员。一般来说,静态成员是属于类所有的,而非静态成员则属于类的实例的。每创建一个类的实例,都在内存中为非静态成员开辟一片区域。而类的静态成员为类所有,为这个类的所有实例共享。无论这个类创建了多少副本,一个静态成员在内存中只占有一块区域。
C#类中静态成员变量的生命周期问题,就是什么时候创建,什么时候销毁已声明元素的“生存期”是元素可供使用的时间周期。变量是唯一具有生存期的元素;为此,编译器将过程参数和函数返回值视为变量的特殊情况。变量的生存期表示它可以保留值的时间周期。在生存期内变量的值可以更改,但变量总是保留某些值。
不同的生存期
在模块级声明的变量通常在应用程序的整个运行期间都存在。在类或结构中声明的非共享变量作为声明它的类或结构的每个实例的单独副本存在;每个这样的变量都具有与它的实例相同的生存期。但是,Shared 变量仅有一个生存期,即应用程序运行所持续的全部时间。
用 Dim 声明的局部变量仅当声明它们的过程正在执行时存在。这同样适用于过程的参数和任何函数返回值。但是,如果该过程调用......
在C#应用程序中控制输入法(2006-09-06 09:59:00)
摘要:在Windows系统一般都安装了至少三种输入法,在输入数据时常常会切换输入法,虽然Windows系统提供了切换快捷健,但对输入工作还是带来了不少麻烦。如果在应用程序中为用户提供智能输入法自动切换,那么这样的应用程序就显得更加专业、更加具有竞争力。不知你可用过Access,在表数据输入时Access自动切换输入法,很酷吧,现在你也可以实现这一切。如果也想你的程式也酷一下的话,请继续...
为了控制输入法,.NET类库在System.Windows.Forms.InputLanguage类中提供了支持。我计划先花一点时间讲述InputLanguage类的功能,随后举一个实例InputLanguageRichEdit。
1、InputLanguage类是一个密封类,它提供了许多方法和属性实现输入法管理功能,这其中有几个属性尤其重要,我将在下面逐一讲解,如果你想全面了解类的全部方法和属性,请浏览MSDN。
public static InputLanguage CurrentInputLanguage {get; set;}
//获得或设置当前线程的输入法。
public static InputLanguage DefaultInputLanguage {get;}
//获得缺省输入法。
public static InputLanguageCollection InstalledInputLanguages{get;}
//获得系统输入法集。可以通过这个容器对象列举系统当前安装的输入法列表。
public string LayoutName {get;}
//获得输入法在系统托盘中的注册名称。
......
2、我们已经研究了InputLanguage类提供的几个重要属性了,现在可以开始动手在应用开发中应用InputLanguage类。我想创建一个.NET Window Form的系统程序,用一个列表框列举当前系统安装的所有输入法,通过改变列表框的选项自动改变当前线程的输入法。同时还实现了根据桌面托盘中输入法的变化来改变列表框的选项。
(1)、新建项......
所有HTTP 状态代码及其定义 (2006-09-06 09:58:00)
摘要:状态行包含HTTP版本、状态代码、与状态代码对应的简短说明信息。在大多数情况下,除了Content-Type之外的所有应答头都是可选的。但Content-Type是必需的,它描述的是后面文档的MIME类型。虽然大多数应答都包含一个文档,但也有一些不包含,例如对HEAD请求的应答永远不会附带文档。有许多状态代码实际上用来标识一次失败的请求,这些应答也不包含文档(或只包含一个简短的错误信息说明)。
当用户试图通过 HTTP 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码。状态代码可以指明具体请求是否已成功,还可以揭示请求失败的确切原因。
1xx - 信息提示
这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应。 100 - 继续。
101 - 切换协议。
2xx - 成功
这类状态代码表明服务器成功地接受了客户端请求。
200 - 确定。客户端请求已成功。
201 - 已创建。
202 - 已接受。
203 - 非权威性信息。
204 - 无内容。
205 - 重置内容。
206 - 部分内容。
3xx - 重定向
客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。
302 - 对象已移动。
304 - 未修改。
307 - 临时重定向。
4xx - 客户端错误
发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。
400 - 错误的请求。
401 - 访问被拒绝。IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示:
401.1 - 登录失败。
401.2 - 服务器配置导致登录失败。
401.3 - 由于 ACL 对资源的限制而未获得授权。
401.4 - 筛选器授权失败。
401.5 - ISAPI/CGI 应用程序授权失败。
401.7 – 访问被 W......
使用C#实现阿拉伯数字到大写中文的转换(2006-09-06 09:57:00)
摘要://Money类
using System;
namespace Money
{
/// <summary>
/// 本类实现阿拉伯数字到大写中文的转换
/// 该类没有对非法数字进行判别
/// 请调用NumToChn方法
/// 作者:menway
/// </summary>
public class Money
{
public Money()
{
//
// TODO: Add constructor logic here
//
}
private char 转换数字(char x)
{
string stringChnNames="零一二三四五六七八九";
string stringNumNames="0123456789";
return stringChnNames[stringNumNames.IndexOf(x)];
}
private string 转换万以下整数(string x)
{
string[] stringArrayLevelNames=new string[4] {"","十","百","千"};
string ret="";
int i;
for (i=x.Length-1;i>=0;i--)
if (x[i]=='0')
ret=转换数字(x[i])+ret;
else
ret=转换数字(x[i])+stringArrayLevelNames[x.Length-1-i]+ret;
while ((i=ret.IndexOf("零零"))!=-1)
ret=ret.Remove(i,1);
if (ret[ret.Length-1]=='零' && ret.Length>1)
ret=ret.Remove(ret.Length-1,1);
if (ret.Length>=2 ......
用Visual C#实现局域网点对点通讯 (2006-09-06 09:56:00)
摘要:点对点即Peer-To-Peer,通常简写为P2P。所谓网络中的点对点,其实可以看成是一种对等的网络模型。P2P其实是实现网络上不同计算机之间,不经过中继设备直接交换数据或服务的一种技术。P2P由于允许网络中任一台计算机可以直接连接到网络中其他计算机,并与之进行数据交换,这样既消除了中间环节,也使得网络上的沟通变得更容易、更直接。
P2P作为一种网络的模型,它有别于传统的客户/服务器模型。客户/服务器模型一般都有预定义的客户机和服务器。而在P2P模型转并没有明确的客户端和服务器,但其实在P2P模型中,每一台计算机既可以看成是服务器,也可以看成是客户机。在网络中,传统上的客户机/服务器通讯模型中,发送服务请求或者发送数据的计算机,一般称为客户机;而接收、处理服务或接收数据的计算机称为服务器。而在P2P网络模型中,计算机不仅接收数据,还有发送数据,不仅提出服务请求,还有接收对方的服务请求。
在下面介绍的用Visual C#实现的局域网点对点通讯程序,就有如下特点,在网络利用此通讯程序进行通讯的任一计算机,在通讯之前,都需要侦听端口号,接受其他机器的连接申请,并在连接建立后,就可以接收对方发送来的数据;同时也可以向其他机器提出连接申请,并在对方计算机允许建立连接请求后,发送数据到对方。可见在网络中利用此软件进行P2P网络通讯的任一计算机既是客户机,同样也是服务器。
一.程序的设计、调试、运行的软件环境:
(1).微软公司视窗2000服务器版
(2).Visual Studio .Net正式版,.Net FrameWork SDK版本号3705
二.关键步骤及其解决方法:
关键步骤就是实现信息在网络中的发送和接收。数据接收使用的是Socket,数据发送使用的是NetworkStream。
1.利用Socket来接收信息:
为了更清楚的说明问题,程序在处理数据发送和接收时采用了不通的端口号,发送数据程序在缺省状态设定的端口号为"8889"。下面代码是侦听端口号"8889",接受网络中对此端口号的连接请求,并在建立连接后,通过Socket接收远程计算机发送来的数据:
数据库中与C#中的数据类型对照(2006-09-06 09:55:00)
摘要:/// <summary>
/// 数据库中与C#中的数据类型对照
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
private string ChangeToCSharpType(string type)
{
string reval=string.Empty;
switch(type.ToLower())
{
case "int":
reval= "Int32";
break;
case "text":
reval= "String";
break;
case "bigint":
reval= "Int64";
break;
case "binary":
reval= "System.Byte[]";
break;
case "bit":
reval= "Boolean";
break;
case "char":
reval= "String";
break;
case "datetime":
reval= "System.DateTime";
break;
case "decimal":
reval= "System.Decimal";
break;
case "float":
reval= "System.Double";
break;
case "image":
reval= "System.Byte[]";
break;
case "money":
reval= "System.Decimal";
break;
case "nchar":
reval= "String";
break;
case "ntext":
reval= ......
用制作C#作屏幕捕获程序 (2006-09-06 09:55:00)
摘要:我们已经了解了Visual Basic或者Delphi等语言是如何来实现对屏幕图象捕获的。那么对于C#来说,是如何实现这种功能的?本文就来探讨一下这个问题。
一. 程序设计开发及运行环境:
(1).微软视窗2000服务器版
(2)..Net FrameWork SDK Beta 2
二. 程序设计的关键步骤以及具体的实现方法:
(1).首先要创建一个和当前屏幕大小相同的Bitmap对象:
要实现此操作,首先就要现获得当前显示器的DC,然后根据此DC来创建Graphic对象,再由此Graphic对象产生此位图对象。这样产生的位图对象才是和当前屏幕大小相一致的。由于要获得显示器的DC,利用.Net的类库是无法实现的,这需要调用一个Windows的API函数。我们知道视窗所有API都封装在Kernel、User 和GDI三个库中文件中:其中Kernel,他的库名为 KERNEL32.DLL。User 这个类库在Win32中名叫 USER32.DLL。 它主要管理全部的用户接口。譬如:窗口 、菜单 、对话框 、图标等等。GDI(图象设备接口),它在Win32中的库名为:GDI32.dll,要获得显示器的DC,所调用的API函数--CreateDC ( ),就被封装在此类库中。而要在C#中声明视窗的API函数需要使用.Net FrameWork SDK中的名字空间System.Runtime.InteropServices,此名字空间提供了一系列的类来访问COM对象,和调用本地的API函数。下面是在C#中声明此函数:
[ System.Runtime.InteropServices.DllImportAttribute ( gdi32.dll ) ]
private static extern IntPtr CreateDC (
string lpszDriver , // 驱动名称
string lpszDevice , // 设备名称
string lpszOutput , // 无用,可以设定位NULL
IntPtr lpInitData // 任意的打印机数据
......
彻底剖析C# 2.0泛型类的创建和使用 (2006-09-06 09:54:00)
摘要:"一次编码,多次使用",这就是引入泛型的根源。在以前的C++中称为模板,C#泛型通过算法和数据结构支持独立编码。例如,泛型列表意味着,你不必再重写一个强类型集合。在本文中,作者将向你展示定义和使用泛型是多么容易的事情-请注意,长期以来泛型一直被认为是最高级和最困难的术语。
一、 简介
泛型现在在任何一种语言中都被认为是一个高级的强有力的术语。当我在C++中第一次接触模板时,我对之有些疑惑。之后,我读了Bjarne Stroustrop的《The Design and Evolution of C++》,才发现模板的使用就象C中的宏和用之来取代的简单串替换模板一样容易。其实,模板和泛型是相同的东西-尽管它们的实现稍微不同。
C#泛型支持在使用点处才定义算法及其数据类型。在C#的一些早期版本中,我们可以证明没有泛型也可以工作,因为每种类型都是派生于一个公共基类型-object。这意味着程序员可以基于object类型定义一个栈类并且把一切东西放到该栈上(因为一切都派生于object)。然而,一个object栈意味着,Customer对象,Integer对象以及假想的对象都能被放置到同一个栈的实例上。结果是,开发者要子类化数据类型来把数据类型绑定到他们要与之交互的东西上去。例如,在编写定制的商业对象时,我们就建议定义派生于System.Collections.CollectionBase的强类型集合。原因很简单:基于object定义一切被认为是弱类型定义。
业界的高手们在数十年前就确信强类型优于弱类型,所以.NET最终支持强类型,这看上去是很自然的事情。强类型算法当然建议类型化参数-这正是我们在泛型中所用的东西。
十几年来,我们一直在使用字母T作为类型化参数的名字。这样,在任何泛型类使用者所提供的数据类型的地方,你都能够找到T。使用泛型的关键仅仅是提供这个T。定义泛型的关键在于实现一个方法或类,并且用特定数据类型来替换掉T。
C#中的泛型支持另外一些提炼。例如,一个方法或类可以有多个参数化的类型并且C#泛型还支持WHERE约束-它用来具体要求类型化参数的类型。例如,如果一个泛型类型必须实现接口IDisposable,那么C#泛型是支持实现这一限......
C#中读取数据库中Image数据 (2006-09-06 09:53:00)
摘要:DataReader 的默认行为是在整个数据行可用时立即以行的形式加载传入数据。但是,对于二进制大对象 (BLOB) 则需要进行不同的处理,因为它们可能包含数十亿字节的数据,而单个行中无法包含如此多的数据。Command.ExecuteReader 方法具有一个重载,它将采用 CommandBehavior 参数来修改 DataReader 的默认行为。您可以将 CommandBehavior.SequentialAccess 传递到 ExecuteReader 方法来修改 DataReader 的默认行为,以便让 DataReader 按照顺序在接收到数据时立即将其加载,而不是加载数据行。这是加载 BLOB 或其他大数据结构的理想方案。
在将 DataReader 设置为使用 SequentialAccess 时,务必要注意访问所返回字段的顺序。DataReader 的默认行为是在整个行可用时立即加载该行,这使您能够在读取下一行之前按任何顺序访问所返回的字段。但是,当使用 SequentialAccess 时,必须按顺序访问由 DataReader 返回的不同字段。例如,如果查询返回三个列,其中第三列是 BLOB,则必须在访问第三个字段中的 BLOB 数据之前返回第一个和第二个字段的值。如果在访问第一个或第二个字段之前访问第三个字段,则第一个和第二个字段值将不再可用。这是因为 SequentialAccess 已修改 DataReader,使其按顺序返回数据,当 DataReader 已经读取超过特定数据时,该数据将不可用。
当访问 BLOB 字段中的数据时,请使用 DataReader 的 GetBytes 类型化访问器,该访问器将使用二进制数据填充 byte 数组。您可以指定要返回的特定数据缓冲区大小以及从返回的数据中读取的第一个字节的起始位置。GetBytes 将返回 long 值,它表示所返回的字节数。如果向 GetBytes 传递空的 byte 数组,所返回的长值将是 BLOB 中字节的总数。您可以选择将字节数组中的某索引指定为所读取数据的起始位置。
以下示例从 Microsoft SQL Server 中的 pubs 示例数据库中返回发行者 ID 和徽标。发行者 ID (pub_id) ......