摘要:假设给我们一个泛型对象List<T>,T为int类型,要求我们使用该对象方法FindAll(Predicate<T> match)从中找出该List中的偶数,您如何实现? 说明一下:Predicate<T>是一个泛型委托,它的原型为public delegate bool Predicate<T>(T obj),该委托传入一个T类型对象,经逻辑判断后返回布尔值。委托 可能您首先想到的是用委托实现,实现方法如下: // 方法1 static void Method1(){ // 创建List<int>对象 List < int &
阅读全文
摘要:为了方便开发,.net基类库针对在实际开发中最常用的情形提供了几个预定义好的委托,这些预定义委托用得很广。Func,Action 的介绍及其用法Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能。Action<T>和Func<T,TResult>的功能是一样的,只是Action<T>没有返类型,Func<T,T,Result>:有参数,有返回类型Action,则既没有返回也没有参数,Func<T
阅读全文
摘要:我们使用delegate关键字定义一个委托数据类型时,其实是定义了一个新类,此类派生自 MulticastDelegate,而 MulticastDelegate 又派生自 Delegate.我们定义:public delegate int MathOptDelegate(int value1 , int value2);C#编译器实际上是按照以下这个 “代码模板”进行编译的:public class MathOptDelegate : System.MulticastDelegate{ public MathOptDelegate(Object target , Int32 metho...
阅读全文
摘要:CLR 有一个 垃圾收集GC 机制,可以管理内存分配和回收等工作,在绝大多数情况下,程序员只需要new 一个对象,而将销毁这一对象的工作完全交给CLR代劳。但是,我们所编写的类中使用了非托管的资源,比如文件句柄,用于线程同步的Mutex对象,或者是数据库连接,这些资源应该遵循“即需即建即销毁”的原则,这就是说:需要的时候才创建这些对象,用完之后就马上销毁。析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用dele
阅读全文
摘要:在面向对象的“封装闭合性”开发原则中,一向提倡的是把独立的功能封装在一个类里面的!但从Visual Studio 2005开发,系统提供了一个分部类的开发方式一直受到争议,很多人认为把同一类的功能分布不同的文件中,是打破了“封装闭合原则”,一个类的功能变得难以管理,大多数人都是在无奈的情况下才使用到分部类的方式。但在winFrom类、页面类、DataSet里面你经常可以发现分部类的身影,当你用到Entity Framework的时候,你会发现每个映射生成的对象都是使用分部类的方式生成的,分部类似乎早已派上用场。分部类究竟有什么好处,下面为大家一一揭露。一、分部类根据微软的定义,分部类就是“将类
阅读全文
摘要:转自:http://www.cnblogs.com/yukaizhao/archive/2010/05/24/csharp-40-dynamic-optional-argument.html1.dynamic ExpandoObject熟悉js的朋友都知道js可以这么写 :?123var t = new Object(); t.Abc = ‘something’; t.Value = 243;现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型。如下例:?12345678static void Main(string[] args) { d
阅读全文
摘要:引:在很多场合的,我们需要一个方法返回多个值,我们有多种方式来实现。1.使用全局变量2.使用out 和 ref 参数3.把多个返回值封装为 struct 或 class4.使用Tuple.net 4.0在基类库中添加了一个有趣的 Tuple类,它代表一个有序的N元组。所谓元组,其实就是“数值对”,比如以下就是一个3元组:(100,200,300)可以调用Tuple.Create静态方法或使用new 关键字直接创建一个Tuple对象。 .net 类库中定义了拥有1-7个泛型参数的泛型Tuple.使用Tuple对象作为方法返回值,可以很容易地包含多个结果。namespace DivideUseTu
阅读全文
摘要:转自:http://www.cnblogs.com/artech/archive/2011/03/17/nullabletype.html本篇文章讨论可空值类型(Nullable<T>)的转换,却确地说是如何将一种类型的值对象转换成相应的可空值。这来源于今天我们的一个成员遇到的一个小问题,我经过一些整理写了这篇文章。虽然没有什么技术含量可言,也希望对某些读者带来帮助。目录一、四种典型的值类型转换方式二、当类型转换遭遇Nullable<T>三、将基于Nullable<T>的类型转换实现在扩展方法中四、进一步完善扩展方法ConvertTo五、谈谈Nullable
阅读全文
摘要:.NET4.0 Beta2中提供了新的System.Numerics命名空间,对应于System.Numerics.dll。该命名空间下就两个类BigInteger和Complex,我们来简单了解下这两个类的用法。BigInteger:任意大小的带符号整数,可以表示任意大小的整数1.Int64, SByte, UInt16, UInt32, and UInt64这些都有一个MinValue和MaxValue属性。而BigInteger没有这两个属性,因为它没有大小限制。2.不可变的类型.3.由于他没有大小限制,理论上当它足够大的时候会出现OutOfMemoryException异常.BigIn
阅读全文
摘要:在C#里有这样一些类型,它是作为临时储存数据的,生命周期只在这个方法内,方法结束了,这个类型的生命周期也没有了。那么这里我们就可以使用一个匿名类型。varKeyPair=new{Key=”yuyi”,Value=”20”};这个KeyPair就是一个匿名类型,注意KeyPair这里是一个变量名,并不是类的名字。嗯,前面还有一个var,这又是什么呢?这是C# 3.0里面的隐式局部变量。隐式类型局部变量还是先介绍一下隐式类型局部变量吧:在C# 3.0里多了一个关键字var,他表示这样的一种类型:C#编译器可以根据上下文推断的出来比如var I = 5;编译器可以根据后面的赋值推断的出来i应该是个整
阅读全文
摘要:匿名方法相信很多人都听过,它是C#2.0的一个新特性,顾名思义,匿名方法就是没有名称的方法。那么在C#中的匿名方法有哪些好处,在C#中如何使用呢?匿名方法最明显的好处就是可以降低另写一个方法的工作量,另外一个好处就是可以访问调用者的变量,降低传参数的复杂度,下面就通过一些使用例子来具体看看。1、在事件中使用匿名方法下面是一个定时器的小例子,我们常规的写法如下:常规写法Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->classEventTest
阅读全文
摘要:using System;class TestApp{ // Define a new class called 'System' to cause problems. public class System { } // Define a constant called 'Console' to cause more problems. const int Console = 7; const int number = 66; static void Main() { // Error Accesses TestApp.Console //Console.Wr
阅读全文
摘要:C#泛型编程转自:http://www.cnblogs.com/thcjp/archive/2006/08/27/487550.htmlhttp://www.cnblogs.com/kid-li/archive/2006/11/29/577045.html 泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。例子代码:class Program { static voidMain(string[] args) { int obj = 2; Test<int> test = new Test<int>(obj);
阅读全文
摘要:Dictionary<string,int> things = new Dictionary<string,int>();things.Add(........);things.Add(........);第一种方式:可以使用Keys和values属性迭代集合中的键和值:foreach(string key in things.Keys){// ......}或foreach(int value in things.Values){//....}第二种方式:还可以迭代集合中的各个项,把每个项作为一个 KeyValuePair<K,V>实例来获取。foreac
阅读全文
摘要:转自http://www.cnblogs.com/guowenhui/archive/2011/10/25/2223275.html所谓泛型,即通过参数化类型实现在同一份代码上操作多种类型的数据,泛型编程是一种范式的转化(在这里体现为类型的晚绑定),他利用参数化类型,将类型抽象化,从而实现代码的灵活复用,精简代码。注:1.NET参数化类型不是编译(JIT编译)时被实例化,而是运行时被实例化。 2.由微软在产品文档中提出建议,所有的泛型参数名称都以T开头,这是作为一种编码的通用规范。在定义泛型时,可以对客户端代码在实例化类时用于类型参数的类型施加一些限制,如果客户端代码尝试使用某个约束所不允..
阅读全文
摘要:一。大家非常熟悉的在switch语句中,如果没有任何 case 表达式与开关值匹配,则控制传递给跟在可选 default 标签后的语句。如果没有 default 标签,则控制传递到 switch 以外二。用于泛型定义中在泛型类和泛型方法中,在预先未知以下情况时,如何将默认值分配给参数化类型 T: T 是引用类型还是值类型,如果 T 为值类型,则它是数值还是结构。下面详细说明一下。之所以会用到default关键字,是因为需要在不知道类型参数为值类型还是引用类型的情况下,为对象实例赋初值。考虑以下代码:class TestDefault<T> { public T foo() { T
阅读全文
摘要:?运算符可以使值类型为null 例如: int ?x = null;??运算符 (允许给可能等于null的表达式提供另一个值)例如:int y = x ?? 1;结果 y为 1,即当x为null时 返回 1即运算符右侧数据,反之返回运算符左侧数据(如果第一个操作数不是null,该运算符就等于第一个操作数,否则该运算符就等于第二个操作数) 说明:有时让值类型为null是很有用的(尤其是处理数据库时),泛型使用 System.Nullable<T>类型提供了使值类型为空的一种方式。例如:system.Nullable<int> nullableInt;int? nullab
阅读全文
摘要:IEnumerable 接口负责使用foreach循环。下面说明在foreach中,迭代集合collectionObject的过程如下:1.调用collectionObject.GetEnumerator(),返回一个 IEnumerator引用。这个方法可以通过IEnumerable接口的实现代码来获得,但这是可选的。2.调用所返回的IEnumerator接口的MoveNext()方法。3.如果MoveNext()方法返回true,就使用IEnumerator接口的 Current属性获取对象的一个引用,用于foreach循环.4.重复前面两步,直到MoveNext()方法返回false为止
阅读全文
摘要:索引符是一种特殊类型的属性,可以把她添加到一个类的定义中,一提供类似于数组的访问。在Card对象的Cards集合中添加索引符:public class Cards:CollectionBase{.....public Card this[int cardIndex]{get{ return (Card)List[cardIndex]; }set{ List[cardIndex]=value; }}}在访问索引符时,将使用对象名,后跟放在方括号中的索引参数(例如 Cards[0])。这段代码对List属性使用一个索引符.IList.List属性返回的是一个System.Object对象;简单的理
阅读全文
摘要:今天看了一下C#中接口的东西,发现对CollectionBase(为强类型集合提供抽象基类)中的具体实现原理不是很了解。经过查看一些资料,分析过后得到以下的初步认识。system.Collections.CollectionBase类主要显示的实现ICollection和IList接口和IEnumerable接口。但只提供了一些要求的执行代码,特别是IList的Clear()和RemoveAt()方法,以及ICollection 的 Count属性,如果要使用提供的功能,就需要自己执行其他代码。具体的显示接口实现,可以查看MSDN的相关资料。(注:ICollection主要是实现将自己的项目复
阅读全文