C#调用MatLab实现N阶幻方

MatLab的计算能力太强大了。最近需要通过C#来调用MatLab来进行一些计算,可是MatLab没用过。安装文件在我硬盘里躺了整整一年。  我们希望的是由外部程序调用MatLab函数。所以。希望可以完全脱离MATLAB环境,实现软件的快速开发。为此需要先介绍一下MCR。 MCR简介  MCR的全称是MATLAB Compiler Runtime,即MATLAB编译器运行时。是一个由MATLAB共享类库构成的执行引擎,他能够使MATLAB文件在没有MATLAB的机器上运行。这一点和.NET Framework相对于.NET程序一样,即为程序的运行提供了底层支持。当发布程序的时候,需要将MCR也打包进来,这样没有MATLAB的机器上也能执行,MCR随MATLAB软件一同发布,可以在MATLAB中输入命令“mcr”或者“mcrinstaller”获取其保存路径:  根据上面的运行结果,可知该文件的完整路径是: MWArray API简介  MCR包含了文件MWArray.dll,该文件中的API承担了用户程序和MCR之间数据交换的任务,因此,每一个独立文件都需要包含对该文件的引用,否则程序就不能使用MATLAB中的函数,为使用该文件,需要先使用上一步找到的安装MCR,我安装在D:\Program Files\MATLAB\MATLAB Compiler Runtime目录,然后该dll该文件在安装完MCR后位于:  另外,该文件中有两个重要的命名空间,MathWorks.MATLAB.NET.Arrays和MathWorks.MATLAB.NET.Utility,Arrays命名空间下的类提供从其他任何兼容CLS(Common Language Specification) 语言访问MATLAB中数组的功能,这些类支持数组格式化、类型的特定索引和错误处理的功能。而Utility命名空间下的类提供了对MWArray类架构和MATLAB公共运行时的托管API的通用支持。 实施 为了将MATLAB中的程序作为组件提供给其他.NET程序使用,需要做两方面的工作: 1.将M文件打包为与.NET兼容的程序集 2.在外部程序中添加对程序集的引用 MATLAB端的工作  以我这个功能为例。打开MatLab,然后File->New->Deployment Project.然后在Type里选择.net Assembly,Ok即可。我选择的工程名是test,注意,这个test就会生成一个名为test.dll的程序集,所以起个好名字,,我没起好。如图1 然后在图2的视图中定位到你选择的工程目录,并依次点击。 添加一个test.m的文件。图3 这个名称随意。但是要注意,这个名字必须和你里面将要写的那个函数名称一致,这个很好理解。好了以后,双击test.m就会打开。输入  创建一个test方法。该方法在C#调用的时候要用到,接受一个参数,然后输出一个幻方。保存关闭m文件,然后回到上图,双击test.prj也就是工程文件。 来到图4 点击Add Class,就是向test.dll的程序集中添加类。我添加了一个类叫做Func1.这个类用来在C#中创建一个对象,然后调用test(n)这个函数,然后出现Add Files,点击打开浏览框,把刚才写好的test.m选上。就可以了 最后看窗口右上角,,点击那个build图标就ok,等个几分钟,就会在目录里生成test.dll文件了。图5 VS端的代码  现在,打开vs,创建C#工程,添加两个引用,分别是MWArray.dll和test.dll,添加引用的方法就是在解决方案资源管理器中,的引用上,点击,然后添加引用->浏览->找到这两个dll,为了方便,我一般会把这两个dll复制到我的C#工程目录里,然后添加引用,如前面所说,MWArray.dll里有两个命名空间,我们使用using语句都添加上。也包括生成的test.dll  然后设计C#界面,很简单的拖一个界面,图6 然后单击事件代码:  注意程序在初始化自定义类Func1时会花费较多时间,大约持续2~3秒钟,程序如同假死一般,但第二次点击按钮反应却很快. 参考: http://www.360doc.com/content/12/0530/10/9587654_214689438.shtml

C#中的静态与非静态

为什么要分静态和非静态 在面向对象的世界里,大部分的情况都是实例特征主宰天下,类相当于一个类型模板,而对象则是类特征的拷贝,并且独立于其他对象来操作这些特征,但是在某些情况下,需要某些特征被所有的对象共公有,因此有必要实现一种基于类的特征,而不是基于实例对象的特征机制,这就是静态特征。 1.静态类和非静态类 一个类如果包含静态成员和静态方法,那么该类就可以定义为静态类,定义方法是在类定义前加上static,比如 比较: 静态类只能包含静态成员和静态方法,否则会抛出编译错误,而非静态类既可以包含非静态成员和非静态方法,还可以包含静态成员和静态方法。但不能作用于静态只读字段。 静态类不可实例化,非静态类可以实例化,不管是静态类还是非静态类,对静态成员和静态方法的调用都必须通过类来实现访问。 相对于非静态类来说,静态类有一些特点值得应用,比如System.Console这个典型的静态类。 如果一个类只包含静态成员和静态方法,就应该将该类标记为static,并提供私有的构造函数来避免用户实例创建对象,这也是MonoState模式的体现。 2.静态构造函数和实例构造函数 静态构造函数,只能用于初始化类中的静态成员,包括静态字段和静态属性,静态构造函数不能带参数,不能有访问修饰符也不能被手工调用,通过是在.net运行库第一次调用类成员之前执行。其中,实例构造函数中也是可以初始化静态成员的。 比较 静态构造函数,可以和无参的构造函数共存。虽然参数列表相同,但是二者的执行顺序不同,静态构造函数在运行库加载类时执行,而实例构造函数在实例创建时执行。 静态构造函数,只能对静态成员进行初始化操作,不能作用于非静态成员,而实例构造函数二者都可以,当然如前面所说,对静态只读字段就不可以了。 静态构造函数只被执行一次,而且.net运行库也不知道什么时候会被执行,而实例构造函数可以在多次实例创建时被执行多次。 一个类只能有一个静态构造函数,但是可以有多个实例构造函数。 一般来说,简单的静态成员可以在声明时就进行初始化,而复杂的静态成员则选择在静态构造函数中进行初始化较佳。 3.静态成员和实例成员 静态成员主要包括静态字段和静态属性,静态成员可以实现在类中能够被所有实例对象共享的数据。例如一个缴费登记系统中,消费总额作为所以消费的综合,静态成员来实现就有很好。没有不必要的数据冗余。 比较 静态成员包括静态字段和静态属性,静态字段一般实现为private,而静态属性一般为public,以体现类的封装原则。 静态成员和类关联,不依赖对象存在,只能由类访问,而不能由对象访问,实例成员和具体的对象关联,只能由对象访问,不能由类访问。 静态成员属于类所有,不论创建多少个实例对象,静态成员在内存中只有一份,实例成员属于对象实例所有,每个都有其对应的内存区域。 4.静态方法和实例方法 类似于静态成员共享数据段,静态方法共享代码段,静态方法以static标识。 比较 性能上,静态方法和实例方法差别不大,所有方法,不管是静态的还是非静态的,都是在JIT加载类时分配内存,不同的是静态方法以类名引用,而静态方法以对象引用,创建实例时,不会再为类的方法分配内存,所有的实例对象公用一个类的方法代码,因此,静态方法和实例方法的调用,区别仅在于实例方法需要当前对象指针指向该方法,而静态方法可以直接调用,性能上差异微乎其微。 静态方法只能访问静态成员和静态方法,可以间接通过创建实例对象来访问实例成员和实例方法,而实例方法可以直接全部。。 静态方法只能由类来访问,实例方法只能由对象来访问。 静态方法中不能使用this关键字,否则编译错误,而实例方法中可以引用。 静态方法不能被标记为virtual,abstract或是override,静态方法可以被派生类访问,但是不能被覆写。 Main方法是静态的,因此Main方法不能直接访问Main所在类的实例方法和成员。 鉴于线程处理的安全性,应该避免提供改变静态状态的静态方法,因为,如果多线程同时访问该段代码,可能造成线程处理错误,因此,静态状态必须是线程安全的。 静态方法适合系统中边缘性的非业务需要,例如通用的工具类。

C#中的is和as

is和as都是用作类型转换的,类型转换包括显示转换和隐式转换,在.NET中类型转换的基本规则如下: 基本规则 任何类型都可以安全的转换为其基类类型,可以由隐式转换来完成; 任何类型转换为其派生类型时,必须进行显示转换,转换的规则是:(类型名)对象名; 使用GetType可以取得任何对象的精确类型; 基本类型可以使用Covert类实现类型转换; 除了string以外的其他类型都有Parse方法,用于将字符串类型转换为对应的基本类型; 值类型和引用类型的转换机制称为装箱(boxing)和拆箱(unboxing)。 is和as操作符,是C#中用于类型转换的,提供了对类型兼容性的判断,从而使得类型转换控制在安全的范畴,提供了灵活的类型转换控制。 is的模式如下: 检查对象类型的兼容性,并返回结果,true或者false; 不会抛出异常; 如果对象为null,则返回值永远为false。 使用很简单,用于条件判断中. 举例:  as的模式如下: 检查对象类型的兼容性,并返回转换结果,如果不兼容就返回null; 不会抛出异常; 如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常。 as必须和引用类型一起使用 举例:  参考:http://www.cnblogs.com/anytao/archive/2007/04/07/must_net_01.html

各种内存卡介绍

闪存卡(Flash Card)是利用闪存(Flash Memory)技术达到存储电子信息的存储器,一般应用在数码相机,掌上电脑,MP3等小型数码产品中作为存储介质,所以样子小巧,有如一张卡片,所以称之为闪存卡。 根据不同的生产厂商和不同的应用,闪存卡大概有Compact Flash(CF卡)、MultiMediaCard(MMC卡)、Secure Digital(SD卡)、Memory Stick(记忆棒)等。 SD卡 SD卡全称为Secure Digital卡,SD卡标准的面世相对而言比CF要晚,根据MMC为基础所开发的Secure Digital(SD),其改进主要是在增添了版权保护的功能,提高了传输速度和增加了写保护机制等,其主要引脚的定义与MMC卡并没有太大的区别。SD具有较高的兼容性,较小的体积和不错的数据传输速度,成为了当今的时尚数码相机和部分可拍照手机的标准配置。SD接口是当今世界上被采用得最多的闪存卡接口,市面上主流的PDA,数码相机,MP3的闪存卡,烧录卡接口大多为SD卡,也使SD卡取代了CF卡成为了当今最常见得存储卡。如图: MiniSD MiniSD是SD卡的一大改进,体积只有21.5x20x1.4mm,比普通SD卡足足节省了60%的空间,通过转接卡还能保证MiniSD在正常的SD插槽上的使用。如图: Micro SD(TF卡) TF卡又称T-Flash卡,也叫Micro SD卡,体积只有11×15×1mm,面积为MiniSD的一半 MMC卡 MMC卡全称为Multi Media Card,由SanDisk与Siemens AG/InfineonTechnologies AG所联合开发,且于1997年11月发表,Size:24mm x 32mm x 1.4mm,重量2g。MMC卡的兼容性方面不及SD卡的好,数据传输速度受到硬件的限制,不适合作高速的数据传输。如图: RSMMC RSMMC是Reduced-Size MMC的缩写,小型化的MMC卡,传说专门为智能手机设置。改良后的产品叫做MMCmobile 什么是CF卡? CF格式由来已久,被SanDisk公司在1994年首次制造出来。CF卡的全称是Compact Flash,Compact意指“小型的,轻便的”,CF大小为43mm x 36mm x 3.3mm,50 Pins。如图 MS卡 Memory Stick,索尼推出的存储产品。貌似是独树一帜,不多介绍。 参考: http://www.allmemorycards.com/sd.htm http://baike.baidu.com/view/26952.htm http://nds.cngba.com/nds_bd/2007122122100.shtml

C#中的Class和Struct

 什么是class?  class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段、属性、方法、属性、构造函数、索引器、操作符等。.NET中,所有的类都最终继承自System.Object类,因此是一种引用类型,也就是说,new一个类的实例时,对象保存了该实例实际数据的引用地址,而对象的值保存在托管堆(managed heap)中。 什么是struct?  struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体 。所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例分配在线程的堆栈(stack)上,它本身存储了值,而不包含指向该值的指针。所以在使用struct时,我们可以将其当作int、char这样的基本类型类对待。 比较:  相同点:语法类似。  不同点: class是引用类型,继承自System.Object类;struct是值类型,继承自System.ValueType类,因此不具多态性。但是注意,System.ValueType是个引用类型。 从职能观点来看,class更多表现为行为;而struct常用于存储数据。 class支持继承,可以继承自类和接口;而struct没有继承性,struct不能从class继承,也不能作为class的基类,但struct支持接口继承 class可以声明无参构造函数,可以声明析构函数;而struct只能声明带参数构造函数,且不能声明析构函数。因此,struct没有自定义的默认无参构造函数,默认无参构造器只是简单地把所有值初始化为它们的0等价值 实例化时,class要使用new关键字;而struct可以不使用new关键字,如果不以new来实例化struct,则其所有的字段将处于未分配状态,直到所有字段完成初始化,否则引用未赋值的字段会导致编译错误。 class可以是抽象类(abstract),可以声明抽象函数;而struct不能为抽象,也不能声明抽象函数。 class可以声明protected成员、virtual成员、sealed成员和override成员;而struct不可以,struct可以重载System.Object的3个虚方法,Equals()、ToString()和GetHashTable()。 class的对象复制分为浅拷贝和深拷贝,必须经过特别的方法来完成复制;而struct创建的对象复制简单,可以直接以等号连接即可。 class实例由垃圾回收机制来保证内存的回收处理;而struct变量使用完后立即自动解除内存分配。 作为参数传递时,class变量是以按址方式传递;而struct变量是以按值方式传递的。  我们可以简单的理解,class是一个可以动的机器,有行为,有多态,有继承;而struct就是个零件箱,组合了不同结构的零件。其实,class和struct最本质的区别就在于class是引用类型,内存分配于托管堆;而struct是值类型,内存分配于线程的堆栈上。由此差异,导致了上述所有的不同点,虽然在某些方面struct有性能方面的优势,但是在面向对象编程里,基本是class横行的天下。  那么,既然class几乎可以完全替代struct来实现所有的功能,那么struct还有存在的必要吗?答案是,至少在以下情况下,鉴于性能上的考虑,我们应该考虑使用struct来代替class:  实现一个主要用于存储数据的结构时,可以考虑struct。 struct变量占有堆栈的空间,因此只适用于数据量相对小的场合。 结构数组具有更高的效率。 提供某些和非托管代码通信的兼容性。

C#中的const和readonly

 本文来自《你必须知道的.NET》这本书,是我看书过程中的笔记整理。  不变的量是程序设计中的平衡剂,是系统中恒定不变的量,在.NET中提供哦你了两种方式来实现,const和readonly。其中,const是静态常量,readonly是动态常量。 const,readonly和static readonly定义的常量,一旦初始值指定,(包括在构造函数内指定初始值),将不可更改,可读不可写。 const必须在声明的时候指定初始值,而readonly和static readonly在在声明时可以指定,也可以不指定初始值,同时也可以在构造函数中指定初始值,如果同时在声明时和构造函数中指定了初始值,以构造函数内指定的值为准。 const和static readonly定义的常量是静态的,只能由类型来访问,不能和static同时使用,否则可能出现编译错误,而readonly定义的常量是非静态的,只能由实例对象来访问。可以显式使用static定义静态成员 static readonly常量,如果在构造函数内指定初始值,那么必须是在静态无参构造函数中。不同的构造函数可以为readonly常量实现不同的初始值。 const可以用于定义局部常量和字段常量,而readonly和static readonly不能定义局部变量,只能定义字段常量,实际上,readonly应该被称之为只读字段,因此局限于定义字段,而const才是常量,可以定义字段和局部量。 const常量编译后保存在模块的元数据中,无需在托管堆中分配内存,并且const常量只能是百年机器能够识别的基元类型,比如Int32,string等,而readonly需要分配独立的存储空间,并且可以是任意类型。 const只能应用在值类型和string类型上,其他引用类型常量只能定义为null,否则以new为const引用类型常量赋值,编译器会引发“只能用null对引用类型(字符串除外)的常量进行初始化”错误提示,原因是构造函数初始化是在运行时,而非编译时,readonly只读字段,可以是任意类型,但是对于引用类型字段来说,readonly不能限制对该对象实例成员的访问控制。 总结:尽可能以只读属性来实现对类型读写特性的控制,而不是只读字段,但是在某些情况下,只读字段更简化些。  const是编译时常量,readonly是运行时常量,const较高效,readonly更灵活,在应用上,推荐以static readonly代替const,以平衡const在灵活性上的不足,同时克服编译器优化const性能时,所带来的程序集引用不一致问题。    

对不起,我等不了你了

这不是我写的,这篇文章也不是讲爱情的,来自XuTuo的方式,大学生活。人生理想。不错的文章。收藏分享之。  很多事很多人你觉得对你很重要,会在你的一生中留下不可磨灭的印记,却总在你的渐行渐远中云淡风轻。  大一的时候不写高考,因为年少轻狂中带有那么点不可一世的自尊心。大三的时候写不出高考,因为想再提起时已经变成愈加模糊与苍白,甚至还有点可笑。那时候的你已经开始忙着考研或者找工作,忙着褪去象牙塔里那张不老的脸,忙着一个人或者两个人的未来。  后来觉得有必要在这个稚嫩的末尾画上一个走向成熟的句号,在夏天还没到来的时候。  两年前你迷茫着要走上那条路,两年后你迷茫着这条路会走向哪里。  学生生涯是一个很美好的时刻,当然这种美好往往得等失去了才知道珍惜。就像记忆中的高中班主任总是苦口婆心地告诉我们,拼一拼,过了这一个月,你们就解放了。年幼的人有种向往年长人的生活的冲动,这种原始的冲动就像小时候注册QQ的时候总喜欢把年龄放大到十八岁,好像花季雨季里总会有那么些纯纯的爱恋等着我们。而直到了那个季节才发现原来小说里都是骗人的,这里除了长个不停的青春痘还有做不完的作业与考不完的试,爱情是战乱里的奢侈品,珍贵且易碎。  一群刚考完试的高考生们疯狂地撕掉课本,然后撒向天空大吼说:“我终于解放了!”接下去的几天里他们不停地聚会,不停地唱K,不停地喝酒,不停地网路短信暧昧,然后接下来是高中“革命一辈”的“生离死别”。 说着一生一世的誓言走上两条反方向的路,我喜欢那个时候忽明忽暗的爱恋,喜欢就是喜欢,不喜欢就是不喜欢,表白的那个男生可能以后会考上一所名牌大学,毕业后能当上国家公务员,家里供有着一套以及一套以上的房子让他结婚。但不喜欢就是不喜欢,因为他胖,他油性皮肤,他的校服一个礼拜都没洗,还有,他的字不好看。  接着他们如愿以偿地上了老师口中的“由你玩四年”。这是一个很不负责任的谎言,并且被我们尊重的老师屡用不止,就好像你在吃一根玉米,你啃到第三排的时候已经吃不下了,然后一个人告诉你说越往后越好吃,逼你不得不继续往下吃,然而你却逐渐感到反胃,旁边的人说一开始不习惯,慢慢地就会好了,你相信了,硬着头皮往下吃,直到吃完最后一颗时你才发现这根玉米原来压根就烂了,你吐了三天拉了三天后却忘记了自己当初吃玉米的缘由,只剩下一堆无尽的怨言。  银行卡里的生活费准时的打来,人民币上毛爷爷微笑的脸使你渐渐淡忘了家中父母的样貌,你终于有了支配财富的能力以满足你的愿望,这像是一种迟来的报复般让你有种快感,然而当这种权利到手时你却感到一种迷茫与不真实。小时候的你一直暗下决心说等长大了有钱了就要买一大堆零食,结果现在如愿了,但面对超市柜台前满满的零食,你却如何也抬不起兴趣。  生活像是一场黑色幽默的电影,越往后越是笑得想哭出来。  周围的同学渐渐都恋爱了,有几对是新结连理,有几对则是异地的革命伉俪。你开始也心动了,心猿意马地看着校道上那一双双白花花的大腿,你的下半身逐渐代替了上半身的思考能力,你只是不想一个人过了,这样的生活让你感到孤单,无趣,甚至还有那么一点的自卑。高中时你曾经喜欢过一个女生,每当她走过你们班级的窗前你的心跳都会加速得快要蹦出来,那种奇妙的感觉让你喜欢着又害怕着,她就像你心目中的女神一样。那天晚上你终于下了好大的决心发了条短信给她,“在干吗?”“没啊,你呢?”你们有一搭没一搭地聊到了深夜却都心照不宣地不捅破内心的青春情怀。暧昧总是美好的,你以前老是不懂什么叫“人生若只如初见。”现在你渐渐懂了,以后你会更懂。  大学的爱情却让你逐渐感到些许恶心与廉价,前些天你看上一个不错的女生,找了人打听到了她的电话号码,头一句便问她:“你有男朋友吗?”她说,有。之后你便不再回复了。你开始忙了起来,因为你必须马不停蹄地找到下一个猎物。什么时候你失去了等待和耐心爱一个人的能力,你说不上来,在行色匆匆中搪塞着,晚了就找不到对象了。  大学的第一个新年里几个同学在老师家聚会,大家寒暄着暖场,讲着那个陌生地域的生活,有人说得眉飞色舞,有人说得黯然神伤,但却没有人知道明天会怎样。  父母们不再会催你赶紧读书了,你终于有了足够的时间玩游戏,看电视。无论你做什么他们都会一脸慈爱地看着你,有时甚至你自己都过意不去,你觉得是不是他们还会像以前帮你报个补习班或者训练营,结果没有。他们只是老了,累了,你终于考上了他们曾经仰望着的大学,他们感到很欣慰,惟愿你一切安好。  大学却依然在继续着,高考后的第二个夏天来临时你开始有些许羡慕地看着那群刚刚高考完的准大学生们,你听他们喊着你喊过的口号,过着你过过的生活,经历着你的曾经。你喜欢他们那种充满希望的眼神里闪烁着的光,只是你的眼角边不知什么时候多了条皱纹。  你开始得打算自己要往哪个方向发展了,这一年里你旷了将近四分之一的课,每天睡了有十个小时的觉,你交了两个女友,却还不到三个月的时间,到了大一结束的时候你才勉强能念出自己专业的全名,却仍不知道这个专业到底教的是什么。父母们常在你耳边旁敲侧击地说着一些称之为“现实”事情,比如谁谁家的女儿嫁了个好人家,谁谁家的孩子考上公务员后待遇很好。你烦了,爹妈不高兴了,他们会说你已经二十岁了,你则说你的事自己会处理好,但事实上你却依旧迷茫:未来在哪里?  跨入大二前你曾暗下决心要好好学习,就如打仗前的誓师般悲壮。然而在坚持了两个礼拜后却又开始了之前的生活循环,在新的一年里的慢慢发现了身边的人慢慢变了,有的人依旧每天叫上你一起去喝酒玩乐,有的人则一早上就出去,直到晚上才回来,他抱着书,你抱着酒瓶。你们的生活从这里开始分离开来,多年之后你会后悔,但却忘了当初是谁拿起那把剪子分道扬镳。  大二的那个圣诞节里你度过了大学的第三次失恋,你听了一天的《圣诞结》并骂着甩你的女生现实,势力。然而你的舍友却在同一天表白成功了,他和你一样,没有背景,没有一个可以拼的爹,你们曾经在同一条起跑线上,然后现在却互相看不到彼此的身影。你在网上刷了一天的微博看到了那么一句话:“永远不要低估一个女生和你同甘共苦的决心。”你冷冷一笑,关了电脑,却没看到下本句写的:“一个女生最怕的,是在你身上看不到希望。”  大二上学期的春节来临时父母还为你的回来准备着大鱼大肉,貌似什么都没变,但貌似什么都变了一点,就像你的压岁钱不知怎么就少了,几个小外甥甚至还嚷着:“舅舅,给我红包!”  过了这个年你戏谑着自己走在奔三的路上,在回学校的时候父母到车站送你,你突然发现他们的脚步什么时候变慢了,你已经走了好远他们怎么都跟不上,那一刻你突然感到一种前所未有的孤独,就好像曾经可以依靠的肩膀都不在了。  这个春天你觉得怎么过得那么快,你说你已经不打游戏了,不打牌了,也不常和朋友出去玩了,你说你制定了一个计划,但为什么日子还是过得那么快,白天转眼就是黑夜。  就像又到了一年的高考时。  我等不了你了,少年。

c#温故而知新: 线程篇

上次的C#温故而知新:Stream篇 已经完结了,这次,JimmyZheng 开始更新线程了,转发收藏,持续更新,当然你也可以直接去看JimmyZheng的文章,欢迎学习交流 c#温故而知新: 线程篇(一):Thread c#温故而知新: 线程篇(二):线程池和异步线程

WPF实现不规则窗体

这几天在想C# winform程序界面实在太单一,而我C#实现不规则窗体中也说了,如果用背景这种东西来做的话,效果很差,抗锯齿能力基本为0,所以我当时在博客园提问,然后园友有了很给力的回答,比如WPF来做,或者第三方插件,或者深入底层改写ONPaint函数的,今天没事,恰好看到了一篇文章讲这个的,于是,就做一个简单的Demo出来,华丽的效果有木有,先看效果图 在win 7下使用win+Tab切换效果也很华丽。就不演示了。 做起来还算比较简单,首先使用Microsoft Expression Design 4 设计一个界面,破解版什么的太多了,,软件界面和ps挺像,不过功能弱很多,自己操作操作就好了,我说一个问题,就是我当时想画一个空心的圆,也就是一个圆环,ps里大家都知道,直接选区相减就可以了,但是这个死活没找到,基本上最后这个界面所有的地方被找了一遍,猜了猜,才发现了, 具体操作如下,首先汇出一个圆形,然后在圆里面再绘出一个圆形,这时候选中第二次的这个小圆,点击屏幕右侧的那个箭头会出现高级选项, 然后选择混合模式为橡皮擦,就会擦去这个小圆,于是就只剩下一个圆环了。 画好以后,选择文件->导出,按如下设置,  会得到一个xaml文件,一会用 然后新建wpf项目,然后在解决方案资源管理器视图右键点击项目 导入现有项,把上一步的xaml文件导入 然后需要在app.xaml文件中进行设置,具体在<Application.Resources>标签内添加如下代码,中间那个文件名看情况而定。 最终代码是: 其中background那个是固定的,而MouseDown是为了给窗体写可以拖动的函数,函数名为Window_MouseDown你也可以自己制定 然后对着那个函数名点右键,如下图 导航到事件处理程序,然后在打开的函数里写上

U盘或硬盘装满资料后,质量会增加吗?

科普文,以前看到过,今天又想起来了,所以拿来和大家分享,感谢原作者的努力。  U盘或硬盘装满资料后,质量会增加吗?  要回答这个问题,先让我们看看U盘和硬盘的存储原理。  U盘又称为闪存(Flash Memory),其存储介质为flash,简单地说,flash是用浮栅来存储数据的,浮栅就是可以存储电荷的电荷势阱,向flash写入数据的过程就是向这个电荷势阱注入电荷的过程。  至于硬盘,如今使用较多的是固态硬盘,其存储介质多为DRAM,简单来说,DRAM是用电容来存取数据的,电容可以充放电,可以储能,有电荷的时候是"1”,无电荷的时候是"0”。  回到开头的问题,通过上面的分析可以发现,U盘或硬盘装满资料前后,改变的是数字讯号记录的内容,也就是说多了许多电子。  电子的质量约为9.10938188E-31 kg,所以说,U盘或硬盘装满资料后,质量是会增加的,只不过增加的量非常的少。  同样,我们可以思考这样的问题,每比特的数据有多重?  众所周知,计算机使用一串串二进制的"1"和"0"表示所有种类的信息———电子邮件、文档、视频、网页,一切的一切。  我们拿普通电脑的存储器来说,其存储机制就是刚刚提到的DRAM,电容充电后代表"1”,没充电就代表"0”。比特"0"的数据是没有电子的,也就是没有质量的,而比特"1"的数据是有质量的,虽然轻得微不足道。  具体是多少,需要考虑存储器的电容器,估计的值是每个电容器只需要4万个电子就能充满,4万个电子的质量就是3.6E-26 kg,也就是说,比特"1"的数据质量是3.6E-26 kg。  最后,让我们计算一下全球互联网信息总重量!  要想得出这个结果,我们需要的数据是互联网上流动的信息总量,这可以从克利福德·霍利迪的著作《互联网发展2006》中找到答案:这个总流量就是……大得令人吃惊的40P字节,即4E16字节———4后面跟着16个0。  并不是所有的比特都是"1”,要不然网络的内容也太无趣了,平均大约有一半的比特是"1”,另一半是"0”,也就是有20P的比特"1”,套用我们计算的比特"1"数据重量时的公式,于是得到了总数7.2E-9 kg。  在遭罪地写了这么多字之后,我们终于得出了结论:互联网的重量全部加起来大约只有1盎司(1盎司约等于28克)的五百万分之一。  原文:http://www.cnblogs.com/jyaray/archive/2010/12/09/1901610.html