• C#学习记录


    转眼几个月没更博了,把几个月前学C#的笔记发一下,就记录了点教重要的点子而已

    1.打印

    Console.WriteLine(); 打印

    Console.ReadKey(); 按一个按键继续执行

    Console.ReadLine(); //用户输入文字的时候程序是暂停的,用户输入完毕点回车,把用户输入的东西做为返回值

    例:

    string s =  Console.ReadLine(); 读取进去的是字符串,所以不能用其他类型接收

    2.数据类型:

    值类型:int、float、double、char、byte、Boolean、枚举

    引用类型:DateTime、string、所有类

    类型转换:

    值类型:从小到大自动转,从大到小强制转,(类型),Convert.To***()

    引用类型:需要有继承关系才可以转换

    转换成字符串: ToString()

    类型转换:cast 强转(位数有差,可能丢失)

          convert 考虑数据意义的转换

    C#字符串与OC一致,与C不一致,不考虑最后的

    ‘a’   是char类型,”a”是string类型

    @“\\” @表示字符串中的不当成转义符

    3.字符串的处理

    ·C#中单个字符用单引号包含就是char类型,(‘a’),单引号中放且只能放一个字符。

    ·单个字符也可以表示为字符串,还可以有长度为0的字符串。

    ·使用s.Length属性可以来获得字符串中的字符个数

    ·string可以看做是char的只读数组。char c = s[1];例子:遍历输出sting中的每个元素。

    ·c#中字符串有一个重要的特性:不可变性,字符串一旦声明就不再可以改变。所以只能通过索引来   

      读取指定位置的char进行修改。

    ·如果要对char进行修改,那么久必须创建一个新的字符串,用s.ToCharArray()方法得到字符串的

     char 数组,对数组进行修改后,调用new string(char[])这个构造函数来创建char数组的字符串。一

     旦字符串被创建,那么char 数组的修改也不会造成字符串的变化。例子:将字符串中的A替换成a.

    字符串不可变性(分配的内存块里的不可变)

    string s1 = @“hello”;

    char[] chars = s1.ToCharArray();

    string s2 = new string(chars);

    此时改变后s2为aello,而s1不变,所以只是复制了一份char数组数据,于源数据无关

    如string s = “abc”; s = @“123”

    最后值改变了,其实不是

    要区分变量名和变量指向的值得区别。程序中可以有很多字符串,然后由字符串变量指向他们,变量可以指向其他的字符串,但是字符串本身没有变化。字符串不可变性指的是内存中的字符串不可变,而不是变量不变。

    4.字符串类的常用函数

    1)

    ·ToLower() 得到字符串的小写形式。

    ·注意字符串是不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的值通过函数·返回值的形式返回。s.ToLower()与s = s.ToLower()

    ·ToUpper():得到字符串的大写形式:Trim()去掉字符串两端的空白。

    ·s1.Equals(s2,StringComparison.OrdinallgnoreCase),两个字符串进行区分大小写的比较

    Ignore:忽略,Case:大小写

    ==是区分大小写的比较,Equals()是忽略大小写的比较

    2)分割字符串

    string[] str = strings.Split(‘,’); 将字符串按照指定的分割符分割成字符串数组

    将字符串按照指定的char分割符分割成字符串数组(options取RemoveEmptyEntries时,移除结果中的空白字符串)

    string str1 = @“aa,bb,,cc,dd”;出现空字符串 

    string[] str = strings.Split(new char[]{’,’},StringSplitOptions.RemoveEmptyEntries);

    将字符串按照指定的string分割符分割成字符串数组(同上)

    string[] str = strings.Split(new string[]{“aa”},StringSplitOptions.RemoveEmptyEntries);

    3)替换字符串

    string.Replace(“a”,”b”); 替换string里面的a全部成b

    获取子字符串:

    string.Substring(n);     从第n位开始截取string的字符串到结束,包含n

    string.Substring(n,m);     从第n位开始截取string的字符串长度为m(m超过string长度会出错),包含n

    4)返回bool值 使用:string.Contains

    Contains(string value)判断字符串中是否含有子串value

    StartsWith(string value)判断字符串中是否以子串value开始

    EndsWith(string value)判断字符串中是否以子串value结束

    返回int

    IndexOf(string value)取子串value第一次出现的位置

    枚举,跟其它语言没什么区别

    枚举的意义就在于限定变量的取值范围

    enum sender{a,b}

    foreach (string name in names){}; 遍历,还有for,见多了

    static void function(params string[] values){};

    params 可变参数 参数必须是形参表中的最后一个参数

    函数重载:函数名一致,参数不一致,可做两个函数使用,与有无返回值无关(不严谨)

    函数的ref和out参数

    函数参数默认是值传递的,也就是”复制一份”

    而ref是将本身传进去,非复制

    static void Main(string[] args)
    
    {
    
        int age = 20;
    
        1: IncAge(age);
    
        2: IncAge(ref age);
    
        Console.WriteLine(age); //1打印结果为20,因为传进的只是形参值;2打印结果为21,
    
        Console.ReadKey;
    
    }
    
    1:
    
    static void IncAge(int age)
    
    {
    
        age++;
    
    }
    
    2:
    
    static void IncAge(ref int age)
    
    {
    
        age++;
    
    }

    ref必须先初始化因为是引用,所以必须先“有”,才能引用,而out是内部为外部赋值,所以不需要初始化,而且外部初始化也没有用。

    ref应用场景内部对外部的值进行改变,out则是内部为外部变量赋值,out一般用在函数有多个返回值的场所。

    string str = Console.ReadLine();

    int i;

    int.TryParse(str,out i); //转换 返回值true  or false

    ref应用,如交换两个数的值

    5.构造函数

    ·构造函数用来创建对象,并且可以在构造函数中对对象进行初始化。

    ·构造函数是用来创建对象的特殊函数,函数名和类名一样,没返回值,连void都不用。

    ·构造函数可以有参数,new对象的时候传递函数参数即可

    ·构造函数可以重载,也就是有多个参数不同的构造函数。

    ·如果不指定构造函数,则类有一个默认的无参构造函数。

     如果指定了构造函数,则不再有默认的无参构造函数,如果需要无参构造函数,则需要自己来写。

    如:

    static void Main(string[] args)
    
    {
    
        Person p1 = new Person();
    
        Person p2 = new Person(“a”);
    
        Person p3 = new Person(“a”,2);
    
        Console.ReadKey;
    
    }
    
    class Person
    
    {
    
        public Person(){}
    
        public Person(string name){}
    
        public Person(string name,int age){}
    }

    对面可以叫做类的实例,字段就是类的状态

    面向对象的三个特性:封装、继承、多态。

    6.属性(可公可私有)

    惯用法:属性开头字母大写,字段开头字母小写

    public字段和属性的区别,属性可以进行非法设置值的判断

    class person
    
    {
    
        private int age;
    
        public int Age
    
        {
    
            set //赋值{
    
                if(age>0){
    
                    return; //如果return this.Age;造成死循环,自己给自己赋值
    
                }
    
                this.age = value; //value代表用户赋值过来的值
    
            }
    
            get //取值{
    
                return this.age;
    
            }
    
        }
    
    }                    

    7.异常

    try{

    执行到错误点后,不再往下执行

    }

    catch(Exception ex){

    出错后执行,再跳到外面继续执行

    Console.WriteLine(“数据错误:”+ex.Message+”。异常堆栈:”+ex.StackTrace);

    }

    throw:抛出   catch:抓住

    //自定义报错异常声明

    else{

    throw new Exception(“自定义异常”);

    }

    const 常量:不会改变的量

    静态变量:static 属于全局变量,无需new

    在static成员中不能直接调用非static成员

    例:

    class Person
    
    {
    
        public static int TotalCount;
    
        public int Age;
    
        public static void number()
    
        {
    
            Console.WriteLine(@“{0}”,TotalCount);
    
            //可调用TotalCount,但调不了Age
    
        }
    
        public void Other()//非static成员中科院调用static成员
    
        {
    
            Console.WriteLine(@“{0},{1}”,TotalCount,Age);
    
        }
    
    }

    8.静态类

    static class Person

    {}

    无法被new的类是静态类,静态类一般用来实现一些函数库。

    9.命名空间

    当有多个类重名时,可放不同文件夹下,或namespace不一样,使用时写全路径就行

    当前类文件里有Person类

    另一个文件夹名为hr,或namespace不一致的类下面有个类Person

    在当前类文件里使用hr文件夹里的Person类时如下:

    如果要使用的类和当前的类不在同一个namespace,则需要添加using引用

    导入该文件,在顶部

    using 命名空间.hr;

    命名空间.hr.Person p2 = new 命名空间.hr.Person();

    //就像文件的全路径一样

    10.索引

    C#中提供了按照索引器进行访问的方法

    定义索引器的方式:

    string this[int index]
    
    {
    
        get {
    
        return “”;
    
        }
    
        set{}
    
    }

    string为索引器的类型,[]中是参数列表。进行索引器写操作就是调用

    set代码块,在set内部使用value得到用户设置的值;进行读操作就是

    执行get代码块。

    索引器参数可以不止一个,类型也不限于int,几号可以是任意类型。

      

    11.

    项目认识,从各个地方复制

    String.Empty是string类的一个静态常量;

    String.Empty和string=””区别不大

    string s1 = "";

    string s2 = string.Empty;

    if (s1 == s2)<br>{

        Console.WriteLine("一模一样!");

    }   

    // 结果都是True

    String.Empty和string=””一样,同样需要占用内存空间,为什么推荐优先使用String.Empty ?

    string.Empty只是让代码好读,防止代码产生歧义

     用于控制一个对象是否激活,一个对象激活当且本身active=true,并且它的父结点也都active。相当API有:

      1)GameObject.SetActive

      2)GameObject.activeSelf

      3)GameObjectd.activeInHierarchy

    Socket.BeginReceive 方法 (Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)

    语法

    [HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]

    public IAsyncResult BeginReceive(

    byte[] buffer,

    int offset,

    int size,

    SocketFlags socketFlags,

    AsyncCallback callback,

    object state

    )

    参数

    buffer

    Byte 类型的数组,它是存储接收到的数据的位置。

    offset

    buffer 参数中存储所接收数据的位置,该位置从零开始计数。

    size

    要接收的字节数。

    socketFlags

    SocketFlags 值的按位组合。

    callback

    一个 AsyncCallback 委托,它引用操作完成时要调用的方法。

    state

    一个用户定义对象,其中包含接收操作的相关信息。当操作完成时,此对象会被传递给 EndReceive 委托。

    返回值

    Type: System.IAsyncResult

    引用异步读的 IAsyncResult

    异常

    Exception

    Condition

    ArgumentNullException

    buffer 为 null

    SocketException

    试图访问套接字时发生错误。有关更多信息,请参见备注部分。

    ObjectDisposedException

    Socket 已关闭。

    ArgumentOutOfRangeException

    offset 小于 0。

    - 或 -

    offset 大于 buffer 的长度。

    - 或 -

    size 小于 0。

    - 或 -

    size 大于 buffer 的长度减去 offset 参数的值。

    Socket.BeginReceive 方法 (Byte[], Int32, Int32, SocketFlags, AsyncCallback, Object)

    开始从连接的 Socket 中异步接收数据。

    命名空间:   System.Net.Sockets

    程序集:  System(System.dll 中)

    语法

    [HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]

    public IAsyncResult BeginReceive(

    byte[] buffer,

    int offset,

    int size,

    SocketFlags socketFlags,

    AsyncCallback callback,

    object state

    )

    参数

    buffer

    Byte 类型的数组,它是存储接收到的数据的位置。

    offset

    buffer 参数中存储所接收数据的位置,该位置从零开始计数。

    size

    要接收的字节数。

    socketFlags

    SocketFlags 值的按位组合。

    callback

    一个 AsyncCallback 委托,它引用操作完成时要调用的方法。

    state

    一个用户定义对象,其中包含接收操作的相关信息。当操作完成时,此对象会被传递给 EndReceive 委托。

    返回值

    Type: System.IAsyncResult

    引用异步读的 IAsyncResult

    异常

    Exception

    Condition

    ArgumentNullException

    buffer 为 null

    SocketException

    试图访问套接字时发生错误。有关更多信息,请参见备注部分。

    ObjectDisposedException

    Socket 已关闭。

    ArgumentOutOfRangeException

    offset 小于 0。

    - 或 -

    offset 大于 buffer 的长度。

    - 或 -

    size 小于 0。

    - 或 -

    size 大于 buffer 的长度减去 offset 参数的值。

    备注

    将 count 个字节从 src 复制到 dst,前者开始于 srcOffset 而后者开始于 dstOffset。

    开发人员应谨记 BlockCopy 方法使用偏移量访问 src 参数,而不是使用索引或数组上下限等编程构造。例如,如果使用应用程序的编程语言声明一个上限为零,下限为 -50 的 Int32 数组,然后将该数组和偏移量 5 传递给 BlockCopy 方法,则该方法将访问的第一个数组元素是该数组的第二个元素(位于索引 -49 处)。此外,首先访问数组元素 -49 的哪个字节取决于执行应用程序的计算机的 Edian 设置。

    Add和AddRange

    Add:将指定的对象添加到……中

    AddRange:向……末尾,添加数组

    -

    在群体操作时,使用AddRange取代Add 

    用AddRange可以让我们要加入的东西一次性加入,而不要每次都加一次,这样显然可以加快速度。几乎所有的windows control都支持Add和AddRange两种方法。

  • 相关阅读:
    ES6(四)字符串的扩展
    ES6(三)数组的扩展
    ES6(二) Destructuring-变量的解构赋值
    ES6(一) let and const
    canvas(七) 文字编写
    canvas(五)createPattern
    canvas(四) Gradient- demo
    canvas(三) star- demo
    jQuery之简单动画效果
    web开发小白之路
  • 原文地址:https://www.cnblogs.com/fcug/p/6201005.html
Copyright © 2020-2023  润新知