【SIKI】_04_C#中级教程 (2015版)笔记

来源:互联网 发布:妮维雅女士护肤品知乎 编辑:程序博客网 时间:2024/04/24 07:21
IKIC#中级教程 (2015版)
正常模式指的是不会影响程序的正常运行。
1,在VS中我们使用Console.Write(或者WriteLine)方法向控制台输出变量的值,通过这个我们可以查看变量的值是否符合我们的预期来调试错误。
2,在Unity中我们使用Debug.Log("") Debug.LogError("") Debug.LogWarn(""),向unity的Console窗口输出信息,帮助我们调试错误。

Sytem.SystemException类的预定义的异常类
System.IO.IOException处理 I/O 错误。
System.IndexOutOfRangeException处理当方法指向超出范围的数组索引时生成的错误。System.ArrayTypeMismatchException处理当数组类型不匹配时生成的错误。System.NullReferenceException处理当依从一个空对象时生成的错误。System.DivideByZeroException处理当除以零时生成的错误。
System.InvalidCastException处理在类型转换期间生成的错误。
System.OutOfMemoryException处理空闲内存不足生成的错误。
System.StackOverflowException处理栈溢出生成的错误。

try
while(true)
{
try{ num1 = Convert.ToInt32(Console.ReadLine());
break;
}catch{
Console.writeLine("你输入的不是一个整数,请重新输入");
}
//break;//把break放在这里的话,不管发布发生异常都会执行,因为try对异常进行了处理
}

创建用户自定义异常
using System;
namespace UserDefinedException
{
class TestTemperature
{
static void Main(string[] args)
{
Temperature temp = new Temperature();
try
{
temp.showTemp();
}
catch(TempIsZeroException e)
{
Console.WriteLine("TempIsZeroException: {0}", e.Message);
}
Console.ReadKey();
}
}
}
public class TempIsZeroException: ApplicationException
{
public TempIsZeroException(string message): base(message)
{
}
}
public class Temperature
{
int temperature = 0;
public void showTemp()
{
if(temperature == 0)
{
throw (new TempIsZeroException("Zero Temperature found"));
}
else
{
Console.WriteLine("Temperature: {0}", temperature);
}
}
}

对象
构造函数
使用我们自定义的类声明的变量也叫做对象,这个过程也叫做实例化。
ClassName myClass = new ClassName();
其中ClassName是我们定义的类的名字,myClass是我们声明的变量(对象)的名字,后面的new是一个关键字,使用new 加上类型名()表示对该对象进行构造,如果不进行构造的话,这个对象是无法使用的。

析构函数
class Line { private double length; // 线条的长度 public Line() // 构造函数 { Console.WriteLine("对象已创建"); }~Line()//析构函数 { Console.WriteLine("对象已删除"); }

成员函数和封装
  • Public:所有对象都可以访问;
  • Private:对象本身在对象内部可以访问;
  • Protected:只有该类对象及其子类对象可以访问
  • Internal:同一个程序集的对象可以访问;
  • Protected internal:一个程序集内的对象,或者该类对象及其子类可以访问;

我们习惯上把字段设置为私有的,这样外界不能修改字段的值,然后我们可以通过定义属性来设置和取得字段中的值。
private int age;
public int Age{//习惯上属性大写 字段小写
  set{
  if(value<0)return;
  age = value;
  }
  get{
  return age;
  }
}

静态成员
 static

匿名类型
我们创建变量(对象的时候),必须指定类型,其实我们也可以不去指定类型,这个就是匿名类型,我们可以使用var声明一个匿名类型。
使用var声明的匿名类型,当初始化的时候,这个变量的类型就被确定下来,并且以后不可以修改。
 var  var1 = 34;

继承
虚方法
把一个基类函数声明为virtual,就可以在任何派生类中重写该函数:
  class MyBaseClass{
  public virtual string VirtualMethod(){
  return "Method is called in base class";
  }
  }
在派生类中重写另外一个函数时,要使用override关键字显示声明
  class MyDerivedClass:MyBaseClass{ 
  public override string VirtualMethod(){
  return "Method is called in derivedclass.";
  }
  }

隐藏方法
如果签名相同的方法在基类和派生类中都进行了声明,但是该方法没有分别声明为virtual和override,派生类就会隐藏基类方法。(要使用new关键字进行声明)
基类
class MyBaseClass{
  public int MyMethod(){
  }
}
派生类(在派生类中把基类同名的方法隐藏掉了)
class MyDerivedClass :MyBaseClass{
  public new void MyMethod()        {
          }   
}

重载:同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。而返回值类型不同是不能构成重载的。
重写:继承时发生,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的 
        例如:基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写.
隐藏:基类方法不做申明(默认为非虚方法),在派生类中使用new声明此方法的隐藏。
重载时,根据参数选择调用的方法;
重写时,访问父类子类皆调用子类的重写方法;
隐藏时,访问父类则调用父类的方法,子类子类的方法。

this和base关键字

C#允许把类和方法声明为sealed。 对于类 ,这表示不能继承该类;对于方法表示不能重写该方法。

定义接口(飞翔功能)
  public interface IFlyHandler{
  public void Fly();
  }
实现接口
  public class Type1Enemy:IFlyHandler{
  }
定义一个接口在语法上跟定义一个抽象类完全相同,但不允许提供接口中任何成员的实现方式,一般情况下,接口只能包含方法,属性,索引器和事件的声明。
接口不能有构造函数,也不能有字段,接口也不允许运算符重载。
接口定义中不允许声明成员的修饰符,接口成员都是公有的

抽象基类与接口,共性与个性的选择!
C#中的抽象基类(AbstractClass)和接口(Interface)都实现了面向对象中的继承机制,它们通过定义抽象方法匀实现了对继承类的功能上的约束,那么在如何在恰当的场景选择恰当的继承机制是我们在设计中经常会遇到的问题,我们先来对比两者之间的区别与联系。
相同点
  • 都可以被继承。
  • 本身都不能被实例化
不同点
  • 抽象类是一个不完整的类,需要进一步细化;而接口只是一个行为上的规范。
  • 抽象基类不能实现多继承,而接口可以实现多继承。
  • 抽象基类可以定义字段、属性、包含有实现的方法。接口可以定义字段、索引器、事件但不能定义字段和包含实现的方法。  

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,如何取得列表中的数据?列表中的数据跟数组有点相似,索引从0开始 ,可以通过索引来访问
  scoreList[0] //访问添加到列表中的第一个数据

使用泛型和索引器来实现一个我们自己的集合类MyList
1,Capacity获取容量大小
2,Add()方法添加元素
3,Insert()方法插入元素
4,[index]访问元素(索引器)
5,Count属性访问元素个数
6,RemoveAt()方法移除指定位置的元素
7,IndexOf()方法取得一个元素所在列表中的索引位置
   LastIndexOf()上面的方法是从前往后搜索,这个是从后往前搜索,搜索到满足条件的就停止
  上面的两个方法,如果没有找到指定元素就返回-1
8,Sort()对列表中是元素进行从小到大排序
原创粉丝点击