一调试和错误处理
 
错误 (Bug):
变量名写错,导致编译器无法编译(语法错误),逻辑在某些方面有瑕疵,也会产生错误。这类错误称为语义错误(逻辑错误)
在程序出错之后。使用VS提供给我们的调试功能,找到错误的原因修改代码。(调试)
C语言中的错误处理技术,对可能发生错误的地方采取预防措施,并编写弹性代码来处理可能会发生的致命错误。(错误处理)
正常模式下的调试:指的是不会影响程序的正常运行。
1,.在VS中我们使用Console.Write(或者writeLine)方法向控制台输出变量的值,通过这个我们可以查看变量的值是否符合我们的预期来调试错误。
2,在Unity中我们使用Debug.Log(wyDebug.LogError(u Debug. LogWarn(u),向unity的Console窗口输出信息,帮助我们调试错误
中断 (Debua)模式下的调试:
中断模式指我们可以暂停程序的执行,然后查看程序中的状态,也可以让程序继续执行。
如何让程序中断?
断点
断点是什么?
代码是源代码中自动进入中断模式的一个标记,当遇到断点的时候,程序会自动进入中断模式。
如何插入断点?
1,右击代码行,选择breakpoint (断点)-〉Insert breakpoint(插入断点)
2,光标定位到代码行,选择菜单上的Debug(调试)-〉Toggle breakpoint(切断断点)
3,光标定位到代码行,按下F9键,在此按下F9是取消断点
4,在需要添加断点的行首位置,直接单击,再次单击取消断点
在调用堆栈窗口下我们可以观察到当前代码执行到哪一行了,并且可以看到这个代码的是被什么语句调用的
即时窗口我们可以在这里输入一些命分,查看变量的值,修改变量的值,可以输入表达式
查看结果
单步执行代码:
在中断模式下我们可以单步执行代码,单步执行带有有两种 逐过程和逐语句,他们两个都是一条语句一跳语句的执行,区别在于逐过程遇到函数,不会进入函数内部,而把函数当成一条语句去执行。
错误处理(异常处理)
再开发过程中如何查找和修正错误,使这些错误不会再发布的代码中出现,但有时,我们知道可能会有错误发生,但不能100%的肯定他们不会发生,此时最好能预料到错误的发生,编写足够健壮的代码以处理这些错误,而不必中断程序的执行。
错误处理就是用于这个目的。
昇常:
异常是在运行期间代码中产生的错误。
示例:
intl myArray = {1,2,3,4):
int myEle =myArray 4)/数组下标越界
运行到这里的时候,会出现异常,这个异常的定义已经在CLR中定义好了。如果我们不去处理这个异常,那么当昇常发生的时候,程序会终止掉,然后异常后面的代码都无法执行。
昇常处理(捕捉异常)ty…Catch.. finally 语句
我们处理异常的语法结构如下(包含了三个关键字 try catch finally)
 
try{
……
}catch(    ){
……
}
finally{
}
ℒฺℴฺνℯ̶ฺ归̶零̶⋆ 14:17:48
其中catch块可以有0或者多个,finally可以有0或者1个
但是如果没有catch块,必须有finally块,没有finally块,必须有catch块,catch块和finally
块可以同时存在
每个代码块的用法
trv块包含了可能出现异常的代码(一条或者多条语句)
catch块用来捕捉昇常,当代码发生昇常,那么异常的类型和catch块中的类型一样的时候,就会执行该catch块,如果catch块的参数不写,表示发生任何异常都执行这个catch块
finally块包含了始终会执行的代码,不管有没有异常产生都会执行
面向对象编程
什么是面向对象编程?
为什么使用面向对象编程?
为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且
每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会。
面向对象编程也叫做OOP编程
简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰。
类创建的变量叫做对象,
类是什么东西?
类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法。
类定义了类的每个对象(称为实例)可以包含什么数据和功能
类的定义
类中的数据和西数称为类的成员
数据成员
两数成员
数据成员:
数据成员是包含类的数据--字段,常量和事件的成员。
两数成员:
函数成员提供了操作类中数据的某些功能。(方法,属性,构造方法和终结器(析构
方法),运算符,和泰引器)
 
宇段的声明
访问修饰符 类型 字段名称;
方法的声明
访问修饰符 返回值类型 方法名称(参数)
定义一个类来表示一个顾客
 
class Customer{
public   string      name;
public   string      address;
public   int      age;
public   string      buyTime;
Public    void Show( ){
console.Writeline("名字:"+name);
console.Writeline("年龄:"+age);
console.Writeline("地址:"+address);
console.Writeline("购买时间:"+buyTime);
}

其中ClassName是我们定义的类的名字,myClass是我们声明的变量(对象)的名字,后
面的new是一个关键字,使用new 加上类型名()表示对该对象进行构造,如果不进行构
造的话,这个对象是无法使用的。
构造函数
我们构造对象的时候,对象的初始化过程是自动完成的,但是在初始化对象的过程中有的时候需要做一些额外的工作,例如需要初始化对象存储的数据,构造函数就是用于初始化数据的函数
声明基本的函数构造函数的语法就是声明一个和所在类同名的方法,但是该方法没有返回类型。
public class Myclass{
public   Myclass (){
这个构造函数的函数体

}
程序内存区域:堆 栈 静态存储区
程序所有的数据,也就是所有的变量,都是存储在内存中的。
栈空间比较小,但是读取速度快。
栈空间比较大,但是读取速度慢。
栈的特征
数据只能从栈的顶端插入和删除
把数据放入栈顶称为入栈 (push)
从栈顶刪除数据称为出栈 (pop)
内存中的栈,是由系统管理 (.Net框架)
在数据结构中学习写一个自己的栈结构,保存数据。

ℒฺℴฺνℯ̶ฺ归̶零̶⋆ 14:18:03

堆是一块内存区域,与栈不同,堆里的内存能够以任意频序存入和移除

GC Garbage Collector垃圾回收器
CLG的GC就是内存管理机制,不需要关心内存的使用,因为这些都是CLR帮我们做了。

值类型和引用类型
类型被分为两种:值类型(整数,bool struct char 小数 )和引用类型(string 数组 自定义的类,内置的类)
值类型只需要一段单独的内存,用于存储实际的数据,(单独定义的时候放在栈中)
引用类型需要两段内存
第一段存储实际的数据,它总是位子堆中
第二段是一个引用,指向数据在堆中的存放位置

 
注意
当我们使用引用类型赋值的时候也其实是赋值的引用类型的引用
如果数组是一个值类型的数组,那么数组中直接存储值,如果是一个引用类型的数组(数组中存储的是引用类型),那么数组中存储的是引用(内存地址)
 
面向对象-继承
继承是什么?
用类当作模版来声明我们的数据
继承的类型
实现继承:
表示一个类型派生于一个基类型,它拥有该基类型的所有成员字段和函数。在实现继
承中,派生类型采用基类型的每个西数的实现代码,除非在派生类型的定义中指定重写
某个函数的实现代码。 在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,这种类型的继承非常有用。
接口继承:
表示一个类型只继承了函数的签名,没有继承任何实现代码。 在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承
多重继承
一些语言(C++)支持所谓的“多重继承”,即一个类派生自多个类。使用多重继承的优点是
有争议的:一方面,毫无疑问,可 以使用多重继承编写非常复杂、但很紧凌的代码,。另一方面,使用多重实现继承的代码常常很难理解和调试。如前所述,简化健壮代码的编写工作是开发 C#的重要设计 目标。因比C#不支持多重实现继承。而C#允许类型派生自多个接一一多重接口继承。这说明,C#类可以派生自另一个类和任意多个接口。
实现继承
如果要声明派生自另一个类的一个类 就可以使用下面的语法:
 
class MyDerivedclass : MyBaseclass

//functions and data members here
  }
如果类(或 结构)也 派生 自接 口,则用逗号分隔列表中的基类和接口
基类敌人类(hp speed方法 ai move)
派生出来两个类
Boss类
Type1enemy 类
Type2enemy 类
This 和base 关键字
This (base )作用
1、IDE给提示
2、区分局部变量和字段
this可以访问当前类中定义的字段,属性和方法,有没有this都可以访问,有this可以让IDE-VS编译器给出提示,另外当方法的参数跟字段重名的时候,使用this可以表明访问的是类中的字段,base可以调用父类中的公有方法和字段,有没有base都可以访问,但是加上base.IED工具会给出提示,把所有可以调用的字段和方法罗列出来方便选择
虛方法
把一个基类函数声明为virtual,就可以在任何派生类中重写该函数:
class NBaseclass{
public virtual string VirtuaLMethod()(
return hethod is called in base class";
}
在派生类中重写另外一个函数时,要使用override 关键字显示声明
class MuDerivedClass:MyBaseclass{
public override strina VirtualMethod(){
return "Method is called in derivedclass.";
}
}
我们在子类里面重写虛函数之后,不管在哪里调用都是调用重写之后的方法
隐藏方法
如果签名相同的方法在基类和派生类中都进行了声明,但是该方法没有分别声明为virtual
和override,派生类就会隐藏基类方法。(要使用new关键字进行声明)
基类
class mybaseclass{
public int MuMethod(){
}
}
派生类(在派生类中把基类同名的方法隐藏掉了)
class MVDerivedClass:NyBaseclass{
public new vo1d MyNethod(){
}
}
抽象类
C#允许把类和西数声明为 abstracto,抽象类不能实例化,抽象类可以包含苦通函数和抽象函数,抽象西数就是只有函数定义没有西数体。显然抽象函数本身也是虚拟的virtual(只有函数定义,没有西数体实现)。
类是一个模板,那么抽象类就是一个不完整的模板,我们不能使用不完整的模板去构造对象。
abstract class Busloingt{
public abstract  decimal calculateHeatingCost ();
}
密封类和密封方法
C#允许许把类和方法声明为 sealed。对于类,这表示不能继承该类;对于方法表示不能重写该方法,
sealed Finalciass{
//etc
}
什么时候使用密封类和密封方法?
防止重写某些类导致代码混乱
商业原因
派生类(子类)的构造函数
1在子类中调用父类的默认构造函数(无参)(会先调用父类的,然后是子类的)
public class myderivedclass{
public myderivedclass():base(){
//do something
}
}
在这里:base()可以直接不写,因为默认会调用父类中的默认构造函数
2,调用有参数的构造函数
public class myderivedclass{
public myderivedclass(string name):base(name){
//do something
}
}
修饰符
修饰符,用来类型或者成员的关键字,修饰符可以指定方法的可见性
Public :同一程序集(DLL和EXE )中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员
Private :只有同一类或结构中的代码可以访问该类型或成员
Protected :只有同一类或结构或者此类的派生代码才可以访问该类型或成员
internal :同一程序集中的任何代码都可以访问该类型或成员,但代码不可以
Protected internal :在一程序集中Protected internal 体现的是internal的性质;在其它程序集中,Protected internal 体现的是protected 的性质
public 和private 修饰字段和方法的时候,表示该字段或者方法能不能通过对象去访问,只有public 的才可以通过对象访问,private (私有的)只能在类模版内部访问
Protected 保护的,当没有继承的时候,它的作用和private 是一样的,当有继承的时候,protected 表示可以被子类访问的字段或者方法
类的修饰符
Public class ……
class ……
前者可以在别的项目下访问,后者不行
其他修饰符
New
隐藏继承的成员
Abstract
使用abstract 修饰的类为抽象类,抽象类只能是其他的基类,不能与sealed 、static 一起使用
Abstract 可以修饰抽象类中的方法或属性,此时,方法和属性不能包含实现,且访问级别不能为私有
抽缘类不能被实例化。
Sealed
使用sealed修饰的类为密封类,密封类无法被继承,不能和abstract、static一起使用。当sealed用于方法或属性时,必须始终与override一起使用。
static
使用static修饰的类为静态类,静态类所有成员都必须是静态的,不能与abstract、 sealed一起使用。
Static 可以修饰方法、字段、属性或事件,始终通过类名而不是实例名称访问静态成员,静态字段只有一个副本
静态类不能被实例化。
const
使用const关键字来声明某个常量字段或常量局部变量,必须在声明常量时赋初值。不能与static一起使用,常量默认是static的,常量字段只有一个副本
readonly
使用readonly关键字来声明只读字段。
只读宇段可以在声明或构造西数中初始化,每个类或结构的实例都有一个独立的副本。
可以 static一起使用,声明静态只读字段。
静态只读字段可以在声明或静态构造两数中初始化,静态常量字段只有一个副本。
virtual
virtual 可以修饰方法、属性,索引器或事件声明,并使他们可以在派生类中被重写
默认情况下,方法是非虛拟的。不能重写非虚方法。
virtual修饰符不能与static、abstract、private或override修饰符一起使用。
override
要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虛实现,必须使用override修饰符。
重写的成员必须是virtual、abstract或override的。
I:https://www.cnblogs.com/zhouzl/archive/2019/04/13/10701476.html
定义和实现接口
定义接口(飞翔功能)
Public interface IElvHandler{
public void Fly();
}
Public class type1enemy :iflyhandler{
}
实现接口
USB接口,耳机接口。只提供了接口,没有提供实现,让其他开发商实现。
定义一个接口在语法上跟定义一个抽象类完全相同,但不允许提供接口中任何成员的实现方式,一般情况下,接口只能包含方法,属性,索引器和事件的声明。
接口不能有构造函数,也不能有字段,接口也不允许运算符重载。
 
接口定义中不允许声明成员的修饰符,接口成员都是公有的
派生的接口
接口可以彼此继承,其方式和类的继承方式相同
 
public interface A {
void Method1():
}
public interface B:A{
void Method2():
}
 
面向对象一编程题
集合类列表List
当我们有很多类型一样的数据的时候,前面我们一般使用数组来进行管理,但是这样有个缺点就是数组的大小是固定的。如果很多类型一样的数据,比如游戏得分,我们可以集合类来进行管理比如列表list很方便的添加数据,删除数据还有其他对数据的操作。
列表List的创建和使用
1,创建列表(列表可以存储任何类型的数据,在创建列表对象的时候首先要指定你要创建
的这个列表要存储什么类型的)(泛型)
List <int >  scoreList  =new list <int >();
new list <int >(){1,2,3}
new list<string>(){"one","two"}
var scorelist= new list <int >();
2.往列表中插入数据
scoreList.add (12);
scoreList.add (45);
3,如何取得列表中的数据?列表中的数据跟数组有点相似,索引从O开始,可以通过索引来访问
scoreList[0]//访问添加到列表中的第一个数据
 
关于列表的更多内容
1.列表内部数据是使用数组进行的存储,一个空的列表内部会有一个长度为0的数组,当给列表中添加元素的时候,列表的容量会扩大为4,如果添加第5个的时候,列表的大小会重新设置为8,如果添加第9个元素,列表容量会扩大为16,依次增加。当列表的中的容量发生改变的时候,它会创建一个新的数组,使用array.copy()方法将就数组中的元素复制到新数组中。为了节省时间,如果事先知道要存储的数据的个数,就可以利用列表的构造函数指定列表的容量大小,比如下面的
list<int> intlist=new list <int>(10);创建了一个初始容量为10的列表,当容量不够用的时候,每次都会按照原来容量的2倍进行扩容。
我们可以通过capacitycapacity=100;
2,注意容量和列表中元素个数的区别,容量是列表中用于存储数据的数组的长度通过capacity获取,列表中的元素是我们添加进去需要管理的数据,通过Count获取列表的遍历
遍历列表有两种方式:
1,for循环,遍历所有的索引,通过索引访问列表中的元素
for(int i=0;i<list.Count;i++){
//循环体list[i]
}
2.foreach遍历
foreach(int temp in list){ // 依次取得list中的每一个元素赋值给temp,并执行循环体
//循环体 temp
操作列表的属性和方法
1.Capacity获取容量大小
2.Add()方法添加元素
3.Inserto方法插入元素
4[index ]访问元素
5.count属性访问元素个数
6.RemoveAt()方法稻除指定位置的元泰
7.IndexOf()方法取得一个元素所在列表中的索引位置
LastndexOf()上面的方法是从前往后搜索,这个是从后往前搜索,搜索到满足条件的
就停止
上面的两个方法,如果没有找到指定元素就返回-1
8,Sor0对列表中是元素进行从小到大排序
泛型
泛型是什么?
通过参数化类型来实现在同一份代码上操作多种数据类型。利用"参数化类型"将类型抽象化,从而实现灵活的复用。
泛型类定义
定义一个范型类就是指的是,定义一个类,这个类中某些字段的类型是不确定的,这些类型可以在类构造的时候确定下来,举例:
创建一个类处理int类型和double类型的相加
class ClassA<T>{
private T a:
private T b:
 
}
public ClassA(T a,T b){
this.a = a ›this.b = b;
}
public T Get Sum(){
return a+""+b;
}
}
泛型方法
virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。
默认情况下,方法是非虛拟的。不能重写非虚方法。
virtual修饰符不能与static、abstract、private或override修饰符一起使用。
override
要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虛实现,必须使用override修饰符。
重写的成员必须是virtual、abstract或overrid的。
I:https://www.cnblogs.com/zhouzl/archive/2019/04/13/10701476.html
定义和实现接口
定义接口(飞翔功能)
public interface IElvHandler{
public void Fly();
}
定义范型方法就是定义一个方法,这个方法的参数的类型可以是不确定的,当调用这个方法的时候再去确定方法的参数的类型
publc statict T Getsum<T a,T b>{
return a+""+b;
}
GetSum<int>(23,12):
GetSum<double>(23.2,12):
使用泛型和索引器来实现一个我们自己的集合类MyList
有下面的方法和属性
1,capacity获取容量大小
2,add()方法添加元素
3,insert()方法插入元素
4,[index]访问元素(索引器)
5,count属性访问元素个数
6,removeat()方法移除指定位置的元素
7,indexof()方法取得一个元素所在列表中的索引位置
lastindexof()上面的方法是从前往后搜索,这个是从后往前搜索,搜索到满足条件的就停止
上面的两个方法,如果没有找到指定元素就返回-1

ℒฺℴฺνℯ̶ฺ归̶零̶⋆ 14:18:29
8,sort()对列表中是元素进行从小到大排序
索引器:通过[index]这种形式去访问数据,就是索引器

C#基础+面向对象学习相关推荐

  1. python 类和对象_Python零基础入门学习33:类与面向对象编程:类的继承

    注:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性. 本文字数约1300,阅读时间约为3分钟. Python面向对象编程 类的继承机制 如果一个类A继承自另一个类B,就把继承者类A称 ...

  2. 1. C++基础知识学习及其深入理解(面向对象部分还没学) -- 课程1完成

    C++基础知识学习到深入理解及其部分算法学习 一.基础知识   现在把 北京大学 程序实际与算法一 视频刷了一遍,记录自己不懂的知识,所以知识点记录很零碎.这里使用的运行环境为Code::blocks ...

  3. 零基础怎么学习Java?

    最近几年,有很多小伙伴都比较关注"零基础怎么学习Java?"这个问题,因为很多小伙伴都是从其他行业转型来参加java培训学习的,都很担心自己学不会,那么来看看下面的详细介绍吧. 零 ...

  4. 零基础全方位学习java的方法

    java技术岗是一个就业率非常高的岗位,因此有很多人都想要学习java技术,其中不乏一些零基础同学,零基础小白都不清楚自己该如何学习java,那么下面小编就为大家详细的介绍一下零基础全方位学习java ...

  5. 零基础快速学习Java技术的方法整理

    在学习java技术这条道路上,有很多都是零基础学员,他们对于java的学习有着很多的不解,不知怎么学习也不知道如何下手,其实Java编程涉及到的知识点还是非常多的,我们需要制定java学习路线图这样才 ...

  6. python零基础入门教程视频下载-Python零基础入门学习视频教程全42集,资源教程下载...

    课程名称 Python零基础入门学习视频教程全42集,资源教程下载 课程目录 001我和Python的第一次亲密接触 002用Python设计第一个游戏 003小插曲之变量和字符串 004改进我们的小 ...

  7. python基础教程视频教程百度云-Python零基础入门学习视频教程全42集百度云网盘下载...

    课程简介 Python零基础入门学习视频教程全42集百度云网盘下载 课程目录 042魔法方法:算术运算 041魔法方法:构造和析构 040类和对象:一些相关的BIF 039类和对象拾遗 038类和对象 ...

  8. python新手教程 从零开始-Python零基础从零开始学习Python十分钟快速入门

    原标题:Python零基础从零开始学习Python十分钟快速入门 学习Python的,都知道Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python是一种动态解释型的 ...

  9. python语言自学-零基础小白学习Python编程语言的正确姿势(纯干货)

    原标题:零基础小白学习Python编程语言的正确姿势(纯干货) 敢问有哪种编程语言集简洁.优雅.简单.全能于一身?Python绝对算的上是一个.举个例子,比如完成同一个任务,C语言需要写1000行代码 ...

最新文章

  1. 没有找到mysql。sock_linux系统安装mysql数据库
  2. 原生js实现轮播图实例教程
  3. 【C语言简单说】八:分支结构之if(1)
  4. s3c6410 uboot代码分析《二》
  5. 基于opencv的文本检测器
  6. matlab costas环,MATLAB写COSTAS环的问题。
  7. 大型网站的架构设计与演进
  8. 64位win7连接32位xp的共享打印机HP Laserjet P1008
  9. 简单的三步教你下载PyCharm汉化插件,让你学习Python事功半倍
  10. ESP-Tuning Tool 使用手册
  11. OpenKG开源系列 | 海洋鱼类百科知识图谱(浙江大学)
  12. javaweb项目实训总结_JAVA WEB实训总结
  13. 吴琛:智慧工地——履约考勤系统的应用实践
  14. linux 之pvs磁盘报错
  15. 计算机网络软件系统是什么结构,计算机软件系统的组成是什么?
  16. 4行代码 超级简单 html/css 实现平移动画
  17. protobuf repeated string 赋值
  18. CAS 单点登录/登出 系统
  19. c语言从键盘输入5阶方阵,输入5×5阶的矩阵,编程实现: (1)求两条对角线上的各元素之和....
  20. 知识点滴 - X射线和伽马射线有什么区别?

热门文章

  1. 微信分享次数统计、微信公众号分享关注统计
  2. 异国他乡-写在即将离开芬兰的早晨
  3. working directory is not part of a module
  4. Codeforces Round #550 (Div. 3) C.Two Shuffled Sequences
  5. 正则匹配英文括号( 中文括号【 里面的内容 封装工具类
  6. 影院体验系列_中国电影博物馆IMAX GT厅_《失控玩家》
  7. 过拟合与欠拟合的生动理解
  8. 《所谓情商高,就是会说话》读书笔记
  9. html制作网站 知乎,做短视频运营看那些网站(推荐这些短视频素材网站)
  10. install Wine + 迅雷 in Fedora 31