zoukankan      html  css  js  c++  java
  • C#语言学习记录

    1.&& || ! 与或非—逻辑运算符,&&的优先级大于||。

    2.常量:定义时:const 类型 常量名称=常量值 如:const PI=3.14;在定义时赋值,在其他时候不能改变。

    3.枚举:让我们定义一种枚举类型,并且在定义这种类型是我们要指定这个类型的所有值,一般用来定义那些确定了所有情况的量

      语法:enum 自己定义的名称 {值1,值2,...,值n};枚举的定义一般和类定义在同一个级别(定义在命名空间之下)。比如:enum gender{male,female};

      定义枚举时值不能是Int类型。可以强制转换成Int类型,默认编号:0,1。。。。;也可以自己定义值enum gender{male=1,female};则后面的递增。

      字符串类型转换成枚举类型:(自定义枚举)(Enum.Parse(typeof(自定义枚举),待转换的字符串))。

    4.结构:一个整体有很多不同的属性,用结构来表示很多这种整体。如:存储一个人的所有信息:名字,性别等。和类定义在同一个级别。

      语法:访问修饰符 struct 结构名        public struct people 

          {            {  

            定义结构成员        public string name;

            方法等           public string sex;   

          }            }

    5.数组:可以帮我们一次性申明多个同类型的变量。这些变量在内存中是连续的。如 int[] age=new int[5];使用时通过下标来找。赋值可以:int[] age=new int[]{1,2,3...},数组名.Length获得数组的长度。

    6.函数(方法):将一堆代码进行重用的机制。可能有输入值,和返回值。 一般方法都要定义在class中。如果没有返回值,用void,一个方法只有一个返回值。调用:类.方法名。return退出方法。

      方法语法:[访问修饰服][static] 返回值类型 方法名([参数])

            {

              方法体

            } 

     一个变量定义在类的里面,就叫做类的字段,能被类中所有方法访问,但是静态(static)方法只能访问静态字段。方法不管是不是静态的都能访问常量。由const修饰的常量不能定义成为静态。

     7.方法重载:在同一类下,方法名相同,且方法的参数个数不同或同位置参数的类型不同才能构成方法重载。

    8.在方法中参数如果使用out了的话,一定要在方法中赋值,这个参数不是用来传入的是用来传出的,int.TryParse(s, out b); out可用于方法返回多个值。

     ref也能向方法里面传值又能向外面返值。如果用了out或者ref的话,那么调用者和方法中的参数都会相应改变(快捷方式)。

      

    完整课程

    • 属性(property):lable.text对象的一个特征或者特性。方法(method):xx.setbounds(x,y,w,h)设置对象的动作或者功能。事件(event):click  要用+=,指对象和外界的一种通知机制。
    • 程序的基本组成就是(class),变量以及方法等都要写在类里面。几点注意:对象的生成(new),事件的注册(+=)
    • c#的数据类型分为两大类:
      • 值类型(value type) 如:int double size  datetime数据直接存在栈,字符串类型前面加上@后就不转义。
      • 引用类型(refrence type) 如: button label person 数据存到堆,栈去存储引用信息
    • 无符号:sbyte(1个字节),short(2个字节),int(4个字节),      float(4个字节),double(8个字节)
    • 逻辑运算的短路运算:&&只要一边为假则另一边就不判断了,||只要一边为真另一边就不判断了。注意整形提升:byte,short,char运算时都转化成int
    • 数组:1先分配空间,2操作元素。数组的复制:Array.Copy(source(源数组),0,dest(目标数组),0,source.length)
    • :构造方法:在类的方法里面有一类特殊的方法,是完成对象的初始化,1、构造方法的方法名和类名相同,2、构造方法没有返回值也不能写void,构造方法不能显式的访问,要用new。
    • 属性:实际上是方法,比字段要多:可以只读写,可以检查if
    • 索引
      修饰符  类型 this[参数列表]
      {
          set{}
          get{}
      }    

      属性和索引是对字段进行访问和扩充

    • 继承:通过冒号来表示,都是单继承,默认所有类都是继承Object。如果需要的是一个父类的对象,来一个子类的对象是完全可以的。可以用as来强制类型转化,Student s1= p1 as Student (如果能转换就是New一个,如果不能转换就是null),as运算符只能针对引用类型。is运算符(用来判断一个对象是不是一个类(或者子类)的实例))if(p1 is Person)
      virtual public void SayHello(){ //定义方法 //virtual表示可以被子类override
              Console.WriteLine("Hello!  My name is " + name );
          }

       与父类同名的方法

      • 一是定义同名、但参数列表(签名)与父类不同的方法,这称为对父类方法的重载(Overloading)
      • 二是定义同名且参数列表也与父类相同的方法,这称为新增加一种方法,用new表示
      • 三是定义同名且参数列表也与父类相同的方法,而且父类的方法用了abstract或virtual进行了修饰,子类的同名方法用了override进行了修饰,这称为虚方法的覆盖(Overriding)
      • 使用base可以调用父类的方法。
    • 修饰符
      • 访问控制符:public:在任何地方都可以访问,private:只在同类中可以访问。protected:除了自己外,还可以在子类访问。internal:在相同程序集里面可以访问。protected internal:在子类和相同程序集里面可以访问。
      • static:不能访问实例变量,调用时要直接用类名去访问,有时候可以用来表示“全局变量”,属于类而非实例。
      • const:相当于静态常量,只能用于基本类型和string,还可以修饰局部变量。readonly:相当于不可变量,只能赋一次值,只能修饰字段。
      • sealed类:不可以继承,一般系统类(string console math),abstract类:不可实例化,要用(new)Array。abstract 类型 方法名(参数列表); abstract 类型 属性名{get;set;}
           小结:
    • public/private/internal/protected是访问控制符
    • static属于类的而非实例的
    • const常量readonly只读量
    • sealed不可继承的
    • abstract抽象的,不可实例化
    • 接口
          • 接口实际上是一个约定:Icloneable,接口是抽象的成员的集合,接口是一个引用类型,比抽象更抽象。
          • 定义接口:先约定好,再在别的地方实现
            public interface IStringlist
            {
                  void Add(string s);
                   int Count(get;);
                   string this[int index]{get;set;};           
            }   注意:public 和abstract这两个关键字不用写出来。
          • 实现接口:实现之前的约定的接口
            class 类名:[父类,]接口,接口
            {
                  public 方法(){...} 
            }
          • 显式接口成员实现:在实现多个接口有同名的方法时,方法名前要写接口名:void IWindows.close()。调用时只能用接口调用:((IWindows) f).close();
    • 结构以及枚举
        • :结构常用来表示较简单的多个分量(字段),可以有方法属性等成员。
          • struct是值类型的,是sealed的。结构不能包含无参数构造方法。
          • 在定义字段时不能给初始值。
          • 构造方法中必须对每个字段赋值。
          • 实例化时用new,但是与引用型变量的内存是不一样。
          • 值类型变量在赋值时是实行的是字段的copy
          • 枚举实质上来说是整数,是值类型,就是把几个可以列举的常量用符合来表示。
            enum mycolor
            {
                 red,
                 green=1,
                 yellow=2    
            }    
          • 赋值以及比较: mycolor c = mycolor.red if(c==mycolr.red) switch(c){case mycolor.red:..}
          • 与字符串的转化: console.writeline(c.tostring()) ; c = (mycolor)Enum.Parse(typeof(mycolor),"red");
          • 结构主要用来表示多个分量,枚举主要用来表示符合化的常量。他们都是值类型。
    • 委托
      • :委托是对函数原型的包装,也可以把多个函数同时绑定起来,调一下就可以依次全部调用了
        • 委托的声明: public delegate double Mydelegate(double x)
        • 委托的实例化: Mydelegate d=obj.method
        • 委托的调用: 委托名(变量) d(8.9)
        • 委托的合并:一个委托实例中可以包含多个函数,调用委托就是调用多个函数,函数间的顺序没有意义,返回值也没有意义。可以用运算符:+ - += -+来进行运算。 cd3= cd1+cd2//call m1 then m2
        • 跨线程调用一定要用invoke()函数,加一个委托。
        事件:>>>>回调函数,封装了委托类型的变量,使得:在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。
      • 事件的声明:public event 委托名 事件名 ,声明一个事件类似于声明了一个封装了的委托类型的变量。
      • 事件的注册与移除:事件名 +=或-=(在事件所在类的外面只能用以上两个运算符)
      • 事件的发生(激发):事件名(参数列表)-相当于回调所注册的函数
    • Lambda表达式
      • 泛型有一个<>。
      • 匿名方法:delegate(参数){方法体},隐私转化为委托:new Thread(delegate(参数){方法体})
      • lambda表达式就是对匿名方法的简写:(参数)=>(表达式或者语句) PlotForm(x=>x*x,1,12)
    • 运算符重载
      • public static 类型 oprator 一元运算符(类型 参数){。。。} :一元运算符的声明
      • public static 类型 operator 二元运算符 (类型 参数)(。。。) :二元运算符的声明
      • public static implicit operator 类型(类型 参数名){。。。} :类型转换运算符的声明
      • public static explicit operator 类型(类型 参数){。。。} :类型转换运算符的声明
    • 异常处理
      • try{......}
        catch(Aexception ex){  .....}
        catch(Bexception ex){ .....}
        catch(一般的异常 ex){.....}
        finally{.....}

        越仔细的异常写在前面,越一般的异常写在后面。

      • throw抛出异常: if(xxx) { throw new someexception(信息) } 
    •  基础算法
      • random类:.Next(100)(生成0~100之间的随机数),.NextDouble()(生成0~1之间的数),如果要用更强的随机数: System.Security.Cryptography .RNGCryptoServiceProvider 
      • DateTime类是值类型:new DateTime(),.now(取当前的时间),.tostring("yyyy-MM-dd HH:mm:ss")*(转化成字符串),.AddMinutes(5)(加5分钟),.Year .Mounth .Day .Date,   TimeSpan(两个日期相减得到一个时间差)
      • string类:Substring(inx,len)获取下标从inx开始长度为len的自字符串。.Trim() .TrimEnd()去空格,.Padleft()在左边填充空格,.Insert()插入,.Remove()移除,.Split(';')切片成数组,string.join()。string的内容不变(immutable),stringbuilder是可变的 .Append .Remove .Replace .length .Tostring 在循环中使用s+=...会带来效率问题,最好使用Stringbuilder。
      • 集合:数组(ArryList)或者哈希表(键值对)等,访问集合的时候可以用foreach(类型 变量 in xxx)。泛型:如list<string> 、字典,有更好的类型检查以及性能。
      • 遍试:把所以的情况都测试一遍。for中用if
      • 迭代:多次使用同一算法。while中用n=f(n)
      • 递归:分而治之。f(n)中用f(n-1)
    • 流和文件
      • Stream类:是信息流的一个抽象
        • 按存取位置分:FileStream(文件流),MemoryStream(内存流),BufferedStream(缓存流)
      • 读写类:对于内容的区别
        • BinaryReader和BinaryWriter(二进制读写)
        • TextReader和TextWriter(文本读写)
          • StreamReader和StreamWriter
          • StringReader和StringWriter
      • 其关系:包装的关系
      • FileSteam fs = new FileStream("C:A.TXT")
        StreamWriter wr = new StreamWriter(fs)
      • System.Io所包含的常用类:
        • Directory:公开用于创建、移动和枚举通过目录或子目录的statis方法
        • DirectoryInfo:公开用于创建、移动和枚举通过目录或子目录的实例方法
        • File:提供用于创建、复制、移动、打开和删除文件的静态方法,并协助创建FileStream对象
        • FileInfo:提供用于创建、复制、移动、打开和删除文件的实例方法,并协助创建FileStream对象
        • FileSteam:公开以文件为主的Stream。既支持同步文件操作,也支持异步文件操作。
        • StreamReader:实现一个TextReader,使其以一种特定的编码方式从字节流中读取字符。
        • StreamWriter:实现一个WriterReader,使其以一种特定的编码方式从字节流中写入字符。
        • TextReader:表示可读取连续字符的阅读器
        • TextWriter:表示可以编写一个有序字符系列的编写器。该类为抽像类。
        • FileSystemInfo:提供FileInfo和SystemInfo的共有方法,当你不确定是文件还是目录的时候使用。
      • 文本文件的操作:
        • 建立StreamReader:new StreamReader(文件路径,FileCode)StreamReader常用的方法有:readline(读一行), readtoend(全读),read,peek,close。
        • 建立StreamWriter:new StreamWriter(文件路径,filemode,filecode)  StreamWriter常用的方法有:writerline、writer、flush、close
      • 二进制文件的操作:
        • FileStream:使用其Seek、Read 方法。
        •  BinaryFormatter。二进制格式器,可以把文本等序列化到一个流里面,当然也可以反序列化。
              FileStream stream = new FileStream("C:\StrObj.t", FileMode.Create, FileAccess.Write ,
                      FileShare.None);
          formatter.Serialize(stream, book);
          
    • 控件
      • 常用控件要在实际中熟悉。
    • 绘图以及图像
      • GDI:Graphics Devices Interface:绘图技术。如下代码在一个事件中(点击按钮)然后采用Graphics来进行绘图。
      • Graphics g = this.CreateGraphics();
                    Pen pen = new Pen(Color.Red,2);
                    Brush brush = new SolidBrush(Color.Green);
                    Font font = new Font("宋体",25);
                    Rectangle rect = new Rectangle(180,180,160,160);
                    g.DrawLine(pen,20,100,140,100);
                    g.DrawRectangle(pen, rect);
                    g.DrawString("GDI图形编程",font,brush,20,20);
                    brush.Dispose();font.Dispose();pen.Dispose();g.Dispose();//关闭这些工具,不能占内存。
      • 对于Graphics对象的话一般在使用的时候: using(Graphics g = this.CreateGraphics()){........} 这种相当于try{...}finnaly{g.dipose()}
      • 图像处理:Bitmap(位图)是抽象类是从Iamge派生的,可以处理Jpeg,bmp等位图,
        Bitmap bt1 = new Bitmap("dada\da.bmp")
        Bitmap bt2 = new Bitmap(bt1,200,300)
        Bitmap bt3    bt3.FromFile("文件名称")

        DrawImage:绘制图像。

      • 文本处理以及正则:
        • 文本处理常用类:Console类,.Write(打印),.WriteLine(打印一行),.ReadLine(读取一行)。String类:是固定的每次运算都会生成新的对象,StringBuilder类:不是每次都会新的对象,可以用Add等方法。System.Text.Encoding类:.Default(系统默认的编码),.UTF8,.GetEncoding("GBK232")给定编码,.GetBytes(str)得到一个字符串的字节,GetString(byte[])得到一个字节数组的字符串。
        • 正则表达式:Regex类:Static方法:Regex.IsMatch(s,pattern)(是否匹配)、Regex.Match(s)(匹配一次),Regex.Matchs(s)(匹配多次),Regex.Replace(s,pattern)(替换)。Match对象(匹配的结果),.Groups各组,.value原串,.Result(XXX)替换。(?<名称>XXXX)对分组进行命名、在替换时使用${名称},若不命名则用$1,$2等,$0表示全部匹配。(?i:xxxx)表示选项(忽略大小写),http://www.jb51.net/article/360.htm

     面向对象

  • 相关阅读:
    [算法] 堆栈
    [刷题] PTA 02-线性结构3 Reversing Linked List
    java IO流 (八) RandomAccessFile的使用
    java IO流 (七) 对象流的使用
    java IO流 (六) 其它的流的使用
    java IO流 (五) 转换流的使用 以及编码集
    java IO流 (四) 缓冲流的使用
    java IO流 (三) 节点流(或文件流)
    java IO流 (二) IO流概述
    java IO流 (一) File类的使用
  • 原文地址:https://www.cnblogs.com/jackcheblog/p/6253345.html
Copyright © 2011-2022 走看看