1.正常模式下的调试
正常模式指的是不会影响程序的正常运行。
在VS中我们使用Console.Write(或者WriteLine)方法向控制台输出变量的值,通过这个我们可以查看变量的值是否符合我们的预期来调试错误。
在Unity中我们使用Debug.Log("") Debug.LogError("") Debug.LogWarn(""),向unity的Console窗口输出信息,帮助我们调试错误。
2.中断模式下的调试
中断模式指我们可以暂停程序的执行,然后查看程序中的状态,也可以让程序继续执行。
如何让程序中断?
断点
断点是源代码中自动进入中断模式的一个标记,当遇到断点的时候,程序会进入中断模式。
“逐语句”和“逐过程”的差异仅在于它们处理函数调用的方式不同,这两个命令都指示调试器执行下一行的代码。如果某一行包含函数调用,“逐语句”仅执行调用本身,然后在函数内的第一个代码行出停止,而“逐过程”执行整个函数,然后在函数外的第一行处停止。如果要查看函数调用的内容,请使用“逐语句”。若要避免单步执行函数,请使用“逐过程”。
在嵌套函数调用上,“逐语句”将进入并单步执行嵌套最深的函数。如果对类似Func1(Func2())的调用使用“逐语句”,调试器将进入并单步执行函数Func2()
try-catch-finally 规则( 异常处理语句的语法规则 )
1) 必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。
2) 必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。
3) catch 块与相应的异常类的类型相关。
4) 一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。即Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或 其子类的实例,就执行这个catch代码块,不会再执行其他的 catch代码块
5) 可嵌套 try-catch-finally 结构。
6) 在 try-catch-finally 结构中,可重新抛出异常。
类是一个模板
把相似的对象划归成一个类。
需用对象,首先要定义类,类是产生对象的模板。
对象可提供的服务都是由类所赋予的。
所以,定义一个类要定义该类对象的属性和行为(即变量和方法)。
public:声明公共类,公共类其他类可以调用 (其它类中也可以调用)
private:声明私有类,私有类自己的类可以使用(只能本类之中使用),其它类不可使用
构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.构造函数具有一些特殊的性质:
(1)构造函数的名字必须与类同名;
(2)构造函数没有返回类型,它可以带参数,也可以不带参数;
(3)声明类对象时,系统自动调用构造函数,构造函数不能被显式调用;
(4)构造函数可以重载,从而提供初始化类对象的不同方法;
(5)若在声明时未定义构造函数,系统会自动生成默认的构造函数,此时构造函数的函数体为空.
栈
由编译器自动分配释放,其中存放在主调函数中被调用函数的下一句代码、函数参数和局部变量,容量有限
堆
由程序员自己分配释放(用malloc和free,或new和delete) ,如果我们不手动释放,那就要到程序结束才释放。如果对分配的空间在不用的时候不释放而一味的分配,那么可能会引起内存泄漏,其容量取决于虚拟内存,较大。
静态存储区
由在编译时由编译器分配,由系统释放,其中存放的是全局变量、static变量和常量.
值类型和引用类型区别
1.存储位置不一样
2.复制方式不一样
3.值类型无法添加属性和方法,引用类型则可以
4.值类型的比较是值的比较,只有当它们的值相等的时候它们才相等
5.引用类型的比较是引用地址的比较
字符串在内存中以字符数组的形式存储,最后有一个\0标识字符串结束
base是对父类的引用,而this是对类本身的引用
抽象类和抽象方法:
·C#使用abstract关键字,将类或方法声明为抽象类和抽象方法
·抽象类不能被实例化,抽象方法必须在派生类中重写
·类中包含抽象方法,该类必须声明为抽象的,否则会报错
密封类和密封方法
密封类:是类的一种,用sealed修饰,不能用作基类,也不能是抽象类。密封类主要用于防止派生。
·C#中使用sealed修饰,将类和方法声明为密封类或方法
·密封类不能被继承,密封方法不能被重写
·密封类不能作为基类,可以继承别的类或接口
·密封类不可继承,因此密封类不能声明为抽象的,否则会报错
索引器
索引器的修饰符有:new、public、protected、internal、private、virtual、sealed、override、abstract和extern。当索引器声明包含extern修饰符时,称该索引器为外部索引器。因为外部索引器声明不提供任何实际的实现,所以它的每个访问器声明都由一个分号组成。
索引器的签名由其形参的数量和类型组成。它不包括索引器类型或形参名。如果在同一类中声明一个以上的索引器,则它们必须具有不同的签名。
索引器值不归类为变量;因此,不能将索引器值作为ref或out参数来传递。