编程基础-msdn编程指南笔记
此博仅为笔记,摘自msdn编程指南文档,链接地址:http://msdn.microsoft.com/zh-cn/library/67ef8sbd.aspx
注释:// 单行注释 /* 多行注释*/
编码约定:命名约定:限定名称太长无法放入一行,可在点后截断;布局约定:每行仅编写一个语句,在方法定义和属性定义之间添加至少一个空白行;注释约定:将注释放在另一行,而不要放在代码行的末尾,在注释分隔符和注释文本之间插入一个空格;常用规范:处理大量文本使用 StringBuilder 对象,连接短字符串用+,
类型:c#是一种强类型语言.分为值类型,引用类型和指针类型三种,严格意义上有两种类型值类型和引用类型,它们从类型定义、实例创建、参数传递到内存分配都有所不同,其中,值类型的变量存储数据,主要包括三种:结构,枚举,自定义结构;引用类型的变量存储的实际数据的引用,包括数组、类、接口等,指针类型仅可用于unsafe模式;安全类型转换:is 和 as 运算符来测试强制转换是否会成功,而没有引发异常的风险。 通常,as 运算符更高效一些,因为如果可以成功进行强制转换,它会实际返回强制转换值。 而 is 运算符只返回一个布尔值。 因此,如果只想确定对象的类型,而无需对它进行实际强制转换,则可以使用 is 运算符。类型转换:隐式转换、显示转换、用户定义的转换、使用帮助程序类的转换。装箱:将值类型转换为Object或由此值类型实现的任一接口类型的过程。
//字符串转换为数字 string inputString = "abc"; int numValue; bool parsed = Int32.TryParse(inputString, out numValue);
内存结构:栈:存放值类型和引用类型变量(就是引用对象在托管堆上的地址) 托管堆:存储对象,所有的引用类型都分配在托管堆上,由GC来管理和释放的;单独的值类型是存放在栈上的,类的值类型字段、属性是引用类型的一部分,随引用类型存储在托管堆上
形参:在默认情况下,CLR假设所有的方法参数都是按值传递的。当参数为引用类型的对象时,参数的传递是通过传递指向对象的引用来完成的(引用本身是按值传递的),另外可以用out和ref关键字来按引用的方式来传递参数,这两个关键字告诉C#编译器要产生额外的元数据来表示指定参数是按引用的方式来传递的:编译器将使用该信息来产生传递参数地址(而不是参数本身的值)的代码。其中ref要求参数在使用之前要显式初始化,out要在方法内部初始化;
数组:可以在一个数组数据结构中存储同一类型的多个变量。通过指定其元素的类型声明数组:type[] arrayName数组初始化时必须有数组大小或数组初始值设定项,在实例的生存期中维数和每个维度的长度是不能更改的;数组可以是一维,多维,交错数组(数组的数组);注意:要更改数组的长度只能通过重新更新引用来实现,当数组为null时,不可以访问Length属性或直接数组初始化;遍历数组可以使用for或foreach;Array是所有数组类型的抽象基类型,可以使用Array具有的属性及其他类成员,用于排序、搜索和复制数组,如:Length,Rank等。数组可作为实参传递给方法形参,由于数组是引用类型,因此方法可以更改元素的值。
//一维数组初始化 int[] array1 = new int[5]; int[] array2 = new int[] { 1, 3, 5, 7, 9 }; int[] array3 = { 1, 2, 3, 4, 5, 6 }; //读取一维数组 int a1 = array1[0]; //多维数组初始化 int[,] multiDimensionalArray1 = new int[2, 3]; int[,] multiDimensionalArray2 = { { 1, 2, 3 }, { 4, 5, 6 } }; //读取多维数组;维数array3D.Rank int mul1 = multiDimensionalArray1[0, 1]; //交错数组 int[][] jaggedArray = new int[6][]; jaggedArray[0] = new int[4] { 1, 2, 3, 4 };
字符串:是 String 类型的对象,它的值是文本。除了在使用字符数组初始化字符串时以外,不要使用 new 运算符创建字符串对象。请在尝试访问字符串之前使用静态 IsNullOrEmpty(String) 方法验证字符串的值。常用方法:替换:.Replace("mountains", "peaks");定位:.IndexOf(temp);移除:.Remove(i, Length);比较:root.Equals(root2, StringComparison.Ordinal);拆分:split();字符串格式化:{索引(,对齐)[:格式说明符]} 对齐:正为右左为负 常用格式数字说明符:货币C,0#占位,千位,0; @强制识别;"p"百分号 格式号枚举:d-数字.G:字符串; 转义字符常量:\n换行,\t TAb \b退格 \r回车 ;Concat:拼接少量字符串,Compare:比较,Join
面向对象:封装:可以指定该对象的成员的可访问性,可以将无意在对象外部使用的成员隐藏起来,减小编码错误或恶意利用。继承:用于创建可重用、扩展和修改其他类中定义的行为的新类,多态:运行时多态,运行时的类型与声明的类型不再同的特性,继承中使用了override关键字。对像的标识:使用静态Equals()方法,
类:引用类型,通常用于较为复杂的行为建模,或对要在类创建后进行修改的数据建模。类使用 class 关键字进行声明,使用new 调用构造函数来创建对象。支持继承,它继承基类除构造函数以外的所有成员。类只能直接从一个基类继承,可以实现一个以上的接口,但基类自身也可能继承自另一个类,所以类可以间接继承多个基类;抽象基类:用abstract声明,禁止对象实例化,抽象成员:用abstract声明,直接继承该类的非抽象类必须重写该方法,该类本身必须为抽象类,虚成员:用virtual声明,所有派生类都可以用自己的实现重写该方法,用override 来进行声明,从而在运行时呈现多态性,除非有的类用sealed来停止虚拟继承。派生类隐藏基类成员 :使用相同的名称来隐藏,用new来声明,而不呈现多态性。从派生类访问基类成员:base。静态类:静态类不能实例化,在首次使用该类前加载该类,并初始化该类的字段并调用静态构造函数,静态构造函数仅调用一次,在程序驻留的应用程序域的生存器内,静态类一直保留在内存中,特性:只有静态成员(或常量),无法实例化,是密封的,不能包含实例构造函数。静态成员:所有实例共用一个副本,静态字段用法:1)记录实例化的个数2)存储在所有实例共享的值,静态成员在第一次访问之前并且是在调用静态构造函数之前初始化。成员对象:字段:直接在类中声明的任何类型的变量,通常为具有私有或受保护的使用字段,常存储供多个类方法调用的字段;常量:对该类型所有实例都是相同的,用const声明;属性:公开的方法获取或设置值,包括get访问器和set访问器,常用于验证数据,操作其它成员;方法:操作函数;构造函数:对象创建时调用其构造函数,通常用作初始化新对象的成员,静态构造函数用于初始化静态成员或用于执行仅需一次的特定操作,自动调用静态构造函数;析构函数:一个类只能有一个析构函数,无法调用,自动调用的,用~类名()声明,用于资源的显示释放。嵌套类:将包含类型作为构造函数传递给嵌套类型,可访问包含类型。分布类:作用 partial 关键字声明。
接口:使用interface来声明,一个类可以实现多个接口
结构:值类型,不修改数据为主的数据结构。使用struct关键字来进行声明,区别:除非字段被声明为const或static,否则无法初始化,结构不能定义默认构造函数和析构函数,结构的实例化可以不使用new来声明,也可以用new来实例化(默认构造函数或定义的构造函数),不支持继承,但可以实现接口,可以为null。如果结构包含引用类型成员时,必须显示实例化对象。
枚举:用关键字enum来声明,默认情况下,每个元素的基础类型为int,可以指定元素的值,若未指定将自动增,从0开始自动增1,用法:1)常用作提示类型2)作为位标志3)使用system.Enum来操作:获取:Enum.GetName(typeof(),int) int[]=Enum.getValues(typeof()) string[] Enum.getNames(typeof())
索引器:允许类或结构的实例就像数组一样进行索引,使用this[int index]等类似声明,与属性类似,不同之处在于它们的访问器采用参数。
委托:表示对具有特定参数列表和返回类型的方法的引用的类型,实例化委托时,可以将实例与任何具有兼容签名和返回类型的方法相关联,从而通过委托调用方法。委托用于将方法作为参数传递给其他方法。特点:将方法作为参数传递,常用于定义回调方法,多路委托:可以包含多个方法,用+=,-=来运算;实例委托直接用方法名或用new构造或用delegate(){匿名方法)或简化成表达式。
事件:通常用于表示用户操作,类或对象可以通过事件向其它类或对象通知发生的相关事情。发送(或引发}事件的类称为发行者,接收(或处理)事件的类为订户。特点:发行者确定何时引发事件,订户确定执行何种操作来响应事件,一个事件可以有多个订户,一个订户可以处理多个发行者的多个事件,没有订户的事件永远不会引发,编程式事件:基于 EventHandler 委托和 EventArgs 基类的,1)定义自定义数据类:EventArgs 2)在发布类中声明一个委托。 为它指定以 EventHandler 结尾的名称,第二个参数指定自定义 EventArgs 类型3)定义事件:无自定义EventArgs 类的:public event EventHandler RaiseCustomEvent;使用委托的:public event 委托 事件名;3)直接用范型:public event EventHandler<CustomEventArgs> RaiseCustomEvent 4)发布类:定义事件调用方式,订户:事件调用的处理过程
特性:它对程序中的成员进行标注,如类型、字段、方法和属性,用[]声明,常用特性:[Required]必需
范型:最大限度的保护代码,初始化使用default(T)