C# 程序员参考--属性教程(转)
本教程展示如何创建自定义属性类,如何在代码中使用它们,以及如何通过反射查询它们。教程属性提供功能强大的方法以将声明信息与 C# 代码(类型、方法、属性等)相关联。与程序实体关联后,属性可在运行时查询,并可以以任意多种方式使用。属性的用法示例包括: 将帮助文档与程序实体关联(通过 Help 属性)。 将值编辑器关联到 GUI 框架中的特定类型(通过 ValueEditor 属性)。除一个完整的示例外,本教程还包括以下主题: 声明属性类 第一件需要做的事情是声明属性。使用属性类 创建属性后,随即将属性与特定的程序元素关联。通过反射访
C# 程序员参考--COM Interop 第一部分:C# 客户端教程(转)
COM Interop 提供对现有 COM 组件的访问,而不需要修改原始组件。若要将 COM 代码合并到托管应用程序,请通过使用 COM Interop 实用工具 (TlbImp.exe) 导入相关的 COM 类型。一经导入,COM 类型就可以使用。此外,COM Interop 还使 COM 开发人员能够像访问其他 COM 对象一样轻松访问托管对象。同样,COM Interop 提供了一个专用实用工具 (RegAsm.exe),此工具将托管类型导出到类型库中,并将托管组件注册为传统 COM 组件。在运行时,公共语言运行库根据需要在 COM 对象和托管对象之间封送数据。该教程显示如何使用 C# 与 COM 对象交互操作
C# 程序员参考--平台调用教程(转)
平台调用服务 (PInvoke) 允许托管代码调用在 DLL 中实现的非托管函数。本教程说明使用什么方法才能从 C# 调用非托管 DLL 函数。该教程所讨论的属性允许您调用这些函数并使数据类型得到正确封送。教程C# 代码有以下两种可以直接调用非托管代码的方法: 直接调用从 DLL 导出的函数。 调用 COM 对象上的接口方法(有关更多信息,请参见 COM Interop 第一部分:C# 客户端教程)。对于这两种技术,都必须向 C# 编译器提供非托管函数的声明,并且还可能需要向 C# 编译器提供如何封送与非托管代码之间传递的参数和返回值的说明。该教程由下列主题
C# 程序员参考--XML 文档教程(转)
本教程展示如何使用 XML 将代码存档。教程C# 提供一种机制,供开发人员使用 XML 将其代码存档。在源代码文件中,以下代码行可以作为注释处理并放在文件中:以 /// 开始的行;在用户定义的类型(如类、委托或接口)、某成员(如字段、事件、属性或方法)或某命名空间声明之前的行。示例下面的示例提供对某个已存档的类型的基本概述。若要编译该示例,请键入以下命令行:csc XMLsample.cs /doc:XMLsample.xml这将创建 XML 文件 XMLsample.xml,您可以在浏览器中或使用 TYPE 命令查看该文件。// XMLsample.cs// compile with: /doc:XMLsample
C# 程序员参考--条件方法教程(转)
本教程演示条件方法,它们提供一种功能强大的机制,通过它可以根据是否定义了预处理器符号来包括或省略方法调用。示例文件请参见“条件方法”示例以下载和生成本教程中讨论的示例文件。教程条件方法使开发人员能够创建这样的方法,可将对这些方法的调用放在代码中,然后编译期间根据预处理符号包括或省略这些调用。假定您想在调试版本中启用某些断言代码,而在发布版本中禁用它们。在 C++ 中,有不止一种方法可以将此功能包含到您的代码中,例如: 使用 #ifdef 同时定义宏的调试版本和发布版本。调试版本调用跟踪代码,而发布版本不执行任
C# 程序员参考--显式接口实现教程(转)
本教程演示如何显式实现接口成员以及如何从接口实例访问这些成员。教程实现接口的类可以显式实现该接口的成员。当显式实现某成员时,不能通过类实例访问该成员,而只能通过该接口的实例访问该成员。本教程包含两个示例。第一个示例阐释如何显式实现和访问接口成员。第二个示例展示如何实现具有相同成员名的两个接口。示例 1本示例声明一个 IDimensions 接口和一个 Box 类,该类显式实现接口成员 Length 和 Width。通过接口实例 myDimensions 访问这些成员。// explicit1.csinterface IDimensions { float Length(); float Width();}cl
C# 程序员参考--事件教程(转)
本教程展示如何在 C# 中声明事件、调用事件和挂接到事件。教程C# 中的“事件”是当对象发生某些有趣的事情时,类向该类的客户提供通知的一种方法。事件最常见的用途是用于图形用户界面;通常,表示界面中的控件的类具有一些事件,当用户对控件进行某些操作(如单击某个按钮)时,将通知这些事件。但是事件未必只用于图形界面。事件为对象提供一种通常很有用的方法来发出信号表示状态更改,这些状态更改可能对该对象的客户很有用。事件是创建类的重要构造块,这些类可在大量的不同程序中重复使用。使用委托来声明事件。如果您尚未学习“委托
C# 程序员参考--委托教程(转)
本教程演示委托类型。它说明如何将委托映射到静态方法和实例方法,以及如何组合委托(多路广播)。教程C# 中的委托类似于 C 或 C++ 中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与 C 或 C++ 中的函数指针不同,委托是面向对象、类型安全的,并且是安全的。委托声明定义一种类型,它用一组特定的参数以及返回类型封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法
C# 程序员参考--运算符重载教程(转)
本教程演示用户定义的类如何重载运算符。示例文件请参见“运算符重载”示例以下载和生成本教程中讨论的示例文件。教程运算符重载允许为运算指定用户定义的运算符实现,其中一个或两个操作数是用户定义的类或结构类型。本教程包含两个示例。第一个示例展示如何使用运算符重载创建定义复数加法的复数类。第二个示例展示如何使用运算符重载实现三值的逻辑类型。示例 1本示例展示如何使用运算符重载创建定义复数加法的复数类 Complex。本程序使用 ToString 方法的重载显示数字的虚部和实部以及加法结果。// complex.csusing System;public str
C# 程序员参考--结构教程(转)
本教程介绍结构的语法和用法。它还涉及类与结构之间的重大差异。示例文件请参见“结构”示例以下载和生成本教程中讨论的示例文件。教程此教程包括两个示例。第一个示例向您展示如何声明和使用结构,而第二个示例演示向方法传递实例时结构和类之间的差异。还向您介绍下列主题: 结构与类 堆还是堆栈? 构造函数和继承 结构上的属性示例 1本示例声明一个结构,它有三个成员:一个属性、一个方法和一个私有字段。本示例创建该结构的一个实例,并将其投入使用:// struct1.csusing System;struct SimpleStruct{ private int xval; publi
C# 程序员参考--版本控制教程(转)
本教程使用 override 和 new 关键字来演示 C# 中的版本控制。版本控制在基类和派生类衍生时维护它们之间的兼容性。教程C# 语言被设计为不同库中的基类和派生类之间的版本控制可以衍生,并保持向后兼容。例如,这意味着在基类中引入与派生类中的某个成员名称相同的新成员不是错误。它还意味着类必须显式声明某方法是要重写一个继承方法,还是一个仅隐藏具有类似名称的继承方法的新方法。在 C# 中,默认情况下方法不是虚拟的。若要使方法成为虚拟方法,必须在基类的方法声明中使用 virtual 修饰符。然后,派生类可以使用 override 关键字重写
利用VC# 创作简单的多线程组件(转)
可以编写能同时执行多个任务的应用程序。此能力(称为“多线程处理”或“自由线程处理”)是设计处理器密集型且要求用户输入的组件的强大方法。计算工资表信息的组件就是一个可能利用多线程处理的组件示例。该组件可以在一个线程上处理用户输入到数据库的数据,而在另一个线程上执行频繁使用处理器的工资表计算。通过在不同的线程上运行这些进程,用户不必等到计算机完成计算,就可以输入其他数据。在本演练中,将创建一个简单的多线程组件,该组件可以同时执行若干个复杂计算。 创建项目 应用程序将包括单个窗体和一个组件。用户将输
C#中TreeView组件使用方法初步(转)
TreeView组件是由多个类来定义的,TreeView组件是由命名空间"System.Windows.Forms"中的"TreeView"类来定义的,而其中的节点(即Node),是由命名空间"System.Windows.Forms"中的"TreeNode"来定义的。所以当在程序中创建一个TreeView对象,其实只是创建了一个可以放置节点的"容器"。而在这个容器中加入一个节点,其实就是加入了从"TreeNode"类中创建的一个节点对象;同样删除一个节点,也就是删除一个"TreeNode"节点对象。 一. 本文中介绍的程序设计及运行环境
c#中构建异常处理(转)
异常是程序运行中发生的错误,异常处理是程序设计的一部分。在c#中异常处理是通过Exception基类进行的,可以创建自己的异常类,但这个类必须是继承自Exception基类。 异常将导致不完善或者不需要的结果,因此在程序设计中需要处理异常。异常也可以是象"IndexOutOfBounds"这样的错误,这个错误表示程序试图访问数组中部存在的元素;比如数组最大元素为100,当试图访问元素101时就将会发生这样的错误。但这些都是内建的异常,可以直接通过Exception基类处理,如果发生的异常不是内建的,那么就需要我们自己见一个异常处理类,
C#锐利体验之第八讲 索引器与操作符重载(转)
索引器 索引器(Indexer)是C#引入的一个新型的类成员,它使得对象可以像数组那样被方便,直观的引用。索引器非常类似于我们前面讲到的属性,但索引器可以有参数列表,且只能作用在实例对象上,而不能在类上直接作用。下面是典型的索引器的设计,我们在这里忽略了具体的实现。class MyClass{ public object this [int index] { get { // 取数据 } set { // 存数据 } }}索引器没有像属性和方法那样的名字,关键字this清楚地表达了索引器引用对象的特征。和属性一
C#锐利体验之第七讲 域与属性(转)
域 域(Field)又称成员变量(Member Variable),它表示存储位置,是C#中类不可缺少的一部分。域的类型可以是C#中任何数据类型。但对于除去string类型的其他引用类型由于在初始化时涉及到一些类的构造器的操作,我们这里将不提及,我们把这一部分内容作为“类的嵌套”放在“接口 继承与多态”一讲内来阐述。 域分为实例域和静态域。实例域属于具体的对象,为特定的对象所专有。静态域属于类,为所有对象所共用。C#严格规定实例域只能通过对象来获取,静态域只能通过类来获取。例如我们有一个类型为MyClass的对象MyObject,MyClass内的实例域in
六种快速修理C# Bug的方法(转)
.NET Framework中包含许多工具可以用来更快、更容易地编写正确的程序。但我们得面临这样的情况:出现bugs。不管程序多么简单,程序员都可能出错。根据我的经验,大多数程序的bugs出现在程序员之间的接口:当一个程序员编写的代码被另一个程序员调用时。不知何故,调用者破坏了代码编写时做的假设。是谁的过错呢?这并不要紧,更重要的是你能多快修好它?下面这些技巧将帮你在程序投入使用前更快地发现并解决这些问题。最终,这些技巧会帮你诊断任何的确在使用中出现的问题。测试假设条件测试假设条件是构建正确的程序最重要的一个方法。在
C#代表元及事件触发(转)
代表元是C#中比较复杂的概念,C#中的代表元和C/C++中的函数指针非常相似使用代表元可以把代表元内部方法的引用封装起来然后通过它使用代表元引用的方法。它有一个特性就是不需要知道被引用的方法属于那一个类对象只要函数的参数个数与返回类型与代表元对象一致。这样说可能比较抽象我下面举几个简单的例子希望能给广大初学者一些基本的认识//定义一个返回值为string的无参数的代表元注意这个代表元只能引用对象中返回值为string的无参数方法delegate string MyDelegate();public class MyClass{public string SayHello(){return &q
C#编译器(转)
以下是国外人写的一个C#编译器,当然由于他依然使用的.Net下的FCL,所以不可能是真正意义上的编译器, 飞刀我介绍出来,只是可以让大家摆脱csc的约束,在Win界面上完成编译. 你必须以下面的步骤完成: 1.建立一个CSharpCodeProvider 实例(如果是使用Visual Basic则使用VBCodeProvider) 2.包含接口ICodeCompiler 3.提供CompilerParameters的参数 4.使用CompileAssemblyFromSource方法编译。 5.运行CompilerResults 6.执行编译好的程序 编译的代码可以是写在文本框中的字符串,当然也可以源文件。 以下是源代码:),过两天我修改一下后提供整
理解C#中的string类型(转)
目的 本文的目的在于揭示和DOTNET及C#相关的一些常见的和不常见的问题。在这些问题中我的第一篇文章和string数据类型有关,string数据类型是一种引用类型,但是当和其他引用类型比较的时候,很多开发人员可能并不能完全理解它的行为。 问题 对于常见的引用类型,当改变一个对象别名的值时,这种变化也同样会在一个实际的对象中表现出来;反之亦然。但是对于string类型,似乎不是这样的。 解释 引用类型 假设我们有一个类MyType,这个类有一个属性Name;我们还有一个类AppType,这个类提供Main()方法来运行这个程