这两天练习的控制台程序还是颇感收或的,对于程序有了些头绪。不过自己的逻辑性还是很差,写出来的代码有大量的重复却不知到怎么去处理,后来同学说可以封装到一个方法我也不知道怎么封装经他的点拨还是弄成功了,那时才发现程序的逻辑之美,才体会到所谓的可维护性,灵活性。今天写了个自动售货急的小程序但是还没有实现用户输入数量的部分,等完善了再把代码贴上来。对于异常处理一直都是很模糊,今天学了把异常处理分到三个层次,发现代码的可维护性确实强了。看来学习程序还是得自己去动手实践去发现,纸上学来终觉浅啊。

下面对于今天的知识点做一个小结:

今天首先复习的是控制台的语句:

控制台的语句分为:

  • 循环语句:for,foreach,while.do-while
  1. foreach语句: 循环集合或数组,其前面
    的变量代表集合或数组中每个元素的值,
  2. string类型不能放到for循环里;
           例子说明:   int[] a={1,2,3,4};
                         foreach (var str in a)//数组元素的类型未知,故直接用var,str代表的是数组中的每一个元素而不是下标
                {
                    Console.WriteLine(str);//注意不是a[str]而是str
                }//打印数组元素的值
      for (DateTime dt = DateTime.Parse("2011-1-1"); dt < DateTime.Parse("2011-7-14"); dt = dt.AddDays(1))
                {
                    Console.WriteLine(dt);
                }//给出一个初始日期,一个限定日期,按天增长,列出从初始日期到限定日期的所有日期
              跳转语句:
  1. goto(不推荐用,但是可以用来调试程序),
  2.  return(语句终止 它出现在其中的方法的执行并将控制返回给调用方法。它还可以返回一个可选值。如果方法为 void 类型,则可以省略 return 语句。一旦return执行了它后面的语句就不再执行。如果在main方法中返回return表示结束main方法,结束整个程序;在普通方法中放return表示跳出本方法)
    break(跳出全部循环,继续执行循环体以外的语句),
  3. continue(跳出本次循环,后面的也不再执行,如果是个死循环,放continue没办法结束死循环,可以放break结束死循环         ),
  4. throw(抛出异常)
  •  条件语句:
  1. if-else(if括号里面的必须是布尔类型,方法运行完等待其返回值是true。 注意条件&&和||的时候放一个方法的话要注意若第一个返回的满足就不会执行后面的了。放条件的时候要明确。)
  2. switch{case 1:break;}

  异常处理:

分为三种类型:

try...catch

try..finall

try..catch..finall

finall块是无论在什么情况下都会执行的,即使其前面有return。

放置catch的时候一定要按照大范围的放在后面的原则,给异常信息一个参数,catch可以嵌套,所以写异常时一定要把范围小的写前面,由小到大这样如果前面的捕捉不到 后面一定会的一个范围最大的一定可以捕捉到
一个偷懒的办法是就些 catch (Exception ex){}z这个异常处理的父类

处理异常时也可以自己定义一个类存放异常,让自己定义的这个异常继承Exception这个父类,想要把异常写入日志或者增加自己的东西的时候比较方便,这样的话程序更加的灵活。

对于异常处理最好是分层次写 第一步在DAL层定义异常

第二步:在业务逻辑层定义业务,不符合条件的就抛出异常即throw new

第三步:在UI层捕捉异常

以银行系统取款为例:

自己定义一个异常类继承微软已定义好的异常类:好处:可以自己定义如可以把异常写入日志中
  
class MyException:Exception

{

public MyException()

{

}

public MyException(string message):base(message)

{

  File.AppendAllText(@"F:\a.log",message+"\r\t");//把异常写入日志中

}

}

UI层:(捕获异常,不同的编程环境不同的捕获方法,可变动性)
 static void Main(string[] args)
        {
    try 

{

 Console.WriteLine("您的取款金额为{0:c}:",QuanKuan(2000);

}   

catch(Exception ex)

{

 Console.WriteLine(ex.message);

}


业务处理层:(在任何环境下都不需更改的部分)即封装到一个方法中 直接调运就可以,有异常的话直接抛出
static double QuanKuan(double money)
          {
            Console.WriteLine("请输入要取的金额:");
            double je = double.Parse(Console.ReadLine());
          
             if (je > money)
           {
             throw new MyException("业务逻辑错误
");!");//将这个抛出异常的信息传给业务处理BusException的message中 new BusException是实例化这个BusException类,C#中要想使用另一个类 或类中的字段方法,必须先实例化。

            }
           else
             return money-je;
        }

Checked和Unchecked语句:检验运算时是否溢出,有Checked就报异常
 
运算符:
运算符:接受一个操作数的运算符被称作一元运算符,例如增量运算符 (++) 、 new、!。接受两个操作数的运算符被称作二元运算符,
例如算术运算符 +、-、*、/。条件运算符 ?: 接受三个操作数,是 C# 中唯一的三元运算符。
 

 

位运算的口诀:
& 与遇0为0
| 或遇1为1
^ 异或同为0
~ 求补全返转
<<  :左移

>> :右移:移位最麻烦除头尾补0

接下来学了表达式关于表达式需要理解的部分就是string类型

string类型它本身是引用类型,但用起来却又像是值类型,string类型的字符串具有不可变性,和留用性。什么是字符串的留用性呢?即若字符串都相同,不管多少个变量,它们都可以指向同一个字符串,这样可以减少内训空间。

如果给它重新赋值就会在托管堆中给它重新申请一块内存空间。因此用string类型拼接字符串是比较浪费内存空间的,遇到大量的字符串拼接应尽量避免用string类。

关于string还要注意:String是任何应用程序使用最多的类型之一。
一个String代表一个不可变的顺序字符集。String直接派生自Object,所以String是一个引用类型。
String str=new String(“大家好”);//错误的写法                       
String是直接赋值来构造的。

string的一些常见的方法:慢慢练习中。。

string a="aaa";
string b="bbb";
c=a+b;

与之对应的是stringbuilder这个类:在System.Text命名空间下。它可以有效地对字符串执行动态操作。StringBuilder是通过维护一个Char的数组来达到操作字符串,它是一个类 想要用它必须先new一个类。本身就是一个char数组(以牺牲存储空间 来 换取性能)

 

String和StringBuilder 比较:
String 或 StringBuilder 对象的串联操作的性能取决于内存分配的发生频率。
String 拼接字符串操作时每次都分配内存,StringBuilder不会像使用string那样需要每次都重新分配缓冲区,只有在下列两种情况下才重新分配内存:1)拼接的字符串超出了事先定义好的长度 2)已经调用了StringBuilder的Tostring方法后再拼接字符串,由于调用过Tostring方法后内部的char数组会重新分配。
所以要想再拼接必须重新分配内存,它牺牲了大量的存储空间来换取了较快的性能而String由于本身具有不可变性,每次要拼接字符串系统都要为其重新分配缓冲区,非常浪费内存
因此,如果串联固定数量的 String 对象,则 String 类更适合串联操作。
这种情况下,编译器甚至会将各个串联操作组合到一个操作中。如果串联任意数量的字符串,则 StringBuilder 对象更适合串联操作;

转义序列:放路径时前要加@ ,要想在路径中再加",要用""

后面还学了编码

编码:用C#查看所有ASCII码:

 for (int i = 0; i < 256; i++)
 {
 Console.WriteLine(i.ToString ()+"--"+  (char)i);
}

不过没仔细听,呵呵,用到时再看吧