细节01给C#代码加注释的意义 细节02装箱和拆箱 细节03理解值类型和引用类型 值类型变量不能为null,必须具有一个确定的值。引用类型被赋值前的值都是null 细节04隐式转换和显示转换 细节05前缀方式增1和减1运算符 细节06理解移位运算符 >>运算符将第一个操作数向右移动第二个操作数所指定的位数 <<运算符将第一个操作数向左移动第二个操作数所指定的位数 注意几点: 1.如果第一个操作数为int或uint,则移位数由第二个操作数的低五位给出 2.如果第一个操作数为long或ulong,则移位数由第二个操作数的低六位给出 例如:int i; i=48>>3 则i=6 48对应的二进制为00110000,右移3位后的二进制值为00000110,则十进制为6 细节07理解运算的次序 细节08理解参数的类型 输入参数,输出参数out,引用参数ref,参数数组params 细节09重载方法 细节10虚方法与重写方法 虚方法指允许被其子类重新定义的方法,在声明时需要用virtual修饰符 重写也称为覆盖override,是在派生类使用override修饰符重写基类中带有virtual修饰符的虚方法 注意:override修饰符不能与new,static,或virtual修饰符同时使用 ,另外,重写方法只能用于重写基类中的虚方法,不能用来单独声明方法。 派生类中使用new关键字可以实现向基类成员隐藏继承成员。 public class Child:Parent { public new string m() {return "隐藏一般方法"} } 细节11结构和类的区别 细节12什么是封装 细节13什么是继承 细节14什么是多态 细节15作用域的概念 细节16使用索引器 索引器就是能够让类像一个数组似的被访问。索引器与属性很相似,也有get和set访问器。 public string this[int Ind] { get {} } shapeName=s[Count]; 细节17base和this关键字 base关键字用于派生类中访问基类的成员。使用范围如下: 1.调用基类中已被其他方法重写的方法 2.指定创建派生类实例时应调用的基类构造函数。 细节18理解静态修饰符 细节19。net的object类 System.Object类的核心成员如下: Equals():确定两个object实例是否相等 Finalize():释放资源并执行其他清理操作。 GetHashCode():返回一个能够标识内存中指定对象的整数 GetType():获取当前实例的System.Type()对象 MemberwiseClone():返回当前对象逐个成员的副本 ToString() 细节20细说可空类型 在访问数据库数据时可能获得的数据为空值,这时可以考虑使用可空类型来定义字段或方法以更好的使用类来操作数据。 int?i=null; int?等价于System.Nullable<int> 细节21分部类 public partial class Person {} 开发分部类时,要成为同一类型的各个部分的所有分部类类型定义必须都在同一个程序集或者同一模快中。(。exe或dll)中进行定义,分部类定义不能跨越多个模块。 细节22匿名方法 匿名方法:在事件注册时直接将一个委托与一段代码相关联,这种代码就是匿名方法。 Sendbtn.Click+=delegate{"sda"};定义委托的后面要加上分号。 delegate void Msg(string str)//定义委托 public void GetMsg(string str)//定义与关联委托匹配的方法 {Response.Write("dads");} Msg d =delegate(string str){Response.Write(str);}//委托与匿名方法的关联 Msg d= new Msg(GetMsg);//委托与命名方法关联 Sendbtn.Click+=delegate{Response.Write("safsaf");};//事件处理程序为匿名方法 细节23。net框架提供的属性(attribute) 。net框架提供了内置属性,这些属性都是从System.Attribute类派生而来的。 Conditional属性是System.Diagnostics.ConditionalAttribute的别名,该属性仅用于方法声明,即仅在C#编译器定义了作为属性参数出现的符号时,他才指定方法作为类的一部分 [Conditional(“参数”)] 启用调试状态时才作为类的一部分可以被调用, Obsolete属性用于定义正被替换或者不再有效的代码。该属性有两个参数Message和IsError,Message用于设置错误信息字符串,IsError默认为false表示在编译代码时发出警告信息,True表示编译器将生成错误信息。 细节24自定义属性类(Attribute) 自定义属性类派生于System。Attribute类
自定义属性类的特定:
1.使用AttributeUsage属性可以限制属性的用法。
2.在AttributeUsage属性中可以指定是否可以多次使用属性。
3.可以设置属性参数。
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]//AttributeTargets.Class表示限制仅用于类。 AllowMultiple = true表示可以多次使用属性 public class BookAttribute : Attribute { private string BookName; public BookAttribute(string bookname)//设置属性参数 { this.BookName = bookname; } public string Book { get { return BookName; } } } //多次使用属性类 [Book("细说ASP.NET;")] [Book("范例手册")] public class BookInfo { public string binfo = "图书信息-------"; public BookInfo() { } }
protected void Page_Load(object sender, EventArgs e) { BookInfo bf = new BookInfo(); object[] Bookattr; System .Reflection .MemberInfo Typeinfo=typeof (BookInfo ); //提取类型是属性类的成员 Bookattr = Typeinfo.GetCustomAttributes(typeof (BookAttribute ),false ); if (Bookattr.GetLength(0) != 0) { BookAttribute ba = (BookAttribute)Bookattr[0];//获取属性类的第一个成员 BookAttribute ba2=(BookAttribute )Bookattr [1];//获取属性类的第二个成员 }
} 细节25泛型 细节26包含/委托 类似适配器模式,把类中定义对象,然后自定义方法,然后在方法体中用到定义的对象中的方法。 细节27实现迭代器 迭代器是可以返回相同类型值的有序序列的一段代码,可用做方法、运算符或get访问器的代码体。可以在类中实现多个迭代器,每个迭代器都必须像类成员一样有唯一的名称。并且可以再foreach语句中被客户端代码调用。迭代器的返回类型必须为IEnumerable或IEnumerator中任意一种,也可以是实现这两个接口的类。 IEnumerable接口:包含了。net框架用于从对象中提取元素的方法。如果类包含一个元素的集合,并希望其他代码段使用foreach循环语句遍历该集合中的每一个元素则应该在类上实现该接口。 IEnumerable接口值包含一个方法定义GetEnumerator(),用于返回一个循环访问集合的枚举数。 IEnumerator接口:支持对非泛型集合的简单迭代。该接口定义了一个属性和两个方法 1.Object Current{get}属性,获取集合中的当前元素 2.bool MoveNext()方法,访问集合的下一个元素 3.void Reset()方法,设置枚举数为其初始位置。 使用时必须引用System。Collection命名空间 public class Car : IEnumerable, IEnumerator { private short flag = -1; public IEnumerator GetEnumerator() { return this; } public object Curretn { get { switch (flag) { case 0: return "aodi"; case 1: return "huangguan"; default : return "this is Error"; |