随笔分类 -  C#

摘要:■ Task类相关的时间点 Task类可以被用来执行多个处理。这个时候,想知道的时间点一般有两个。一个是单独一个任务结束的时刻。还有一个是全部任务结束的时刻。这两个时间点可以很容易地被确定。 Task.WaitAny方法与Task.WaitAll方法的参数是一个或多个Task对象。这两个方法的功能分别为返回单个任务结束的时刻与返回所有任务结束的时刻。使用这两个方法,可以很简单的书写代码来创建多个任务并等待它们结束的时刻。task3.cs using System;using System.Threading.Tasks;class Program{ static void Main(strin 阅读全文
posted @ 2011-06-11 16:03 董雨 阅读(292) 评论(0) 推荐(0) 编辑
摘要:PLINQ为查询的并行处理提供了可能性。要并行处理查询操作只要插入AsParallel方法就可以了。 但是问题就出现在并行本身。也就是说,如果没有很好的关于同步的设计的话,出来的数据的顺序可能是乱的,没有经过排序的。因为并行执行的时候,可以同时处理很多数据,但并不确保哪些数据是首先处理结束的。所以,象下面的例子中,如果在查询表达式中插入AsParallel方法,查询出来的结果有可能会发生改变。不经过并行处理的查询操作 using System;using System.Linq;using System.Threading.Tasks;class Program{ static void M. 阅读全文
posted @ 2011-06-11 16:03 董雨 阅读(283) 评论(0) 推荐(0) 编辑
摘要:■ Task类的基本使用方法 Task类为把线程类进行改良,使之更简便,使用起来更加容易的类。因此,虽然功能相似,但属于两个概念,使用方法也不相同。 要想利用Task类,开始任务,只要调用Task.Factory.StartNew方法就可以了。 task1.cs using System;using System.Threading.Tasks;class Program{ static void Main(string[] args) { // 子任务 var task = Task.Factory.StartNew(() => { for (int i = 0; i < 100 阅读全文
posted @ 2011-06-11 16:02 董雨 阅读(409) 评论(0) 推荐(0) 编辑
摘要:这里有一张单色(2值)的PNG的图片(1024*1024)。因为是单色,所以只有黑跟白两个值(实际上使用了只有黑跟白两色的8位PNG格式的图片文件)。到底,哪些像素是黑色的,我们编写一个程序来查点一下。同时用它来进行单任务和2~4任务分别进行查点时性能的比较。比较单任务与多任务 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;using System.Threading.Tasks;class Program{ public static IEnumerable<Co 阅读全文
posted @ 2011-06-11 16:01 董雨 阅读(217) 评论(0) 推荐(1) 编辑
摘要:迄今为止,使用多内核的多核计算机还并没有得到广泛的应用。尽管在高端领域,高端服务器的世界里,应用着很多多核计算机系统,但在广大的低端世界里,还是使用着单核或双核。但是另一方面,在笔记本电脑的世界里,也出现了多核笔记本。 “尽管多核时代还只是对未来的预测,但不再是空想了。已经一点点地逐步靠近我们这个世界了”。 当然,还有很多单核,单处理器的计算机被利用着,但这并不单纯是C#等开发语言的应用环境。今天,主CPU的内核数量的增加趋势越来越明显,所以我们已经可以预见广大用户使用多核计算机时代的即将到来,同时以此为目标,开始我们现在的程序开发了。 首先,让我们看一下现实情况,因为只使用到双核,所以对内核 阅读全文
posted @ 2011-06-11 16:00 董雨 阅读(256) 评论(0) 推荐(0) 编辑
摘要:■ 真的活用了内核吗? 对于想确定是不是真正地活用了内核的人,准备了如下的验证程序。这个程序为,把简单循环所花费的时间分两次进行计算。但是,第一次使用传统方法,第二次使用并行方法。验证程序 using System;using System.Threading.Tasks;class Program{ private const int count = 1000000000; private static void taro() { Console.WriteLine("Taro is busy now"); for (int i = 0; i < count; i+ 阅读全文
posted @ 2011-06-11 16:00 董雨 阅读(180) 评论(0) 推荐(0) 编辑
摘要:■ dynamic类型与匿名类型 匿名类型是指没有名字,也没有单独定义的类型。严格说来,该类型还是有名字的,只是在C#的源代码中我们看不到这个名字。但是,在4.0版本之前,匿名类型可以被有效利用的范围并不是很大。因为要想在一个方法之外要利用匿名类型并不是不可能的,但是要想在方法之外利用匿名类型,就一定要使用反射。 但是,dynamic类型把这个问题很容易地就给解决了。如果作为dynamic类型来返回,访问它的内容就很简单了。访问使用dynamic类型与匿名类型的对象 using System;class Program{ private static dynamic GetObject() { 阅读全文
posted @ 2011-06-11 15:59 董雨 阅读(311) 评论(0) 推荐(0) 编辑
摘要:■ dynamic类型 C#从1.0版开始,就可以即使不知道一个对象的类型,在编译时也可以动态访问这个对象的信息。只要使用反射就可以了。使用反射访问对象的成员信息 class A{ public readonly string MyName = "陆凌牛"; public static object GetObjectA() { return new A(); }}class Program{ static void Main(string[] args) { object a = A.GetObjectA(); var name = a.GetType().GetFiel 阅读全文
posted @ 2011-06-11 15:53 董雨 阅读(243) 评论(0) 推荐(0) 编辑
摘要:两个问题是:◆写程序时少了智能感知;◆运行程序时速度变慢(反射)。今天看完New features in CSharp 4.docx才恍然明白,趁着没事,把东西整理一下,希望能对暂时还不明白dynamic有什么用的朋友提供一些参考。当然,由于本人才疏学浅,不保证所有的观点都是正确的,希望大家用辩证的眼光来看这篇文章,如有错误之处,请大伙批评指正。言归正传,dynamic关键字用于声明一个动态对象,然后通过该动态对象去调用方法或读写属性。在使用C# 2.0或3.0的时候,如果一个对象需要在运行时才能确定,并且没有接口和基类方面的信息,那我们一般使用反射技术来调用这个未知对像的方法或属性,而C# 阅读全文
posted @ 2011-06-11 14:42 董雨 阅读(348) 评论(0) 推荐(0) 编辑
摘要:<!--[endif]--> .NET 4.0引入了一个新概念,叫动态绑定。所谓绑定,就是对类型、成员和操作的解析过程。动态绑定意味着与编译器无关,而与运行时有关。 <!--[endif]--> 一、 基本概念<!--[endif]-->C# 4.0之前的变量声明,在编译时已经决定其类型,虽然C# 3.0提供了var关键字来声明隐式类型,但用var声明的变量终究逃不过编译器的法眼。用dynamic声明变量的好处是,编译器在编译时并不知道它引用对象的确切类型,而要到运行时才知道。因此,我们可以通过动态绑定在运行时来操作一些类型的属性、方法等(如与IronPyt 阅读全文
posted @ 2011-06-11 14:40 董雨 阅读(369) 评论(0) 推荐(0) 编辑
摘要:【C#4.0】中的dynamic与var的区别注意:var与dynamic这两个关键字,只是看起来很相 似,仅此而已!var表示“变量的类型是在编译时决定的”,但是dynamic表 示“变量的类型是在运行时决定的”。因此,dynamic与var具有截然不同的含义。var让 你在初始化变量时少输入一些字,编译器会根据右值来推断出变量的类型。dynamic更厉害,它告诉编译器,根本就别理究竟是啥类型,运行 时再推断不迟。var只能用于局部变量的定义,你不能把类的属性定义成 var,也不能把方法的返回值类型或者是参 数类型定义成var。dynamic就没有这些局限了。dynamic类型并没有跳过类型 阅读全文
posted @ 2011-06-11 14:39 董雨 阅读(363) 评论(0) 推荐(0) 编辑
摘要:在C#2.0中引入了匿名方法,允许在期望出现委托的时候以“内联”的代码替代之。尽管匿名方法提供了函数式编程语言中的很多表达能力,但匿名方法的语法实在是太罗嗦了,并且很不自然。Lambda表达式为书写匿名方法提供了一种更加简单、更加函数化的语法。实际上Lambda表达式的本质是匿名方法,也即是当编译我们的程序代码时,编译器会自动帮我们将Lambda表达式转换为匿名方法。20.5.1创建Lambda表达式Lambda表达式的书写方式是一个参数列表后跟“=>”记号,然后跟一个表达式或一个语句块,即Lambda表达式的语法格式为:参数列=>语句或语句块Lambda表达式例子如下所示:del 阅读全文
posted @ 2011-06-10 16:04 董雨 阅读(190) 评论(0) 推荐(0) 编辑
摘要:C# 3.0新功能• 隐式类型的本地变量和数组• 对象初始值设定项• 集合初始值设定项• 自动实现的属性• 匿名类型• 扩展方法• 分部方法定义• Lambda 表达式隐式类型的数组var a = new[] { 1, 10, 100, 1000 }; // int[]var b= new[] { "hello", null, " world" }; string[] 型的数组使用方括号var c = new[]{new[]{1,2,3,4},new[]{5,6,7,8}};var d = new[]{new[]{"Luca", &q 阅读全文
posted @ 2011-06-10 16:04 董雨 阅读(193) 评论(0) 推荐(0) 编辑
摘要:20.1隐式类型在C#3.0中增加了一个变量声明var,这个声明和JavaScript的var类似,但也有不同。相同之处是它可以用var来声明任何类型的局部变量;而不同之处在于它仅仅负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,而且只能是局部变量。20.1.1隐式类型局部变量的声明与使用在C# 3.0中,引进了一个新的关键字叫做var。var允许你声明一个新变量,它的类型是从用来初始化器变量的表达式里隐式的推断出来的,即在声明时,你不需要给它定义类型,它会根据它的初始化器表达式来推断出它的类型。因此,我们称它为隐式类型。如你可以这样来声明变量:vari = 10;//声明一个局部 阅读全文
posted @ 2011-06-10 16:03 董雨 阅读(177) 评论(0) 推荐(0) 编辑
摘要:上面我们向读者讲解了隐式类型,接下来我们继续来讨论C#3.0另一个新特性:匿名类型。20.2.1引入匿名类型在很多情况下,我们需要一种能够临时将一批具有一定关联的数据存放起来的对象;或者在某些情况下,我们对仅一个对象的“形状”(如属性的名字和类型等)比较感兴趣。例如Book类,当它和其他商品放在一起进行查询时,我们可能仅对其名称和价格感兴趣,并且希望将这两种属性放在另外一个单独的临时对象中以备今后使用。这时,我们关注的仅仅是这个临时对象具有Name和Price的属性感兴趣,至于它究竟是什么类型就无关紧要了。然而,为了使这样一个对象得以存在,我们不得不为这个无关紧要的类型写上一大堆“样本代码”, 阅读全文
posted @ 2011-06-10 16:02 董雨 阅读(190) 评论(0) 推荐(0) 编辑
摘要:http://kenchell.blog.163.com/blog/static/26088309200971611491146/当我们需要对已有类的功能进行扩展时,我们通常会想到继承,继承已有类,然后为其加入新的行为。而C# 3.0中加入的扩展方法(Extension Methods)特性,则提供了另一种实现功能扩展的方式。扩展方法是一种特殊的静态方法,它定义在一个静态类中,但可以在其他类的对象上像调用实例方法那样进行调用。因此,通过扩展方法,我们就可以在不修改一个类型的前提下对一个类型进行功能上的扩充,这种方法并不会产生新的类型,而是采用向已有类中加入新方法的方式来完成功能扩展;同时,也可 阅读全文
posted @ 2011-06-10 15:46 董雨 阅读(201) 评论(0) 推荐(0) 编辑
摘要:http://kenchell.blog.163.com/blog/static/260883092009716114946383/在C#3.0中,一个对象创建表达式可以包含一个对象或集合初始化器,用于初始化新创建的对象的成员或新创建的集合的元素。对象创建表达式:newtype(argument-list(可选))对象或集合初试化器(可选)newtype对象或集合初试化器一个对象创建表达式可以省略构造器参数列表,并将其连同圆括号一起替换为一个对象或集合初始化器。省略构造器参数列表并将其连同圆括号一起替换为一个对象或集合初始化器等价于指定一个空的参数列表。在执行一个带有对象或集合初始化器的对象创 阅读全文
posted @ 2011-06-10 15:45 董雨 阅读(211) 评论(0) 推荐(0) 编辑
摘要:今天来的时候打开了MSDN扫了一眼C#里的枚举类型~~ 蓦然发现这东西还有些新玩法。http://msdn.microsoft.com/zh-cn/library/sbbt4032.aspx#Y791首先是简单介绍,……在此略过。因为enum用法很简单么~定义一个简单的枚举类型: enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; //这时候 Days.Sat = 0 ,后面依此递增。当然也可以手动指定起始值: enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; //这样就从1开始了。 枚举型的隐含类型为 阅读全文
posted @ 2011-05-22 20:26 董雨 阅读(387) 评论(0) 推荐(0) 编辑
摘要:在C#中实现类似位域的操作http://www.cnblogs.com/TianFang/archive/2011/01/23/1942446.html这篇文章和前面的那篇在C#中实现BigEndian的数字一样,都是在解析网络协议和文件时遇到的。有时协议会规定把一个byte的数字分成几个部分,某一部分表示一个数字。这种情况下在C中可以用位域很简单的实现,但是,在C#中就没那么容易了。这里是我写的一个类,专门用来辅助实现这种操作。 /// <summary> ///这个类主要用于那种将一个字节分成若干部分,每个部分表示一个数的类型 /// </summary> clas 阅读全文
posted @ 2011-05-20 00:09 董雨 阅读(523) 评论(0) 推荐(0) 编辑
摘要:http://blog.csdn.net/zhouzhangkui/archive/2010/05/30/5635398.aspxview plaincopy to clipboardprint?C#与C++之间类型的对应 Windows Data Type .NET Data Type BOOL, BOOLEAN Boolean or Int32 BSTR String BYTE Byte CHAR Char DOUBLE Double DWORD Int32 or UInt32 FLOAT Single HANDLE (and all other handle types, such as 阅读全文
posted @ 2011-05-10 23:49 董雨 阅读(490) 评论(0) 推荐(0) 编辑