Fork me on GitHub

随笔分类 -  C#面向对象编程

摘要:它与this关键字一样,都是作为类的实例(因此不能调用基类的静态成员和抽象成员)简写或者替代而存在的,只不过this关键字用于替代本类的实例,base关键字用于替代基类的实例,用法很简单,其访问基类的形式如下:base.【标识符】 base[【表达式列表】] 这个类型的一看便可以大概猜测多用于基类实例的索引器操作,在我下面演示的代码中你会看到它的用法。对于 base.【标识符】的访问形式再次说明一下:对于非虚方法,这种访问仅仅是对基类实例成员的直接访问,完全等价于((base)this).【标识符】。对于虚方法,对于这种访子类重写该虚方法运用这种访问形式也是(禁用了虚方法调用的机制)对基类实. 阅读全文
posted @ 2012-03-07 20:21 Halower 阅读(509) 评论(0) 推荐(0) 编辑
摘要:密封类就是将一个类封闭起来,断其子孙的一种方式。书面点说,就是从所修饰的类派生出其他类,所以一个密封类是没有也不能继承的类,因此sealed关键字和abstract关键字不能同时使用。 密封方法则不是为了防止继承而是防止重写,而且它是为了重写基类的虚方法并提供具体的实现,同时防止其后继类(派生类)再次重写该虚方法因此在密封方法中sealed关键字总是和override关键字同时使用。这些都很简单但是代码总结起来还是不够直观,必须实际感受下: 1 using System; 2 3 namespace SealClassTest 4 { 5 public sealed class S... 阅读全文
posted @ 2012-03-07 20:21 Halower 阅读(3202) 评论(0) 推荐(0) 编辑
摘要:一.隐式转换从任何引用类型到object。从任何类A到其基类B(或着后续基类),也即A派生自B。从任何实现I接口的类A到接口I.从任何接口I1到其基接口I2(或着后续基接口)。 二.显式转换从object到任何其它引用类型。从基类B到其子类A.从任何类A到任何接口I(类A不能被密封,A不实现接口I)从任何接口I到任何类B(类B实现接口I,切不密封)从任何接口I2到任何接口I1(前提是接口I2不是I1派生的) 测试代码如下:using System;namespace ConvertClass{ interface IDatabase { void Query(); } interface IF 阅读全文
posted @ 2012-03-07 20:20 Halower 阅读(747) 评论(0) 推荐(0) 编辑
摘要:类可以看做是创建一组对象的模版,类似的接口可以看做创建一组类的模版。一个类可以实现多个接口,从而实现多重继承。接口使得服务协议与实现相分离,是组件编程的基础,是组件向外公布其功能的唯一方法。 接口的设计原则是:一旦发布一个接口就不能再更改它,但是可以通过继承扩展新的接口。接口成员的特点(以下在学习中的总结):1.接口成员都是public类型的,但是不能使用public修饰符。2.接口成员的声明不能包含new之外的其他任何修饰符。3.接口不能包含常量,字段,运算符,静态成员(这些与抽象方法不同),实例构造函数,析构函数或类型。4.接口修饰符只允许使用new,public,protected,i. 阅读全文
posted @ 2012-03-07 20:20 Halower 阅读(600) 评论(0) 推荐(0) 编辑
摘要:as 运算符类似于强制转换操作。但是,如果无法进行转换,则 as 返回 null 而非引发异常。as 运算符只执行引用转换和装箱转换。as 运算符无法执行其他转换,如用户定义的转换,这类转换应使用强制转换表达式来执行。expression as type等效于(但只计算一次 expression)expression is type ? (type)expression : (type)nullas 运算符用于在兼容的引用类型之间执行转换。例如:// cs_keyword_as.cs// The as operator.using System;class Class1{}class Clas 阅读全文
posted @ 2012-03-07 20:19 Halower 阅读(649) 评论(0) 推荐(0) 编辑
摘要:异常类型的类别基类 Exception 下存在两类异常:从 SystemException派生的预定义公共语言运行库异常类。从 ApplicationException派生的用户定义的应用程序异常类。Exception 包含很多属性,可以帮助标识异常的代码位置、类型、帮助文件和原因:StackTrace、InnerException、Message、HelpLink、HResult、Source、TargetSite 和 Data。 以下我开始对这几个属性开始测试代码演示如下: Code 1 using System; 2 3 namespace Uer_Test 4 { 5 cl... 阅读全文
posted @ 2012-03-07 20:19 Halower 阅读(1818) 评论(0) 推荐(0) 编辑
摘要:1.拆分字符串 1.1 以下例举一个拆分句子的demo:using System;using System.Text.RegularExpressions;namespace RegexSplit{class Program{ public static void Main(string[] args) { Console.WriteLine("请输入要分拆的字符串,并按Enter键确认。"); string input=Console.ReadLine(); string pattern=@"\.|,|:|;|。|,|:|;"; string[] rs 阅读全文
posted @ 2012-03-07 20:18 Halower 阅读(451) 评论(0) 推荐(1) 编辑
摘要:这两天太懒了昨晚又通宵玩了一夜游戏今天补睡了一天,所以进度慢了点,不过也没啥,每天进步一点点就行了,哈哈。我在前面介绍了数组,有些网友问我咋把数组放到集合里讨论,其实数组就是我们最常用的一种集合,所有的数组都是从System.Array类继承下来的,今天其实主要的内容是集合构造的效率问题,也就是我今天的主题----扩容。今天只以ArrayList为例,但是它适用与所有的集合(当然包括数组)。书面一点说就是System.Collections命名空间中的所有集合在到达当前的容量时都会自动扩容,内存被重新分配,元素从旧的集合复制到新的集合,这虽然减小了所需代码,但是集合的性能会有所降低,避免这种. 阅读全文
posted @ 2012-03-07 20:17 Halower 阅读(353) 评论(0) 推荐(0) 编辑
摘要:这几日太忙了,复习专业课,忙了几日其实也没认真看书,呵呵,下面再说一下事件,这个便是只要你真正理解了这个也就是委托的一种特例,是一种特殊的委托类型(也可以看作一个字段但是依旧返回的是委托类型,为什么呢,因为即便是stringstr ,str依旧是一个string类型 的参数),这个只要自己理解就不难了,问人根本解决不了问题和疑惑,昨日开始看时问了几个开发了几年的程序员一个问题,他们也是回答摸棱两可,最后没办法还是自己搞定了。由于马上要上课去了,我只能在中午画了一个思维图和写的一个Demo给大家看一下我的思路,如有不同见解可以留言以便讨论。示例如下:using System;namespac.. 阅读全文
posted @ 2012-03-07 20:17 Halower 阅读(1267) 评论(3) 推荐(1) 编辑
摘要:System.Text.RegularExpressions 命名空间提供正则表达式功能,主要包括7个类。他们的关系如右图,对于他们的功能很多书和网上资料写的很复杂,其实理一理还是很简单的。我分了四部分来定义:定义正则表达式:Regex类返回匹配结果:MatchCollection类 和 Match类返回捕获组的结果:GropCollection类 和 Group类返回执行捕获的结果结果:CaptureCollection类 和 Captrue类 同时后三个相对的都是集合与子集的关系了。Regex类的方法和属性都很简单,主要是对构造函数的运用不同,也不容易混淆,就不多言了。Match类 可以使 阅读全文
posted @ 2011-11-19 22:38 Halower 阅读(1224) 评论(0) 推荐(1) 编辑
摘要:刚刚看了一下正则表达式,感觉很基础的简单但是要是精通还是要花时间,但是是一门独立性很强的检索规则表达式的语言,所以整合可利用的资源下再研究一下。 正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求。下面记录一些常用的元字符。先把资料都贴上,有时间细细研究。正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式示例表达式匹配/^\s*$/匹配空行。/\d{2}-\d{5}/验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。/<\s*(\S+)(\s[ 阅读全文
posted @ 2011-11-17 01:30 Halower 阅读(410) 评论(0) 推荐(0) 编辑
摘要:刚刚看MSDN的一个例子无意发现的小技巧,大家一看就明白了,不过好像蛮有用的,先记下咯,以后慢慢研究。using System;namespace NewLine{ class Test { static void Main() { string s1 = "白日依山尽"; string s2 = "黄河入海流"; string s3 = "欲穷千里目"; string s4 = "更上一层楼"; Console.WriteLine("{0}{1}{0}{2}{0}{3}{0}{4}",Envi 阅读全文
posted @ 2011-11-14 23:13 Halower 阅读(287) 评论(0) 推荐(1) 编辑
摘要:C#支持两种字符串:规则字符串和逐字字符串。我先前看到@+“”这种结构处理字符串的时候,也就只是记下怎么用而已,其实这就是标准的逐字字符串,而且分隔符之间的字符逐字解释,唯一例外的就是引号。在逐字字符串中字符串不处理简单转义序列及十六进制和Unicode转义序列,而且可以跨多行。例如: static void Main(string[] args) { string s = "这个专业\"老师\"太垃圾了!"; string s1 = @"这个专业""老师""太垃圾了!"; Console.Wr 阅读全文
posted @ 2011-11-14 22:50 Halower 阅读(370) 评论(0) 推荐(0) 编辑
摘要:迭代器是一种方法、get 访问器或运算符,它通过使用 yield 关键字对数组或集合类执行自定义迭代。yield 返回语句会导致源序列中的元素在访问源序列中的下一个元素之前立即返回给调用方。尽管您以方法的形式编写迭代器,但编译器会将其转换为一个实际上是状态机的嵌套类。只要客户端代码中的 foreach 循环继续进行,此类就会跟踪迭代器的位置。 将使用 foreach 语句从客户端代码中调用迭代器。在为类或结构创建迭代器时,您不必实现整个 IEnumerator 接口。当编译器检测到迭代器时,它将自动生成 IEnumerator 或 IEnumerator<(Of <(T>)& 阅读全文
posted @ 2011-11-13 21:24 Halower 阅读(259) 评论(0) 推荐(0) 编辑
摘要:我们可以通过实现System.Collections.IEnumerableSystem.Collections.IEnumerator接口写出自己需要的集合类。下面写两种设计实现自定义Library集合类的方法: using System;using System.Collections;namespace Library{ class Library : IEnumerable//实现接口IEnumerabler { protected class Enumerator : IEnumerator//实现接口IEnumerator { private string exceptionIn. 阅读全文
posted @ 2011-11-13 18:38 Halower 阅读(415) 评论(0) 推荐(0) 编辑
摘要:Queue(队列)表示对象的先进先出集合,默认初始容量32。usingSystem;usingSystem.Collections;namespacetQueue{classTest{staticvoidMain(){Queuequeue=newQueue();queue.Enqueue("广告史");queue.Enqueue("市场调研");queue.Enqueue("传播学");Console.WriteLine("队列开始处是{0}",queue.Peek());Console.WriteLine(que 阅读全文
posted @ 2011-11-13 13:34 Halower 阅读(261) 评论(0) 推荐(0) 编辑
摘要:Hashtable将添加的元素存放在System.Collections.DictionaryEntry对象里,因此使用foreach或者IEnumerator的Current属性时,都应该将Hashtable中的元素转换为DictionaryEntry对象。可以使用键值作为索引来往问Hashtable中的元素,当检索值时,健再次被散列,并将得到的散列值作为索引来检索值在表中的位置。Add方法用来将健/值对添加到Hashtable中,即健被散列,散列值作为值插入表中的位置,用来标识存储位置,Hashtable的健不能为空但是值可以是空引用。首先演示一下Hashtable的使用:usingSys 阅读全文
posted @ 2011-11-12 22:49 Halower 阅读(242) 评论(0) 推荐(0) 编辑
摘要:网上查了下资料,发现没我想知道东西,只能自己研究一下,关于枚举的详细由于晚上还有点事,就不怎么写了下面我给大家演示一下Eum类中几种方法Enum.IsDefined,Enum.Parse,Enum.GetName,Enum.GetNames,Enum.GetValues. 先说一下System.Enum类,它是所有枚举类型的抽象基类(它是一种与枚举类型的基础类型不同的独特类型),所有的枚举类型都是从它派生的,存在所有的枚举类型和Enum类的装箱和拆箱转换。简单说一下,直接上代码了:以下代码最好自己复制运行一下,否则可能看不明白:using System;public class EnumTe. 阅读全文
posted @ 2011-11-08 21:37 Halower 阅读(2993) 评论(0) 推荐(1) 编辑
摘要:结构和类很相似,也可以包含数据成员和函数成员,但是与类不同,结构是一种值类型,(我们可以理解为一种特殊的值类型所以不存在继承的问题)为其分配数据不需要从托管堆中分配存储器。结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应对象的一个引用。下面总结一下结构和类的不同:l结构是值类型,对结构类型的变量赋值将创建所赋值的一个副本。l结构实例的默认值不是null,而是具有默认值的初始值。l在结构和类中this的意义不一样。l结构不支持继承(所以结构成员的声明可访问性不能是protected,protected internal,结构中的函数成员不能是abstract 或者virtu 阅读全文
posted @ 2011-11-07 20:43 Halower 阅读(429) 评论(0) 推荐(0) 编辑
摘要:以下是System.Nullable<T>在FCL中的定义。 Code 1 [Serializable, StructLayout(LayoutKind.Sequential)] 2 public struct Nullable<T> where T :struct 3 { 4 private Boolean hasValue= false; 5 internal T value= default(T); 6 7 public Nullable(T value) 8 { 9 this.value= value;10 this.hasValue= true;11 }12 阅读全文
posted @ 2011-11-05 17:17 Halower 阅读(439) 评论(0) 推荐(1) 编辑