随笔分类 - C#

摘要: 在C#中比较源字符串是否包含目标字符串,我们可以使用以下方法:Contains或者IndexOf,相对而言 `Contains` 方法更符合直觉,因为它直接返回了一个布尔值,但当我们的对于需要忽略大小写时只能使用 `IndexOf` 支持 `StringComparison` 参数的重载方法,但是这个方法可能不够符合语义,虽然这种情况下很多人或许会将源字符串和目标字符串都转换为大写或小写再对比,但这样未免太低效 ... 阅读全文
posted @ 2017-03-15 11:56 gyzhao 阅读(10341) 评论(0) 推荐(2) 编辑
摘要:有时候我们会有这样的需求,我们只需要序列化实体类中的一部分属性,这时候我们可以通过声明忽略掉一些我们不需要序列化的属性,有两种方式可以使用么达到这个目标... 阅读全文
posted @ 2015-05-02 21:01 gyzhao 阅读(7342) 评论(8) 推荐(9) 编辑
摘要:可变性是以一种类型安全的方式,将一个对象当做另一个对象来使用。如果不能将一个类型替换为另一个类型,那么这个类型就称之为:不变量。协变和逆变是两个相互对立的概念... 阅读全文
posted @ 2015-05-01 20:59 gyzhao 阅读(12626) 评论(6) 推荐(24) 编辑
摘要:特性(Attribute)是将额外数据关联到一个属性(以及其他构造)的一种方式,枚举是在编程中最常用的一种构造了,枚举本质上其实是一些常量值,但相对于直接使用数值,枚举为我们提供了更好的可读性。我们知道枚举的基础类型只能是值类型(byte、sbyte、short、ushort、int... 阅读全文
posted @ 2013-05-26 17:31 gyzhao 阅读(1494) 评论(1) 推荐(0) 编辑
摘要:学习C#的时候就知道使用反射可以对我们编程提供极大的便利(动态的调用类型成员、创建实例等),但是在实际的工作中直接使用反射的机会比较少,有印象的就是一次自己做的WinForms小工具的时候利用反射来动态获取窗体上的每个控件,并且为必要的控件动态添加注册事件... 阅读全文
posted @ 2013-05-25 00:55 gyzhao 阅读(1080) 评论(1) 推荐(2) 编辑
摘要:昨天面试遇到这样的一道题目:1,1,2,3,5,8,13,21...,请问第30位的值是...... 阅读全文
posted @ 2013-04-26 10:56 gyzhao 阅读(603) 评论(1) 推荐(0) 编辑
摘要:下面是C#继承的思维导图,全屏观看点击这里:C# 继承... 阅读全文
posted @ 2013-04-09 08:58 gyzhao 阅读(629) 评论(2) 推荐(0) 编辑
摘要:类时面向对象编程最基本的构造就是类或者本身,我们可以将类想象一个模板,它定义了一个零件的样子。对象就是用这些模具创建的零件。从结构化的、基于控制流的程序转向面向对象的程序,思维模式发生了根本性变化,因为面向对象编程提供了一个额外的组织层次... 阅读全文
posted @ 2013-04-08 16:41 gyzhao 阅读(2296) 评论(4) 推荐(1) 编辑
摘要:下面是C#方法和参数的思维导图,全屏观看点击这里:C# 方法和参数... 阅读全文
posted @ 2013-04-08 11:33 gyzhao 阅读(614) 评论(3) 推荐(0) 编辑
摘要:在C#语言中类型都是在基础类型(Primitive type)之上构建而成的,基础类型被视为其他所有类型的基础。C#语言的基本类型包括:8种整数类型、2种用于科学计算的二进制浮点型、1种用于金融计算的十进制浮点类型、1种布尔类型以及1种字符类型,以及object类型和字符串类型...... 阅读全文
posted @ 2013-04-07 09:31 gyzhao 阅读(1932) 评论(0) 推荐(7) 编辑
摘要:下面是C#运算符和控制流的思维导图,全屏观看点击这里:C# 运算符和控制... 阅读全文
posted @ 2013-04-03 15:32 gyzhao 阅读(829) 评论(5) 推荐(3) 编辑
摘要:C#作为一门托管语言,和C/C++这些本地语言不同;C/C++经过编译后直接变成处理器可执行的机器码,而C#编译器则会将C#转换为CIL(简称IL)代码,而不是机器码,我们知道C#是基于.NET Framework 框架的语言,CIL代码转换为可执行的代码... 阅读全文
posted @ 2013-04-03 09:31 gyzhao 阅读(2115) 评论(11) 推荐(6) 编辑
摘要:在使用Web服务、.NET远程调用或给予Azure的程序时,最耗时的就是与远程服务器之间传输过程。如果只是简单的将本地API封装一下,就变成远程使用的API,这样做功能上不会有问题,但是效率低下。API的粒度越细所花费在等待数据返回的额外事件也就越... 阅读全文
posted @ 2013-03-31 20:05 gyzhao 阅读(372) 评论(2) 推荐(0) 编辑
摘要:持久化(persistence)是类型的一个重要特性。只要我们的类型不是UI控件、窗体或者表单,都应该尽可能的为类型添加序列化支持。因为如果我们不为类添加序列化支持,而让类型的使用者来做这份工作几乎是不可能的。在.NET中支持序列化是一件非常简单的任务,在绝大多数的情况下... 阅读全文
posted @ 2013-02-28 21:22 gyzhao 阅读(342) 评论(0) 推荐(1) 编辑
摘要:如果将引用类型通过公有借口暴露给外界,那么对象的使用者即可绕过我们定义的方法和属性来更改对象的内部结构。这违反了我们通常的直觉,也会导致常见的错误。考虑到这一点,你应该修改类暴露出的接口。如果只是简单的返回内部数据,那么实际上就给外界赋予了访问内部... 阅读全文
posted @ 2013-01-19 21:07 gyzhao 阅读(631) 评论(0) 推荐(0) 编辑
摘要:.NET中的事件其实就是一个观察者模式(Observer Pattern)的一个语法上的快捷实现(更多可以参考:使用委托和事件实现观察者模式)。事件是一种内建的委托,用来为事件处... 阅读全文
posted @ 2013-01-18 23:59 gyzhao 阅读(544) 评论(0) 推荐(0) 编辑
摘要:在C#语言中,回调是通过委托来实现的。委托为我们提供了安全的回调定义,大多数委托都和事件相关,但这不是委托的全部应用场景,当类之间需要通信,并且我们希望一种比接口更加松耦合的机制时,委托便是最佳选择。委托允许我们在运行时配置目标并且通知多个客户对象... 阅读全文
posted @ 2013-01-17 23:18 gyzhao 阅读(553) 评论(2) 推荐(0) 编辑
摘要:实现和覆写虚方法的区别:接口中声明的成员默认不是虚方法。派生类不能覆写基类中实现的接口成员。接口可以被显式实现,这会使针对该类的公有成员隐藏起来。接口与虚... 阅读全文
posted @ 2013-01-16 21:25 gyzhao 阅读(509) 评论(0) 推荐(0) 编辑
摘要:接口是一种按照契约设计的方式,一个类型必须实行接口中定义的方法。抽象基类则为一组相关的类型提供了一个共有的抽象。要注意二者的使用场景和区别:基类描述了对象是什么;接口描述了对象将如何表现行为。使用抽象基类还是接口,代表了对日后可能发生的变化两种... 阅读全文
posted @ 2013-01-15 22:38 gyzhao 阅读(2426) 评论(9) 推荐(6) 编辑
摘要:在保证类型可以完成其工作的前提下,我们应该尽可能的给类型分配最小的访问级别。可见性越低那么以后升级更改时所需的变化也就越少——因为能访问你的功能的代码越少,以后可能出现的修改也就会越少。创建内部类是一种常被忽略的限制类型作用域的方法,在创建一个类时... 阅读全文
posted @ 2013-01-14 20:33 gyzhao 阅读(587) 评论(0) 推荐(0) 编辑
摘要:"常量性"指的是:对象自创建后,它的值就保持不变。如果在构造函数中就验证了参数的有效性,那么就能够保证之后该变量值始终是有效的——因为已经不能再改变... 阅读全文
posted @ 2013-01-13 20:14 gyzhao 阅读(1470) 评论(0) 推荐(3) 编辑
摘要:.NET系统的默认初始化过程会将所有的对象设置为0。我们就会难免创建出一个初始化为0值的值类型,所以我们应该将0作为类型的默认值,可以避免一些不必要的Bug... 阅读全文
posted @ 2013-01-12 17:30 gyzhao 阅读(1252) 评论(4) 推荐(0) 编辑
摘要:C#和JAVA不同,在C#中可以创建值类型,而在Java中创建的所有类型都是引用类型。在使用C#开发时,选择值类型还是引用类型对我们的程序的行为会产生很大的影响,所以我们需要对值类型和引用类型的使用场景进行了解和对二者的不同进行区分。C#之所以添加了值类型和引用... 阅读全文
posted @ 2012-12-22 10:48 gyzhao 阅读(960) 评论(1) 推荐(0) 编辑
摘要:如何为我们自己的包含非托管资源的类型编写资源管理代码呢?在 .NET 中为我们提供了一种标准的销毁非托管资源的模式,这个标准的模式能够使使用者通过调用IDisposable接口正常释放掉非托管资源,也能够保证使用者在忘记释放资源时使用终结器释放。 阅读全文
posted @ 2012-11-30 09:33 gyzhao 阅读(1652) 评论(7) 推荐(5) 编辑
摘要:我们知道:C#是一门虚拟机语言,C#编译器首先将C#代码编译成IL代码,运行程序时CLR(Common Language Runtime,公共语言运行时)通过调用JIT(just-in-time Compiler,即时编译器)来将IL代动态即时编译成可执行的机器码。GC(Garbage Collector,垃圾收集器)自动为我们的应用程序进... 阅读全文
posted @ 2012-11-27 09:03 gyzhao 阅读(1792) 评论(9) 推荐(5) 编辑
摘要:在.NET环境中,非托管系统资源由开发人员来负责释放,且非托管系统资源必须显式的使用IDisposable接口的Dispose()来释放(详见:了解.NET内存管理机制)。所有封装或使用了非托管资源的类型都实现了IDisposable接口。同时这些类也在终结器中调用Dispose(),保证了开发人员在忘记资源... 阅读全文
posted @ 2012-11-26 08:52 gyzhao 阅读(2314) 评论(8) 推荐(11) 编辑
摘要:ADO.NET 为我们提供了一些查询内存中数据表的API,利用这些API我们可以对内存中的DataTable进行类似于查询数据库查询的操作。当我们想要访问DataTable中特定的行时,可以根据这个表的一列或者多列作为搜索条件来访问这些数据行。和数据库中的表类似,每个DataTable都包括一个可选... 阅读全文
posted @ 2012-11-23 17:05 gyzhao 阅读(2511) 评论(0) 推荐(1) 编辑
摘要:一个类通常会有多个构造函数,并且随着时间的推移,成员变量的增加,功能的改变,构造函数的个数也会不断上升。很多的开发人员一般会先编写一个构造函数,然后将其代码复制粘贴到其他的构造函数当中,以支持在类接口上定义的多个重写构造函数.其实我们不应该这样做,当发现... 阅读全文
posted @ 2012-11-23 09:06 gyzhao 阅读(1746) 评论(5) 推荐(3) 编辑
摘要:我们知道在C#语言中创建一个类型的实例前,就应该初始化该类型的所有静态成员变量。C#语言为我们提供了静态初始化器和静态构造函数。其中,静态构造函数是一个特殊的构造函数,将在其他所有方法执行前以及变量或属性被第一次访问之前将自动调用静态构造函数,且仅执行一次... 阅读全文
posted @ 2012-11-15 17:17 gyzhao 阅读(3764) 评论(7) 推荐(3) 编辑
摘要:一般情况下,一个类都会有多个构造函数。随着时间的推移,成员变量、构造函数不断增加。为了处理这种情况最方便的办法就是:在声明变量的时候进行初始化,而不是在每个构造函数中进行。无论是类成员(静态变量)合适实例变量,我们都应该充分利用初始化器的语法。C#编程在,一般在... 阅读全文
posted @ 2012-11-06 21:59 gyzhao 阅读(2682) 评论(3) 推荐(4) 编辑
摘要:我们知道C#是一门虚拟机语言,在C#编译器将C#代码编译成IL代码后,运行在.NET CLR(公共语言运行时)中,运行程序是CLR通过调用JIT(即时编译器)来将IL代动态即时编译成可执行的机器码。在CLR中有一个非常重要的概念:CLR GC(Garbage Collector,垃圾收集器),GC自动为我们的应用程序进... 阅读全文
posted @ 2012-10-22 11:09 gyzhao 阅读(3637) 评论(20) 推荐(6) 编辑
摘要:TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer),TCP协议能够检测和恢复IP层提供的主机到主机的信道中可能发生的报文丢失、重复以及其他错误。由于TCP协议是一种面向连接协议... 阅读全文
posted @ 2012-10-18 09:03 gyzhao 阅读(19595) 评论(20) 推荐(25) 编辑
摘要:经过前面基础知识作为背景,现在对Socket编程进行进一步的学习。在 System.Net.Socket 命名空间提供了Socket类,利用该类我们可以直接编写Socket的客户端和服务的的程序。但是直接使用Socket类编写Socket程序会比较麻烦、而且容易出错,所以.NET为我们提供了进一步封... 阅读全文
posted @ 2012-10-15 09:24 gyzhao 阅读(18221) 评论(26) 推荐(35) 编辑
摘要:在网络通信中,很多情况下:比如说QQ聊天,通讯双方直接传递的都是字符信息。但是字符信息并不能够直接通过网络传输,这些字符集必须先转换成一个字节序列后才能够在网络中传输,于是这里就产生了编码和解码的概念。对于Unicode字符来说,编码是指将一组Unicode字符转换为... 阅读全文
posted @ 2012-10-13 11:19 gyzhao 阅读(7927) 评论(11) 推荐(19) 编辑
摘要:通过前面的笔记我们可以知道:一个客户端想要发起一次通信,先决条件就是需要知道运行着服务器端程序的主机的IP地址是多少,端口号是多少。然后我们才能够通过这个地址向服务器特定的应用程序发送信息。对于网络上的两台计算机来说,用户操作的计算机称为本地主机,与该计算机... 阅读全文
posted @ 2012-10-11 17:38 gyzhao 阅读(9332) 评论(25) 推荐(23) 编辑
摘要:计算机程序能够相互联网,相互通讯,这使一切都成为可能,这也是当今互联网存在的基础。那么程序是如何通过网络相互通信的呢?这就是我记录这系列的笔记的原因。C#语言从一开始就是为了互联网而设计的,它为实现程序的相互通信提供了许多有用API,这类应用编程接口被称为套接字... 阅读全文
posted @ 2012-10-10 19:34 gyzhao 阅读(7803) 评论(20) 推荐(35) 编辑
摘要:在应用程序开发过程中,开发者都力求写出更加高效的代码。但是当你想手工为C#编译器优化代码时,你的种种优化可能反倒会阻碍JIT进行更加高效的优化。因此,我们最好尽可能的写出最清晰的代码,将优化工作交给JIT编译器去完成。在.NET平台下开发程序的开发者都应该知道... 阅读全文
posted @ 2012-10-08 23:14 gyzhao 阅读(2014) 评论(5) 推荐(6) 编辑
摘要:C#4.0 引入了具名参数(MSDN翻译为“命名实参”,个人认为具名参数更形象,可选参数亦是)和可选参数(可选实参)。客户端代码使用具名参数意味着:方法中的参数名称也成为了公有接口的一部分。假如修改公有参数的名称将有可能破坏调用者的代码。这意味着:调用者应该尽可... 阅读全文
posted @ 2012-10-07 21:54 gyzhao 阅读(2653) 评论(2) 推荐(2) 编辑
摘要:查询语法(query syntax)可以让程序逻辑的表达由“命令式”转换为“声明式”。查询语法定义了想要的结果,而把具体实现交给其他的专门实现。使用查询语法(实现了查询表达式模式的方法语法也可以)要比传统的命令式循环结果更加清晰的表达你的意图... 阅读全文
posted @ 2012-09-01 21:19 gyzhao 阅读(2370) 评论(10) 推荐(4) 编辑
摘要:C#允许我们创建两种类型:值类型和引用类型。如果两个引用类型的变量指向的是同一个对象,它们将被认为是“引用相等”。如果两个值类型的变量类型相同且包含同样的内容,它们被认为是“值相等”。这也正是同等性判断需要如此多方法的原因... 阅读全文
posted @ 2012-09-01 14:26 gyzhao 阅读(1760) 评论(5) 推荐(1) 编辑
摘要:对文件和目录进行解压缩是一个非常常见的操作,在.NET Framework中为我们提供了:GZipStream类来对文件进行解压缩操作。此类表示 GZip 数据格式,它使用无损压缩和解压缩文件的行业标准算法。GZip 数据格式使用的算法与 DeflateStream 类的算法相同,但它可以扩展以使用其他压缩格式。 阅读全文
posted @ 2012-08-31 14:09 gyzhao 阅读(627) 评论(0) 推荐(0) 编辑
摘要:我们在对文件进行读写操作时首先需要把文件转换成文件流(FileStream)对象。Stream类及其派生类(包括FileStream类)都提供了Read和Write方法,可支持在字节级别对数据进行读写。假如我们的程序需要将字符数据写入到流中,需要先将字符数据转换为字节数据之后才能将数据写入到流中。所以.NET为我们提供了一下更方便的支持对流进行读写的类:Bina...... 阅读全文
posted @ 2012-08-30 14:17 gyzhao 阅读(1757) 评论(0) 推荐(0) 编辑
摘要:在.NET Framework中System.IO 命名空间包含允许对数据流和文件进行同步和异步读取及写入的类型。在.NET开发中的对文件进行I/O操作的类都位于该命名空间中。从.NET Framework 4.0开始,增加一系列方法来枚举目录和文件,这些方法返回一个目录和文件的字符串的可枚举集合...... 阅读全文
posted @ 2012-08-28 15:03 gyzhao 阅读(716) 评论(0) 推荐(2) 编辑
摘要:什么是装箱和拆箱 装箱是将值类型转换为引用类型或者是值类型(如:结构)实现任一接口类型的过程。当 CLR 对值类型进行装箱时,会将该值包装到 System.Object 内部,再将后者存储在托管堆上。拆箱就是将从对象中提取值类型或者接口类型到实现该接口的值类型的显式转换。装箱时隐性的,拆箱是显式的。装箱 装箱是值类型到引用类型或者这个值类型所实现的任何接口类型的隐式转换。对值类型装箱会在堆中分配一个对象实例,并将该值复制到新的对象中。 下面代码在做装箱操作:在堆栈上创建对象引用obj,而在堆上则引用int类型的值。该值是赋给变量i的值类型值的一个副本。1 int ... 阅读全文
posted @ 2012-08-23 21:34 gyzhao 阅读(4820) 评论(0) 推荐(2) 编辑
摘要:1.通过控制台调用C#编译器 通过控制台直接调用C#编译器方便我们编写片段代码时不使用Visual Studio也能够对源码进行编译。在通过使用控台命令行调用C#编译器时,我们需要预先设置好操作系统的环境变量, 在Path变量中添加:;C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319。在这里我选择的是C# 4.0的编译器。现在在E:\CSharp目录存放了两个C#的源文件,我们分别将它们编译成DLL文件和可执行程序(exe):1.1 通过命令行编译成可执行程序(csc fileName.cs)我们看到目录里面现在多了一个可执行文件:1.2 通过命令行. 阅读全文
posted @ 2012-08-23 14:06 gyzhao 阅读(4006) 评论(2) 推荐(0) 编辑
摘要:ToString()方法作为.NET环境中最常用的方法之一,我们应该为类型的所有者提供一个合理的ToString()版本,类型的字符串表示可用来在不同的环境下向用户轻松显示对象的相关信息;此外,类型的字符串表示还可以拥有调试环境。因此,我们创建的每一个类型都应该能覆写... 阅读全文
posted @ 2012-08-22 21:59 gyzhao 阅读(785) 评论(0) 推荐(2) 编辑
摘要:#if/#endif 语句常用来基于同一份源码生成不同的编译结果,其中最常见的就是debug版和release版。但是这些工具在实际应用中并不是非常友好,因为它们容易被滥用,其代码页进而难以理解或调试。C#设计中考虑到这个问题,并提供了更好的工具——Conditional特性... 阅读全文
posted @ 2012-08-21 22:25 gyzhao 阅读(1834) 评论(0) 推荐(2) 编辑
摘要:因为相对于强制类型转换来说,as更安全,也更加高效。as和is操作符都不会执行任何用户自定义的转换,它们仅当运行时类型符合目标类型时才能转换成功,也不会在转换时创建新的对象... 阅读全文
posted @ 2012-08-21 15:23 gyzhao 阅读(653) 评论(0) 推荐(1) 编辑
摘要:C#语言中有两种类型的常量:编译期常量和运行时常量。应该尽量使用运行时常量,而不是编译期常量。虽然编译期常量略快一些,但是没有运行时常量那么灵活。应仅仅在那些性能异常敏感,且常量的值在各个版本之间绝对不会变化时,才使用编译器常量... 阅读全文
posted @ 2012-08-21 12:43 gyzhao 阅读(708) 评论(0) 推荐(2) 编辑
摘要:属性允许将数据成员作为公共接口的一部分暴露出去,同时仍旧提供面向对象环境下所需要的封装。属性这个语言元素可以让你像访问数据成员一样使用,但底层依旧使用方法实现。通过使用属性我们可以创建出类似于数据访问(客户代码在访问属性时,就像是在访问共有的字段),但实际上确是方法调用的接口... 阅读全文
posted @ 2012-08-20 22:23 gyzhao 阅读(956) 评论(2) 推荐(4) 编辑
摘要:我们可以在内存中创建DataTable对象,同样也可以对它们进行进一步的各种操作,下面的示例程序中,让我们来学习如何对它们进行基本的增删改的操作。作为示例程序的第一步我们应该是先创建一个Windows Forms的项目,然后定义一个存储...... 阅读全文
posted @ 2012-08-10 21:33 gyzhao 阅读(1352) 评论(3) 推荐(1) 编辑
摘要:一般情况下都是使用代码来创建数据源连接,但是在VS中也提供了一个可选的便捷方式——"数据源连接向导",通过可视化的方式来引导用户创建数据集。下面的操作展示了如何使用这..... 阅读全文
posted @ 2012-08-05 19:54 gyzhao 阅读(6259) 评论(1) 推荐(1) 编辑
摘要:由于工作的需要经常会需要直接对十六进制的报文进行处理,有很多直接对位的操作,再此做一个记录,方便日后查阅。问题一:如何获取一个字节的后几位? 通过使用&操作符来获取,假如一个byte buf=0x16;(二进制为:00010110),当我们想获取它的后四位只需要这样:0x16&0xF(二进制为:1111)就可以取出后四位了。问题二:如何获取一个字节的前几位? 通过>>移位操作符来实现,和前面一样,我们想获取0x16的前四位(8-n)时只需要这样:0x16>>4,前三位这样取0x16>>(8-3)。.NET 位,字节相关常用类库BitConve 阅读全文
posted @ 2012-06-30 22:27 gyzhao 阅读(309) 评论(0) 推荐(0) 编辑
摘要:因为项目中需要对第三方的站点进行跨域请求,原来常用的Jquery的Ajax方法不能够实现跨域请求。在网上查找了一下资料,解决跨域请求的方式有不少,但是还需要根据自己的具体情况来做出不同的选择。在项目中我使用的是直接通过C#后台发送请求来实现跨域访问(后台消耗会增大),下面是请求的源码: 1 string URL = "www.xxx.com"; 2 public void sendPost(string urlArgs,HttpContext context) 3 { 4 //context.Request["args"] 5 System.N... 阅读全文
posted @ 2012-05-16 09:51 gyzhao 阅读(16979) 评论(0) 推荐(1) 编辑
摘要:ADO.NET 是一组向 .NET Framework 程序员公开数据访问服务的类。在 System.Data.dll 程序集中,并与 System.Xml.dll 中的 XML 类集成。ADO.NET 是在 .NET Framework 中提供最直接的数据访问方法。为ADO.NET Entity Framework和LINQ to SQL等基于数据访问的技术提供了底层的技术支撑。ADO.NET可以...... 阅读全文
posted @ 2012-03-31 16:07 gyzhao 阅读(1021) 评论(0) 推荐(2) 编辑