随笔分类 -  .NET

摘要:事件概述 在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。特点发行者确定何时引发事件,订户确定执行何种操作来响应该事件。一个事件可以有多个订户。一个订户可处理来自多个发行者的多个事件。没有订户的事件永远不会被调用。事件通常用于通知用户操作如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序,也可以设置异步调用事件。可以利用事件同步线程。事件是基于 EventHandler 委托和 EventArgs 基类的。事件的订阅和取消订阅如果您想编写引发事件时调用的自定义代码,则可以订阅由其他类发布的事. 阅读全文
posted @ 2013-06-20 08:33 M守护神 阅读(1320) 评论(1) 推荐(0) 编辑
摘要:委托类型定义 C#编译器处理委托时,先自动产生一个派生自System.MulticastDelegate的密封类。这个类与它的基类System.Delegate一起为委托提供必要的基础设施,以维护以后将要调用的方法列表。它含有3个编译器生成的方法,这3个方法的参数与返回值基于委托的声明。public sealed class DelegateName :System.MulticastDelegate{ public DReturnType Invoke (DParams); public IAsyncResult BeginInvoke(DParams,AsyncCallback cb... 阅读全文
posted @ 2013-06-19 08:31 M守护神 阅读(1707) 评论(0) 推荐(0) 编辑
摘要:程序集程序集(assembly)是一个或多个托管模块,以及一些资源文件的逻辑组合。组成部分Windows文件首部CLR文件首部程序集清单类型元数据MSIL(CIL)代码嵌入资源集作用代码重用确定类型边界可版本化的单元自描述的可配置的命名空间一个程序集内相关类型的一个分组,一个程序集可以包含任意个命名空间,每个命名空间又可以包含多种类型。根命名空间SystemMicrosoft解决命名冲突使用完全限定名使用别名嵌套命名空间namespace A{ namespaceB { }}GAC:全局程序集缓存GAC全称是Global Assembly Cache,是可以存放一些有很多程序都要用到的公共.. 阅读全文
posted @ 2013-06-18 08:49 M守护神 阅读(1057) 评论(0) 推荐(2) 编辑
摘要:封装 对象的内部数据不应该从对象的实例直接访问,如果调用者想改变对象的状态就要使用访问方法(getter)和修改方法(setter),封装提供了一种保护状态数据完整性的方法,可用于验证输入数据是否符合业务规则。实现方式访问方法和修改方法属性继承 新的类可以从其他类中继承利用他们既有的功能。这是通过以下方式实现的:在声明类时,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(即基类)。语法public class A{ public A() { }}public class B : A{ public B() { }}代码重用is-a:继承has-a:包含、委托模型基类一个... 阅读全文
posted @ 2013-06-17 10:01 M守护神 阅读(1001) 评论(0) 推荐(0) 编辑
摘要:异常处理 可以使用 TryCatch 活动处理方法执行期间引发的异常。 可以对这些异常进行处理,或者使用 Rethrow 活动重新引发异常。 Finally 节中的活动在 Try 节或 Catches 节完成时执行。 捕获异常后进行记录并保证程序可以继续正常使用。异常处理四要素一个表示异常详细信息的类类型一个向调用者引发异常类实例的成员调用者的一段调用异常成员的代码块调用者的一段处理将要发生异常的代码块异常类类型基类:System.Exception系统级异常:System.SystemException应用程序级异常:System.ApplicationException关键字trycat. 阅读全文
posted @ 2013-06-14 08:29 M守护神 阅读(737) 评论(0) 推荐(0) 编辑
摘要:basebase 关键字用于从派生类中访问基类的成员常用用途调用基类上已被其他方法重写的方法。指定创建派生类实例时应调用的基类构造函数。备注基类访问只能在构造函数、实例方法或实例属性访问器中进行。从静态方法中使用 base 关键字是错误的。thisthis 关键字引用类的当前实例。常用用途限定被相似的名称隐藏的成员将对象作为参数传递到其他方法声明索引器备注由于静态成员函数存在于类一级,并且不是对象的一部分,因此没有 this 指针。在静态方法中引用 this 是错误的。 阅读全文
posted @ 2013-06-13 10:36 M守护神 阅读(967) 评论(0) 推荐(0) 编辑
摘要:引用命名空间 usingSystem;为命名空间或类型创建别名 usingaClass=NameSpace1.MyClass;using语句定义一个范围,在范围结束时处理对象。不过该对象必须实现了IDisposable接口。其功能和try ,catch,Finally完全相同。 using(SqlConnectioncn=newSqlConnection(SqlConnectionString)){......} 阅读全文
posted @ 2013-06-13 10:34 M守护神 阅读(729) 评论(0) 推荐(0) 编辑
摘要:分支语句三元运算符(……)?b:c值可能为空时的取值方式(s == null) ? "" :s;if else语句if(){}else if(){}else{}switch语句switch(var){ case <value>: …… break; default: …… break;}迭代语句do/while循环do{……}while(<test>);while循环while(<test>){……}for循环for(<初始化>;<条件>;<操作>){……}foreach,in循环foreach(< 阅读全文
posted @ 2013-06-13 08:40 M守护神 阅读(1210) 评论(0) 推荐(0) 编辑
摘要:C# 预处理器指令虽然编译器没有单独的预处理器,但在处理该节中描述的指令时如同存在一个单独的预处理器;这些指令用于辅助条件编译。 与 C 和 C++ 指令不同,不能使用这些指令创建宏。预处理器指令必须是行上的唯一指令。#if如果 C# 编译器遇到最后面跟有 #endif 指令的 #if 指令,则仅当指定的符号已定义时,它才会编译这两个指令之间的代码。 与 C 和 C++ 不同,您不能对符号赋予数值;C# 中的 #if 语句是 Boolean,仅测试符号是否已定义。代码示例#define DEBUG#define MYTESTusing System;public class MyClass { 阅读全文
posted @ 2013-06-10 08:38 M守护神 阅读(1219) 评论(0) 推荐(0) 编辑
摘要:分部方法 分部类或结构可以包含分部方法。 类的一个部分包含方法的签名。 可以在同一部分或另一个部分中定义可选实现。 如果未提供该实现,则会在编译时移除方法以及对方法的所有调用。分部方法使类的某个部分的实施者能够定义方法(类似于事件)。 类的另一部分的实施者可以决定是否实现该方法。 如果未实现该方法,编译器将移除方法签名以及对该方法的所有调用。 调用该方法,包括调用中的任何计算结果,在运行时没有任何影响。 因此,分部类中的任何代码都可以随意地使用分部方法,即使未提供实现也是如此。 如果调用了未实现的方法,将不会导致编译时错误或运行时错误。在自定义生成的代码时,分部方法特别有用。 这些方法允许保. 阅读全文
posted @ 2013-06-09 08:28 M守护神 阅读(705) 评论(0) 推荐(0) 编辑
摘要:扩展方法 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。 通常,建议您只在不得已的情况下才实现扩展方法,并谨慎地实现。 只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。限制条件必须定义在静态类中必须使用this关键字对第一个参数进行修饰每个扩展方法只能被内存中正确的实例和其所在的静态类调用代码示例na.. 阅读全文
posted @ 2013-06-08 08:48 M守护神 阅读(1228) 评论(0) 推荐(0) 编辑
摘要:泛型方法 泛型方法是使用类型参数声明的方法。static void Swap<T>(ref T lhs, ref T rhs){ T temp; temp = lhs; lhs = rhs; rhs = temp;}类型推断相同的类型推断规则也适用于静态方法以及实例方法。编译器能够根据传入的方法参数推断类型参数;它无法仅从约束或返回值推断类型参数。因此,类型推断不适用于没有参数的方法。类型推断在编译时、编译器尝试解析任何重载方法签名之前进行。编译器向共享相同名称的所有泛型方法应用类型推断逻辑。在重载解析步骤中,编译器仅包括类型推断取得成功的那些泛型方法。Swap(re... 阅读全文
posted @ 2013-06-07 08:50 M守护神 阅读(2273) 评论(0) 推荐(0) 编辑
摘要:迭代器迭代器是方法、get 访问器或运算符,它使您能够在类或结构中支持 foreach 迭代,而不必实现整个 IEnumerable 接口。您只需提供一个迭代器,即可遍历类中的数据结构。当编译器检测到迭代器时,它将自动生成 IEnumerable 或 IEnumerable<T> 接口的 Current、MoveNext 和 Dispose 方法。迭代器是可以返回相同类型的值的有序序列的一段代码。迭代器可用作方法、运算符或 get 访问器的代码体。迭代器代码使用 yield return 语句依次返回每个元素。yield break 将终止迭代。可以在类中实现多个迭代器。每个迭代器 阅读全文
posted @ 2013-06-06 08:27 M守护神 阅读(916) 评论(0) 推荐(1) 编辑
摘要:索引器索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。特性索引器使得对象可按照与数组相似的方法进行索引。get 访问器返回值。set 访问器分配值。this 关键字用于定义索引器。value 关键字用于定义由 set 索引器分配的值。索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。索引器可被重载。索引器可以有多个形参,例如当访问二维数组时。代码示例class SampleCollection<T>{ private T[] arr = new T[100]; public T this[int i] { ... 阅读全文
posted @ 2013-06-05 08:23 M守护神 阅读(973) 评论(0) 推荐(0) 编辑
摘要:属性 属性又称访问器,它是这样的成员:它们提供灵活的机制来读取、编写或计算私有字段的值。可以像使用公共数据成员一样使用属性,但实际上它们是称为“访问器”的特殊方法,访问器与方法一样可以被重写,这使得数据在可被轻松访问的同时,仍能提供方法的安全性和灵活性。作用属性使类能够以一种公开的方法获取和设置值,同时隐藏实现或验证代码。它们可在允许更改前验证数据,它们可透明地公开某个类上的数据,该类的数据实际上是从其他源(例如数据库)检索到的,当数据被更改时,它们可采取行动,例如引发事件或更改其他字段的值。自动属性只指定访问修饰符、实际数据类型、属性名称和空的get/set作用域。在编译时自动生成私有返.. 阅读全文
posted @ 2013-06-03 08:39 M守护神 阅读(756) 评论(0) 推荐(0) 编辑
摘要:方法“方法”是包含一系列语句的代码块。在 C# 中,每个执行指令都是在方法的上下文中完成的。方法在类或结构中声明,声明时,声明时需要指定访问级别、返回值、方法名称以及任何方法参数。方法参数放在括号中,并用逗号隔开。空括号表示方法不需要参数。方法可以有或没有参数,也可以有或没有返回值。Main方法Main 方法是控制台应用程序或窗口应用程序的入口点。Main 方法是 .exe 程序的入口点,程序控制流在该处开始和结束。Main 在类或结构内声明,Main 必须是静态的,且不应该是公用的,但不要求封闭类或结构是静态的。Main 的返回类型有两种:void 或 int。所声明的 Main 方法可以具 阅读全文
posted @ 2013-05-31 08:51 M守护神 阅读(905) 评论(0) 推荐(0) 编辑
摘要:运算符C# 提供大量运算符,这些运算符是指定在表达式中执行哪些操作的符号。通常允许对枚举进行整型运算,例如 ==、!=、<、>、<=、>=、binary +、binary -、^、&、|、~、++、-- 和 sizeof()。此外,很多运算符可被用户重载,由此在应用到用户定义的类型时更改这些运算符的含义。运算符类别运算符基本x.yf(x)a[x]x++x--newtypeofcheckedunchecked->一元+-!~++x--x(T)xTrueFalse&sizeof乘法*/%加法+-变换<<>>关系和类型检测< 阅读全文
posted @ 2013-05-30 08:53 M守护神 阅读(1352) 评论(0) 推荐(0) 编辑
摘要:匿名类型 匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。 类型名由编译器生成,并且不能在源代码级使用。 每个属性的类型由编译器推断。可通过使用 new 运算符和对象初始值创建匿名类型。限制条件没有控制匿名类型的名字匿名类型继承自Object匿名类型的字段和属性总是只读的匿名类型不支持事件、自定义方法、自定义操作符和自定义重写匿名类型是隐式封闭的匿名类型的实例创建只使用默认构造函数语法var v = new { Amount = 108, Message = "Hello" };var anonArray = new[] { 阅读全文
posted @ 2013-05-28 08:41 M守护神 阅读(1889) 评论(0) 推荐(0) 编辑
摘要:Dynamic在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查, 改为在运行时解析这些操作。 dynamic 类型简化了对 COM API(例如 Office Automation API)、动态 API(例如 IronPython 库)和 HTML 文档对象模型 (DOM) 的访问。在大多数情况下,dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。 在此过程中,类型 dynamic 的变量会编译到类型 obje 阅读全文
posted @ 2013-05-27 08:43 M守护神 阅读(3766) 评论(0) 推荐(0) 编辑
摘要:指针类型 在不安全的上下文中,类型可以是指针类型以及值类型或引用类型。指针类型不继承 object,并且指针类型与 object 之间不存在转换。此外,装箱和取消装箱不支持指针。但是,允许在不同指针类型之间以及指针类型与整型之间进行转换。当在同一个声明中声明多个指针时,* 仅与基础类型一起使用,而不是作为每个指针名称的前缀。指针不能指向引用或包含引用的结构,因为即使有指针指向对象引用,该对象引用也可能会被执行垃圾回收。GC 并不注意是否有任何类型的指针指向对象。语法type* identifier;void* identifier; int* p1, p2, p3; int number;i. 阅读全文
posted @ 2013-05-24 08:25 M守护神 阅读(1280) 评论(3) 推荐(0) 编辑