摘要:
摘 要说到序列化,大家都非常熟悉XML序列化,还有二进制序列化,经过序列化的数据流更方便传输和存储。其实我们可以对序列化进行更多的控制,比如对序列化(和反序列化)前后的数据操作、定义自己的可序列化类型等。这一章我们来讨论一下有关于序列化和反序列化。第一节 序列化1、 序列化序列化包括正向序列化和反向序列化,一般我们将正向序列化说成是序列化。序列化(Serialization)是将一个类对象转化成一个字节流。反序列化(Deserialization)是将一个字节流转化成一个对应的类对象的过程。在WCF通信中,当向服务端发送请求的时候,WCF是先把本地的内存对象序列化成XML或Binary通过信道 阅读全文
文章分类 - C#
C#基础知识梳理系列十二:终结操作及资源清理
2012-08-31 13:34 by focusdada, 159 阅读, 收藏,
摘要:
摘 要经过上一章的讨论,我们知道,CLR会在必要的时候启动垃圾回收器对不再使用的对象所占的内存进行回收,其实,在一个对象被回收前我们还可以通过析构函数来实现终结操作释放资源,了解终结操作后,我们还可以使用Dispose模式进行手工强制清理资源。这一章我们将讨论这些相关话题。第一节 析构函数和Finalize方法C#与C++有着类似的析构函数,都是对资源进行清理,但是,在C++中,开发人员明确知道析构函数会被调用,而C#中,开发人员不太明确析构函数会在什么时候被调用,它是由CLR管理的,通常是在一个对象被标记为垃圾对象,如果有析构函数,CLR的垃圾回收器会先调用析构函数,然后再回收其内存。类型S 阅读全文
C#基础知识梳理系列十三:线程之美
2012-08-31 13:34 by focusdada, 173 阅读, 收藏,
摘要:
摘 要线程,一般认为只有在“复杂场景”中才会使用,有人对它望而生畏,因为它难以管理和控制,而又总有人对它摩拳擦掌,因为它提高了程序的响应速度。这一章我们来讨论Windows对线程的支持、CPU调度、线程开销、线程池、多线程数据同步等,并且再介绍一点关于异步编程的东西。第一节 Windwos线程及CPU调度在我们学习操作系统的时候已经知道:Windows 是一个多线程但并非实时的操作系统。Windows是在一个进程中运行应用程序的每个实例,基于Windows内核可以运行多个进程实例,Windows为每个进程分配了一个独立的虚拟地址空间以保证一个进程无法访问另一个进程的数据,如此一来,不但提高了各 阅读全文
C#基础知识梳理系列十一:垃圾回收机制
2012-08-31 13:33 by focusdada, 177 阅读, 收藏,
摘要:
摘 要基于.NET平台的开发语言中,最让开发人员爽的一点就是垃圾回收处理机制,在编码过程中,终于可以解放你的双手来关注更重要的事情。很多的资料中在讲到.NET中的垃圾回收机制时都说“CLR在合适的时候进行垃圾回收”,但什么时候才是“合适的时候”?内存又是如何分配的?CLR是如何对内存进行回收的?这一章我们来讨论有关垃圾回收的相关内容。第一节 垃圾回收机制早期的C/C++开发中,一个对象的生命周期大概像这样:计算对象大小——查找可用内存——初始化对象——使用对象——摧毁对象。如果在上面的过程中,开发人员忘记了“摧毁对象”这一步骤,则很有可能导致内存泄露!这是一个非常可怕的事情!幸好,CLR的开发 阅读全文
C#基础知识梳理系列九:StringBuilder
2012-08-31 13:32 by focusdada, 245 阅读, 收藏,
摘要:
摘 要几乎所有的资料都告诉我们,在频繁进行字符串拼接操作的时候推荐使用StringBuilder,因为它提供更优秀的性能,不辞劳苦的我们也写示例验证过,确实如传说的那样!但为什么StringBuilder 在操作字符串会有优异的表示呢?它真是像很多资料中所说“每次新追加进来字符串和旧有字符串总长度超设定容量时,会新键一个数组存放串字符,并且丢弃原有旧数组”吗?这一节我们来看个究竟。第一节 StringBuilder在前面的章节中我们已经知道,字符串是由字符组成,由于字符串具有不可变性,所以每一次对字符串的变动都会重新分配内存、创建一个字符串对象、丢弃旧对象,在重新分配内存过程可能会导致垃圾回收 阅读全文
C#基础知识梳理系列十:异常处理 System.Exception
2012-08-31 13:32 by focusdada, 651 阅读, 收藏,
摘要:
摘 要人非圣贤,孰能无过。代码是人写的,当然也不可能不出错,我们只能期望代码更健壮,不可能追求完美,能做更多的就是如何从错误中恢复或寻找替代方案。CLR提供了异常处理机制,它不仅能让代码在出错的时候更优雅地让人们去解决异常,也能在必要的时候抛出异常。那么,如何更规范的定义和使用异常消息呢?抛出异常会不会影响性能呢?第一节 CLR中的异常在早期的Win32 API设计中是通过返回true/false来表示一个过程(方法、函数)是否执行成功,在COM中是使用HRESULT来表示一个过程是否正确执行,然而这种处理异常的方式使开发人员对哪里出错,为什么出错,出什么样的错这些问题很难找到明确的答案,再一 阅读全文
C#基础知识梳理系列八:定制特性Attribute
2012-08-31 13:31 by focusdada, 158 阅读, 收藏,
摘要:
摘 要设计类型的时候可以使用各种成员来描述该类型的信息,但有时候我们可能不太愿意将一些附加信息放到类的内部,因为这样,可能会给类型本身的信息描述带来麻烦或误解。我们想为类型、属性、方法及返回值附加额外的信息,这些附加信息可以更明确的表达类及其对象成员的状态,怎么办?定制特性Attribute可以做到。为了避免Attribute与Property翻译性误解,我们以下的讨论中将以特性表示Attribute。细心的读者可能会发现如下类似定义://项目的AssemblyInfo.cs文件内有:[assembly: Guid("df510f85-e549-4999-864d-bb8925456 阅读全文
C#基础知识梳理系列七:字符串
2012-08-31 13:31 by focusdada, 153 阅读, 收藏,
摘要:
摘 要字符串是保存文本的System.String类型对象。它跟值类型(如:Int32、Int64等)有着相似的使用方法及表达目的,但它并不是值类型。由于在编程中会大量使用字符串,所以CLR为了提高性能及开发方便,对它进行了特殊处理。这一章,我们来介绍一下字符串的驻留机制、字符串池及字符串的比较等特性。注意,本系列所有测试代码均运行于.NET 4.0。第一节 字符串的定义(System.String)字符串被定义为System.String类型的对象,既然它是引用类型,那么一个未初始化的对象声明将保留为null,并且它的内存只能在堆上分配。它在内部维护的是字符Char的集合,所以它有一个属性L 阅读全文
C#基础知识梳理系列六:抽象类与接口
2012-08-31 13:30 by focusdada, 153 阅读, 收藏,
摘要:
摘 要抽象类,是一种特殊的类,可以定义具有实现的方法,也可以定义未实现的方法契约,本身不能被实例化,只能在派生类中进行实例化。接口,对一组方法签名进行统一的命名,只能定义未实现的方法契约,本身也不能被实例化,只能在实现类中进行实例化。二者都可以有部分数据成员(如:属性),它们貌似有着相同的“契约”功能,但对各自的派生类(实现类)又有着不同的要求,那么,到底它们有何异同呢?这一章将从四个方面来讲解它们的相同与不同之处。第一节 定义抽象类 不能实例化。抽象类的用途是提供多个派生类可共享的基类的公共定义,是对类进行抽象,可以有实现,也可以不实现。使用关键字abstract进行定义。如下定义一个抽象类 阅读全文
C#基础知识梳理系列五:委托与事件(上)
2012-08-31 13:28 by focusdada, 133 阅读, 收藏,
摘要:
摘 要委托与事件,这是一个老生常谈的话题,很多人在讲,很多人在用,但似乎它是一个永远也说不完道不尽的东西。那么,到底什么是委托?什么是事件?委托链又是怎么回事?为什么使用事件时常常用到+=/-=?委托又是如何支持协变和逆变的呢?你喜欢使用Action和Func<T,TResult>吗?由于内容比较多,这一章将分上、下两部分慢慢为你讲解。第一节 委托回调函数是Windows编程语言中一种常见而有用的编程实践,在C/C++中,它指的是函数调用的指针,通过这个指针可以方便地对函数进行调用,当然这个指针也是可以被传递给别的函数使用。在.NET Framework中,回调是通过委托来实现的, 阅读全文
C#基础知识梳理系列五:委托与事件(下)
2012-08-31 13:28 by focusdada, 113 阅读, 收藏,
摘要:
摘 要2012年7月21日,北京因暴雨灾害导致劳命伤财。这个事情过去后,“自然灾害预警”系统又一次被人们提起,它就是将自然现象前交发送通知给人们,这个过程能很好地解释C#语言中的事件。在上一节《C#基础知识梳理系列五:委托与事件(上)》我们主要讨论了与委托相关的知识,包括委托的内部实现、委托链等。那么事件与委托是什么关系呢?事件又是如何工作的呢?这些将是这节主要讨论的内容。第二节 事件气象局可以利用移动通信平台向人们的手机以短信的方式发送天气情况,只要你的手机在开机状态,在它向周围寻找基站并注册的这个过程就是订阅者对发布者发布的事件的订阅过程,正常情况下,只要你的号码不欠费,基站就允许你注册成 阅读全文
C#基础知识梳理系列四:C#类成员:方法
2012-08-31 13:27 by focusdada, 156 阅读, 收藏,
摘要:
摘 要世界上存在着男人和女人,如果没有某种东西把男人和女人连接起来构成“男女关系”,那么这些男人将立如树桩,仰天长叹,女人们将飘如小舟,荡无归处,整个世界毫无生机,自然离合。C#语言的类也是如此,有了字段和属性这些基础数据,必然要有一种东西让它们存储着某种联系且相互作用,它就是方法。这一章将介绍类中的构造器、方法以及方法参数。第一节 构造函数(构造器)构造函数也称为构造器,在创建类或结构的时候,CLR会都会调用类的构造函数,对于结构,CLR可能会隐式地调用默认构造函数。构造函数是一种特殊的函数,它不能被继承,可用public 和private修饰,但不能被virtual、new、overrid 阅读全文
C#基础知识梳理系列三:C#类成员:常量、字段、属性
2012-08-31 13:26 by focusdada, 226 阅读, 收藏,
摘要:
摘 要类 就像自然界的事物一样,拥有反应其自身状态特性的一系列数据。类状态数据是由常量、字段、属性等一些基础成员组成,且有静态和实例之分。它们之间有什么区别呢?可以互相替代吗?常量与静态只读字段有什么区别呢?属性是用方法实现,那么实现它的方法可以有参数吗?本章将解释这些奥秘。第一节 常量常量是一个符号,是在编译时已经存在且在程序生命周期内不会发生改变的值,它被保存在程序集的元数据中,只能使用C#内置的数据类型(基元类型)定义,如:int、uint、long 等,当然不包括System.Object。既然是内置类型定义,它必然是在声明时同时已初始化。常量使用const定义,C#编译器总是默认为s 阅读全文
C#基础知识梳理系列二:C#的演绎大师:类型
2012-08-31 13:25 by focusdada, 154 阅读, 收藏,
摘要:
摘 要如果说C#是CLR特邀演员阵容之一,那类型class绝对是C#的演绎/演艺大师、不朽灵魂!它不仅演绎了C#的豪放,也演艺了C#的柔美。时而恢弘、时而细腻。一切类型皆System.Object。这一章将向您解释类型的生成,类型的演绎转换及类型设计的必要元素、类型成员的内存分配,当然还有装箱及拆箱操作。第一节 类型C#里,所有事物都是被按类划分,一切事物皆对象,任何对象都会对应为某一类。所有被划分出来的类都被归为一个超级“类”,即System.Object。Object被定义在命名空间System 门下,居住于程序集mscorlib.dll小区。类型Object是一个比较开放的类,成员不多, 阅读全文
C#基础知识梳理系列一:CLR及程序集部署
2012-08-31 13:19 by focusdada, 189 阅读, 收藏,
摘要:
摘 要.NET Framework 到底是什么?公共语言运行时和 .NET Framework 类库分别指的是什么东西?CLR、 CLS、 CTS、FCL等这些又是什么?为什么出现程序集的概念?它与动态链接库的区别是什么?什么是强命名程序集?如何签名及部署程序集?这一章将帮助您学习和了解其中的秘密。第一节 .NET Framework是什么?.NET Framework(.NET框架),是由微软提出并实施的一个集成在Windows中的组件。它基于虚拟机技术实现的平台无关性的软件开发平台,它以语言运行库(CLR)为平台支持多种语言开发,如C#、VB、托管C++等,以强制的类型安全为基础实施运行在 阅读全文
DataTable
2011-03-18 14:27 by focusdada, 338 阅读, 收藏,
摘要:
DataTable表示一个与内存有关的数据表,可以使用工具栏里面的控件拖放来创建和使用,也可以在编写程序过程中根据需要独立创建和使用,最常见的情况是作为DataSet的成员使用,在这种情况下就需要用在编程过程中根据需要动态创建数据表。那么在8.4节中主要讲用编码的方式来建立DataTable数据表以及对它的操作。1 代码创建DataTable数据表如上8.3节里面所讲,通过添加对象的方式直接在DataSet中创建数据表,可以通过使用Add方法将DataTable添加到DataSet中,这种是使用控件的可视化添加DataTable的操作,那么在代码中怎么来创建DataTable数据表呢?在程序中 阅读全文
C# Save Picture to Excel
2011-03-17 14:47 by focusdada, 395 阅读, 收藏,
摘要:
1 private static void SavePictureToExcel(string siteName) 2 { 3 string dirFolder = Environment.CurrentDirectory.ToString(); 4 string excelFileName = Path.Combine(dirFolder,siteName + "-" + GetMonthString(DateTime.Now.Month) + ".xlsx"); 5 object m_objOpt = System.Reflection.Missin 阅读全文
C# 异步
2011-03-17 14:46 by focusdada, 326 阅读, 收藏,
摘要:
class Invoke { #region 异步不带返回值 //声明委托 public delegate void AsyncEventHandler(); //异步方法 void Event1() { Console.WriteLine("Event1 Start!"); System.Threading.Thread.Sleep(4000); Console.WriteLine("Event1 End!"); } //同步方法 void Event2() { Console.WriteLine("Event2 Start!"); 阅读全文
c#扩展方法奇思妙用基础篇五:Dictionary<TKey, TValue> 扩展(转)
2011-01-31 16:19 by focusdada, 196 阅读, 收藏,
摘要:
DictionaryTKey, TValue 类是常用的一个基础类,但用起来有时确不是很方便。本文逐一讨论,并使用扩展方法解决。向字典中添加键和值添加键和值使用 Add 方法,但很多时候,我们是不敢轻易添加的,因为 DictionaryTKey, TValue 不允许重复,尝试添加重复的键时 Add 方法引发 ArgumentException。大多时候,我们都会写成以下的样子:其实,第二种情形可以写如下书写(请参见 http://msdn.microsoft.com/zh-cn/library/9tee9ht2.aspx):不过好多朋友都会对这种方式表示疑虑,不太确定这样会不会出问题 阅读全文
浙公网安备 33010602011771号