zoukankan      html  css  js  c++  java
  • 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两种方法。

  • 相关阅读:
    深入理解计算机系统 第六章 存储器层次结构 第二遍
    深入理解计算机系统 第六章 存储器层次结构
    深入理解计算机系统 第八章 异常控制流 Part2 第二遍
    深入理解计算机系统 第八章 异常控制流 part2
    深入理解计算机系统 第八章 异常控制流 Part1 第二遍
    深入理解计算机系统 第八章 异常控制流 part1
    深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part2
    深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part1
  • 原文地址:https://www.cnblogs.com/fcug/p/6201005.html
Copyright © 2011-2022 走看看