当前位置: 首页 > news >正文

做网站做系统一样么做网站需要注册吗

做网站做系统一样么,做网站需要注册吗,wordpress非常吃cpu,网站建设领导讲话稿以下总结参阅了#xff1a;MSDN文档、《C#高级编程》、《C#本质论》、前辈们的博客等资料#xff0c;如有不正确的地方#xff0c;请帮忙及时指出#xff01;以免误导#xff01; 1..实现多态性的两种方式#xff1a;继承抽象类、实现接口 其实就是协变的应用#xff…以下总结参阅了MSDN文档、《C#高级编程》、《C#本质论》、前辈们的博客等资料如有不正确的地方请帮忙及时指出以免误导 1..实现多态性的两种方式继承抽象类、实现接口 其实就是协变的应用通过把对象向上转型为基类或接口类型对它调用成员可实现多态性即运行时调用的是对应对象的实现版本成员。这两种方式的区别 继承抽象类会用掉唯一1次的继承机会但可以继承任何成员(包括字段)自由度高实现接口必须实现所有成员不能包含字段但可以实现多个接口抽象类可以提供成员的具体实现而接口只负责声明不能提供任何实现代码 注意 接口一旦被定义就不应该再被改变否则所有实现该接口的类型都必须跟着修改。而抽象类则可以随时添加新的成员不影响他的子类还能提供新的额外功能。 多态性示例(协变与逆变) //可以返回Stream的任何子类类型Stream Method1(bool boo){ }//可以接收Stream的任何子类类型的参数void Method2(Stream stream){ } 2.不要创建可变的值类型(结构、枚举)若要改变请用一个方法来返回一个新实例。要时刻注意频繁的装箱与拆箱对性能的影响 3.仅在能一眼看出变量的类型时才使用var声明 4.定义值类型时它的大小不要超过16字节否则影响性能(频繁复制时)要么改为使用引用类型要么让它按ref引用传递 5.值类型数组之间不能直接互相转换可以通过一次中间转换为Array来达到目的如 (int[])(Array)new uint[32]但应注意可能在不同的CLR实现中表现不同 6.数组与List 如果元素数量固定且不涉及转型则使用数组效率更高。在元素数量可能发生变化的情况下就不应该使用数组而应该使用List无论是数组还是List元素个数也不能太多避免成为占用内存超过85000字节的大对象因为大对象将会被分配到单独的堆进行处理在回收大对象时效率较低。 7.字符串操作 字符串字面量、字符串常量直接用相连效率高因为string str srftttccc;会直接编译成string str srftttccc;同样适用于字符串常量。尽量避免对变量的装箱字符串变量较好的做法是字符串变量.ToString()频繁操作字符串时用StringBuilder并制定足够大的容量而string.Format({0}{1}{2},str1,str2,str3);内部也是用StringBuilder。 8.类型转换 字符串转其它基元类型 默认十进制用Parse()、TryParse()如int.TryParse(24);其中TryParse效率更高指定基数进制形式来解析Convert.ToInt32(0xFF,16);从字节数组中提取一段转为基元类型BitConvert.ToInt32(Byte[] arr, int startIndex); 自定义类型之间的强制转换从基类强制转换为子类时安全的做法是使用as若目标为null或类型不兼容转换失败均会返回null而不会引发错误如基类Person它的子类Man、Women Person person new Man();//自动向基类隐式转换但person的运行时类型仍为ManWomen women (Women)person; //错误Women women person as Women; //women为null 因为男人不能转换为女人 但需注意as只能应用于引用类型或可为null类型。若目标可能为基元类型则应该通过is操作符来过滤 if(!(person is int)) {Women women person as Women; } 子类与子类之间的横向转换应该定义转换操作符(关键字implicit、explicit) 9.获取一个可空类型Nullable的值安全简单的做法是用??如 int j i ?? 0;普通做法: if(i.HasValue()) { int j i.Value; } 10.常量const和只读字段readonly的区别 const是编译期常量它总是静态的编译时直接用实际值填充。而readonly是一个运行时常量。const只能修饰基元类型、枚举类型、字符串类型而readonly没有限制。const一经声明就必须初始化且之后就无法再改变。而readonly可显式初始化也可不初始化它的值可以通过构造函数来改变(即每个实例有自己的readonly只读字段值)注意除了构造函数之外都无法改变readonly的值对于引用类型是无法改变它的引用即它只能引用同一对象。但该对象本身是可以被修改的。 11.枚举类型 枚举类型可以为从byte到ulong的基元类型定义枚举时应该始终为它定义一个零值因为声明一个枚举变量而未初始化时的默认值将是0除了0值要么都不为成员显式赋值要么就全部赋值(如应用了Flags特性的标志枚举)否则未赋值的成员将等于它前一个成员的值加1因为枚举成员的值默认是按顺序逐个加1对枚举应用[Flags]特性可以定义一个标志枚举它的成员值通常初始化为2的次幂之后就可以通过按位运算来判断、合并枚举成员了。定义一个枚举来专门负责表示状态的信息这样使代码更易理解。如用枚举成员on、off来代替true、false或0、1 12.如果需要应该为类型重载常用的运算符和比较运算符如重载以实现person1person2 13.若该类型有泛型版本则应该使用泛型版本因为泛型类型效率更高(避免了装箱、拆箱、类型转换) 14.相等性 值类型对于值相等的两个值类型变量A、BAB和A.Equals(B)都返回true而Object.ReferenceEquals(A,B)总是返回false。引用类型Object.ReferenceEquals(A,B)比较的是引用是否相等而默认的A.Equals(B)也是比较的引用需要重载Equals()方法来实现引用类型之间的值相等性比较如当person1.ID person2.ID时person1.Equals(person2)返回true来表示他们相等注意1重写了Equals()方法最好也一起重写GetHashCode()方法因为对于不同的对象默认的GetHashCode()返回的值将永远不同而若把对象作为Dictionary的TKey时根据TKey取值时会根据对象的HashCode来比较。所以需要重新GetHashCode()使得Equals()方法返回true时GetHashCode()返回的值也相同这样字典才能正常工作。/TKEY,TVALUE注意2重写了Equals()、GetHashCode()方法同时也应该实现IEquatable接口该接口的成员bool Equals(T t1)比Object的Equals(object obj)类型更安全、更高效。注意3对于字符串虽然它也是对象但当两个字符串所包含的字面值一样时运行时将只在内存中创建一个该字面值的字符串对象也就是说所有字面值一样的字符串对象都将引用同一个地址。 15.ToString()方法 应该总是为自定义类型重写Object的ToString()方法最好还要实现IFormattable接口该接口的ToString(string format, IFormatProvider formatProvider)提供了根据参数来输出特定的格式化形式。如 public string ToString(string format, IFormatProvider formatProvider){    switch(format){        case CH:                 return this.ToString();             case EN:                   return string.Format({0}{1},FirstName,LastName);......} }//调用Console.WriteLine(person.ToString(EN,null)); 16.对象的浅拷贝与深拷贝 浅拷贝使用Object基类的实例方法MemberwiseClone()来获得对象的一个浅拷贝副本。深拷贝通过系列化与反系列化来深拷贝一个对象。通常做法如下接口ICloneable唯一成员是object Clone()实现该接口只是为了表明该类型的实现可以被拷贝[Serializable]class Person : ICloneable{public string ID {get;set;}public int Age {get;set;}public Work work {get;set;} //实现ICloneable接口的Clone()public object Clone(){    return this.MemberwiseClone(); }//自定义深拷贝方法public Person DeepClone(){      using (Stream objectStream new MemoryStream()){IFormatter formatter new BinaryFormatter();formatter.Serialize(objectStream, this);objectStream.Seek(0, SeekOrigin.Begin);         return formatter.Deserialize(objectStream) as Person;}} } 17.集合的遍历 for循环采用索引器for循环的优点是遍历过程中可以修改集合的元素。foreach循环采用迭代器遍历过程中无法对集合增删元素操作因为迭代器只对原始版本的集合进行遍历每次迭代都会进行版本判断若集合发生变化将抛出异常。- - - - foreach循环的优点是语法更简洁且迭代完毕后自动调用Dispose()foreach循环内部使用了try...finally 18.选择正确的集合详解请参见《C#高级编程》书中对集合讲的很细 线性集合的每个元素都是是1对1的大部分常用集合都是线性集合非线性1对多、多对1、多对多树、集HashSet、图直接存取具有索引器元素按索引器排列访问、查找速度快在末尾添加删除速度也快但在中间删除、插入元素效率低(需要移动后面的所有元素)。数组、List、字符串、结构顺序存取即线性表可动态扩大或缩小通过对地址的引用来搜索元素删除、插入元素效率高但查找效率低(需要遍历查找)Stack、Queue、Dictionary、LinkedList等/TKEY、TVALUE多线程集合类位于System.Collections.Concurrent命名空间中如ConcurrentBag对应于List、ConcurrentDictionary、ConcurrentStack、ConcurrentQueue/TKEY,TVALUE 实现自定义集合类时不要继承自内置的集合类而应该自行实现相应的泛型接口IEnumerable提供迭代功能ICollection提供常用操作IList 19.泛型 避免为自定义泛型定义静态成员在不同的类型之间共享静态成员没意义。记得为泛型参数设定必要的约束因为约束之后可以使泛型参数成为一个实实在在的对象可以访问到约束类型的实例成员而不做约束的话仅仅是一个object对象必要时用default(T)为泛型类型变量指定默认值如T param default(T); 20.委托 预定义的委托类型能满足大部分日常需求我们没有必要声明自己的委托类型。 ActionAction接受0个或多个输入参数无返回值/T1,...,T16FuncFunc接受0个或多个输入参数带返回值类型是TResult/T1,...,T16,TRESULTPredicate表示定义一组条件并判断参数是否符合条件具有特定用途的委托事件委托public delegate void EventHandler(object sender, EventArgs e);public delegate void EventHandlerTEventArgs(object sender, TEventArgs e);线程中的委托public delegate void ThreadStart(); //无参数public delegate void ParameterrizedThreadStart(object obj); //参数对象obj异步回调委托public delegate void AsyncCallback(IAsyncResult ar); 21.对于只用一次且主体语句数量较少的方法应该使用Lambda表达式它通常用于注册给委托、或作为其它方法的参数(参数类型是匹配的委托类型) 22.理解委托的本质 委托是一个类委托保存着对注册方法的引用(方法指针)多播委托保存着一组方法指针执行委托将按顺序调用方法指针指向的方法对一个委托实例用赋值一个新的方法指针时将会调用构造函数实例化一个新的委托对象所以在实例化一个委托对象之后后应该时刻记住使用、-来增加、删除新的方法指针委托类的方法Invoke()默认调用、在线程池中启用一个新线程调用BeginInvoke()、停止EndInvoke() 23.事件也是委托加了event关键字是为了限制委托 禁止了在包含类外部对委托事件对象使用赋值确保不会被覆盖或赋值为null禁止了在包含类外部对委托事件对象的直接调用事件的调用应该是包含类的责任参数1是触发者对象的引用参数2是EventArgs或其派生类的对象(可包含一些将在事件触发时需要用到的数据) 24.当委托和Lambda小心闭包对象 (特别是在循环体中的循环变量对于C#5.0的foreach则不必担心) 当Lambda表达式引用了局部变量时编译器就会自动创建一个闭包对象(如TempClass)该对象的成员包含一个对局部变量的引用(如TempClass.i)、和一个与Lambda表达式等价的方法(如TempClass.add该方法持有对局部变量的引用)。而该闭包对象中的方法成员TempClass.add最终被赋给了委托(如MyDel)而委托通常在局部变量的作用域之外才执行。也就是说委托中注册的方法持有了对局部变量的引用形成了像JavaScript中的闭包一样的效果执行委托方法时局部变量的值将是最新值而不是给委托注册方法时的局部变量值。public static void Main(){Action actnew Action(()Console.WriteLine(Begin));    for (int i 0; i 5; i){act () Console.WriteLine(i.ToString());}act(); //Begin 5 5 5 5 5  因为委托方法持有了对i的引用当前i的值为5Console.ReadKey(); }public static void Main(){Action actnew Action(()Console.WriteLine(Begin));     for (int i 0; i 5; i){        int temp i; //每次都用一个新的temp变量来保存当前的i值act () Console.WriteLine(temp.ToString());}act(); //Begin 0 1 2 3 4Console.ReadKey(); } 25.赋值为null大部分情况下不能提前垃圾回收。 没有必要将没用的实例成员显式赋值为null因为编译器会忽略该语句。只有对日后确实没用的静态字段显式赋值为null才有必要但要确保不会再用到它(或者说不会再用到它的包含类)。把一个对象赋值为null它的静态成员不会跟着变为null因为静态成员跟类的实例无关它会一直留在内存中除非显式赋值为null。 后续还有很多其它方面的如系列化与反系列化异常处理等由于篇幅有限只能等下一篇再发布了 原文地址http://www.cnblogs.com/susufufu/p/6263122.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注
http://www.ihoyoo.com/news/26244.html

相关文章:

  • fw可以做网站如何下免费的wordpress
  • 网站做tips帝国小说网站模板
  • 电子商务网站后台核心管理企业开通网站的费用怎么做分录
  • 成都网站制作和建设密云seo排名优化培训
  • 蓝色机械营销型网站深圳西乡做网站
  • 张店网站建设客户关系管理流程图
  • 买网站模板域名链接网站
  • 中牟郑州网站建设青岛网站设计品牌企业
  • 如何做百度网站2017漆包线 东莞网站建设
  • 房屋中介网站建设方案如何开通免费网站
  • 上海网站建设开发公司江西企业 网站建设
  • 网站设计销售好做吗网站开发基本流程ppt
  • 重庆建设技术发展中心网站光明新区城市建设局网站
  • 微信可以做网站吗吉林公司做网站
  • 网站开发 外包空心微信公众平台网页版
  • 企业网站建设公司怎么收费扬州天猫网站建设
  • 中性衣服印花图案设计网站网站续费服务商
  • 网站建设公司怎么开拓业务成都注册公司需要什么材料和手续
  • 我做网站了圆通wordpress 输入 摘要
  • 高端网站建设的公司旅游电子商务网站建设规划书
  • 三河市城乡建设局网站郑州房地产网站建设
  • 学校网站建设报价wordpress登入后缀
  • 郑州定制网站wordpress模板top破解
  • 桂林北站怎么去阳朔兴化市建设局网站
  • 太原市0元网站建设东直门小学的网站建设
  • 免费电子商务网站模板男女做那个的视频网站
  • 招标网址网站大全外贸网站sns
  • 辽宁省网站备案系统百度推广下载安装
  • h5商城网站 源代码软装设计培训机构
  • 新网站如何让百度收录给公司做门户网站