基础篇C#——语句,运算符,表达式,string,StringBuilder和字符串编码
1、语句可以分为跳转语句(break、continue、goto、throw、return(面试))、循环语句、选择语句、条件语句等,if语句中如果第一个方法
运行失败时后面的语句都不执行了,最好不要再if语句中放方法;循环语句:while 、do while、for、foreach(循环集合或数组,其前面
的变量代表集合或数组中每个元素的值),string类型不能放到for循环里;
  int[] a={1,2,3,4};
            foreach (var str in a)//数组元素的类型未知,故直接用var,str代表的是数组中的每一个元素而不是下标
            {
                Console.WriteLine(str);
            }//打印数组元素的值
  for (DateTime dt = DateTime.Parse("2011-1-1"); dt < DateTime.Parse("2011-7-14"); dt = dt.AddDays(1))
            {
                Console.WriteLine(dt);
            }//给出一个初始日期,一个限定日期,按天增长,列出从初始日期到限定日期的所有日期
跳转语句:break:跳出全部循环
                continue:跳出本次循环,如果是个死循环,放continue没办法结束死循环,可以放break结束死循环              
  goto:不建议使用,跳转到标志位置
  return:返回,如果在main方法中返回return表示结束main方法,结束整个程序;在普通方法中放return表示跳出本方法
  throw:抛出异常
异常处理语句:try.....catch 、  try......catch......finally 、  try……finally(finally无论什么情况一定会执行(面试))
      try
            {
                throw new Exception("自定义异常");//用户用throw自定义的异常,此异常肯定小于等于catch抓住的异常
                //int i = 0;
                //int k = 9;
                //int t = k / i;
            }//代码在执行时先判断是否有异常,如果有就抛出异常,此异常用户是看不到的,也可以自己利用throw自己抛出异常
            catch (DivideByZeroException exe)//DivideByZeroException异常的范围小于Exception
                Console.WriteLine("发生异常--"+exe.Message );
            }
            catch (Exception exc)//给异常信息一个参数,catch可以嵌套,所以写异常时一定要把范围小的写前面,由小到大这样如果前面的捕捉不到
                                               后面一定会的一个范围最大的一定可以捕捉到
            {
                Console.WriteLine("发生异常," + exc.Message);//输出异常信息
            }
            finally
            {
                Console.WriteLine("最后都执行!");
            }
例题:执行一个取款的操作,并输出是否有异常。本题采用两个类,一个业务异常处理类BusException,它继承微软定义的异常类Exception,
         另一个类Program,用来处理控制台显示并抛出异常
     1)
         class BusException : Exception //BusException继承父类Exception
    {
     
        public BusException(string message): base(message)//构造函数,将BusException抛出的异常传给父类
        {
            File.AppendAllText(@"D:/a.txt", message + "\r\n");//将捕捉的错误信息保存在D:/a.txt文件中
        }
    }//定义一个BusException继承父类Exception,这样在BusException中可以添加自己的新操作,因为Exception 属于微软】
     //定义好的异常类,不能再在其中添加自己的操作,例如本例中添加了把异常保存到新文件中的操作
    2)
        class Program
    {
        /// <summary>
        /// 相当于显示层
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("操作成功,余额为{0:c}",Qukuan (2000));
            }
            catch(Exception exc)
            {
                Console.WriteLine(exc.Message );
            }
        }
        /// <summary>
        /// 相当于业务逻辑层,在次层进行业务的处理,处理异常
        /// </summary>
        /// <param name="money"></param>
        /// <returns></returns>
        static double Qukuan(double money)
        {
            Console.WriteLine("请输入取款金额:");
            double tempmoney = double.Parse(Console.ReadLine());
            if (money < tempmoney)
            {
                throw new BusException("业务逻辑错误:取款金额大于存款金额!");//将这个抛出异常的信息传给业务处理BusException的message中
                                                                                                                       new BusException是实例化这个BusException类,C#中要想使用另一个类
                                                                                                                       或类中的字段方法,必须先实例化
            }
            else
            {
                return money = money - tempmoney;
              
            }
        }
    }
Checked和Unchecked语句:检验运算时是否溢出,有Checked就报异常
2、运算符:接受一个操作数的运算符被称作一元运算符,例如增量运算符 (++) 、 new、!。接受两个操作数的运算符被称作二元运算符,
例如算术运算符 +、-、*、/。条件运算符 ?: 接受三个操作数,是 C# 中唯一的三元运算符。
& 与(都是1时才为1)
|   或(遇1为1,只要有1都为1)
^  异或(相同时为0,不同为1)
~  取补(求补全反转)
<< 左移(移位最麻烦,除头尾补0)
>> 右移
3、表达式
      string(面试):引用类型,使用起来像值类型,string代表一个不可变的顺序字符集,本质上是一个char类型的数组
       例:string a = "aaa";
            string b = a;
            b = "bbb";
            Console.WriteLine(a);
            其运行结果a的值还是aaa,并没有被修改,使用起来跟值类型很相像,因为字符串的不可变性,在编程中尽量不使用字符串的拼接,
            每拼接一个字符串都要重新分配一个内存。
            如果字符串都相同,不管多少个变量,它们都可以指向同一个字符串,这是字符串的留用,这样减少内存空间,所以综合来看,字符串
            有两个特性:1不可变性 2字符串的留用
string的一些常见的方法:
 static void Main(string[] args)
        {
            string a = "---a  --\\//||--";//紫色的是方法,蓝色的是字段,属性是带小手小标签
            string b = "a|aabb";
            string c = "a|aaa";
            char[] arr = new char[4];//定义一个数组长度为4
            Console.WriteLine("|"+a.Trim(arr)+"|");//从前后两面同时去除这些给定的特殊符号
            Console.WriteLine("|" + a.TrimEnd (arr) + "|");//从后面去除给定的特殊符号
            Console.WriteLine("|" + a.TrimStart (arr) + "|");//从前面去除给定的特殊符号
            Console.WriteLine("|" + a.Substring (1,3) + "|");//表示从第一个字符开始截取长度为3的字符,返回结果是--a
            Console.WriteLine(b.Split('|'));//Split返回的是一个数组,所以这样直接输出得不到分割的字符,可以用foreach遍历
            foreach (string str in b.Split('|'))
            {
                Console.WriteLine(str);
            }
            Console .WriteLine (b.CompareTo (c));
            Console.WriteLine(b.Remove (2));//删除从指定索引位置到最后的所有字符,最后返回的是a|
            string[] ar = { "ff", "ff", "hj" };
            Console.WriteLine(b.Contains ("a"));//查看字符串b是否包含a字符,包含则返回true
            Console.WriteLine(b.EndsWith ("a"));//从字符串的最后一位看是否包含a,包含就返回true
            b.CopyTo (1,arr,0,3);//表示从字符串b的下标为1的字符开始复制到字符数组arr中,从arr数组中的0下标开始复制字符串
                                 //b长度为3个的字符,其返回的是一个字符数组,所以可以遍历输出而不能直接Console.WriteLine
            foreach (char ch in arr)
            {
                Console.WriteLine(ch);
            }       
                
       } 
转义序列:放路径时前要加@ ,要想在路径中再加",要用""
字符串格式输出:   
        Console.WriteLine("在宽度为的空间里靠左对齐:{0,-10}", 99);
        Console.WriteLine("在宽度为的空间里靠右对齐:{0,10}", 99);
        Console.WriteLine("在宽度为的空间里靠左对齐:{0,-10}", "LLL");
        Console.WriteLine("在宽度为的空间里靠右对齐:{0,10}", "RRR");
        Console.WriteLine(“货币- {0:C} {1:C4}”, 88.8, -888.8);(C4表示小数点后有4位,一般默认是2)
        Console.WriteLine("10进制整数- {0:D5}", 88);
        Console.WriteLine("科学计数- {0:E}", 888.8);
        Console.WriteLine("固定小数点- {0:F3}", 888.8888);
        Console.WriteLine("浮点数- {0:G}", 888.8888);
        Console.WriteLine("数字格式- {0:N}", 8888888.8);
        Console.WriteLine("16进制格式- {0:X4}", 88);
        Console.ReadLine();
            Console.WriteLine(string.Format ("{0:c}",123));//如果不是在控制台程序下想显示货币符号,可以用此种方法
            Console.WriteLine(DateTime.Now.ToString ("yyyy-MM-dd hh时mm分ss秒"));
            return;
StringBuilder与String(面试):微软新建的一个拼接字符串的类,在System.Text命名空间下,它新建一个Char的数组来达到操作字符串,
            使用其拼接字符串时不会像使用string那样需要每次都重新分配缓冲区,只有在下列两种情况下才重新分配内存:1)拼接的字符串超出了
            事先定义好的长度 2)已经调用了StringBuilder的Tostring方法后再拼接字符串,由于调用过Tostring方法后内部的char数组会重新分配,
             所以要想再拼接必须重新分配内存,它牺牲了大量的存储空间来换取了较快的性能
                                             而String由于本身具有不可变性,每次要拼接字符串系统都要为其重新分配缓冲区,非常浪费内存
4、编码:用C#查看所有ASCII码:
 for (int i = 0; i < 256; i++)
 {
 Console.WriteLine(i.ToString ()+"--"+  (char)i);
}