1.接口(将类的设计内容进行实现;类似与抽象类)(接口类似与模板)
1.格式:修饰符 interface 接口名称:接口列表{接口内容}
(其中接口列表是指包含多个接口)
2.规定 1.接口的成员是抽象的
2.为不同的类提供通用的功能
3.接口成员包括 方法、属性、索引器、事件,不包含字段(成员变量)
4.继承接口的所有非抽象类都必须实现接口的所有成员
5.接口不能被实例化,只能被类或者是结构所继承
6.接口本身也可以被继承,并且支持多重继承,一对多的继承
7.当继承接口的类采用显性方式实现接口成员时,只能采用接口引用访问类中实现的接口成员。(下例子)
class Program
{
public interface IA
{
void FunA();
}
public interface IB
{
void FunB();
}
public interface IC : IA ,IB
{
void FunC();
}
}
class A : IC
{
public void FunA(){ } //隐性实现:格式:public 接口里的方法 {}
void IC.FunC() { Console.WriteLine("FunC");} //显性实现:格式:接口名字 接口里的方法{}
public void FunB(){ Console.WriteLine("FunB"); } //IC下的成员的继承方法里的成员只能用隐性实现
}
8.只有sealed和abstract不能使用,其他5个关键字都可以使用
9.抽象方法互相继承不同实现
10.非抽象类继承接口实现
3.接口引用(概念:用接口变量对继承该接口类的对象实例;作用:对于显性实现必须用接口引用才能调用接口成员)
static void Main(string[] args)
{
A a = new A();
a.FunA(); //该类为隐性实现,可直接实例化方法在调用
a.FunB();
IC ic = a; //该类为显性实现,必须先将继承改接口的对象实例,然后才能将其实例化
ic.FunC();
}
4.系统自带的接口:1.IComparble(用于排序) 2.IComparer(用于比较两个对象) 3.IEumerable(链表都是继承于它)
5.泛型接口:
public interface ID<T>
{
void FunD(T x,T y);
}
class A : ID<int>
{
public void FunD(int x, int y) { } //隐性实现泛型接口
void ID<int>.FunD(int x, int y) { } //显性实现泛型接口
}
2.结构(关键字struct)(具体结构如下)
public struct(其成员不能被初始化)/class(其成员可以被初始化) Infor
{
public string name; //结构体的变量不能初始化
public byte age;
public string rexual;
public string nation;
public Infor(string name, byte age, string rexual, string nation)
{
this.name = name; //构造函数的变量可以初始化
this.age = age;
this.rexual = rexual;
this.nation = nation;
}
}
1.格式:修饰符 struct 名称
2.规定:1.结构不能被继承,所以不能用抽象(abstract),密封(sealed),保护(protected)
2.结构体里的变量不可以被初始化;构造函数里的值可以初始化
3.struct属于值类型;class属于引用类型
4.结构类实例化可以砽new
3.泛型结构:1.格式:修饰符 struct 名称<T>{内容;}
3.泛型委托和泛型约束
(1).泛型委托
//委托
static void Main(string[] args)
{
Program pro = new Program();
EventDele eventDele = new EventDele(pro.Fun);
eventDele("Fun");
}
void Fun(string str) { Console.WriteLine(str); }
//泛型委托
static void Main(string[] args)
{
Program pro = new Program();
_EventDele<int> _eventDele = new _EventDele<int>(pro._Fun);
_eventDele(5);
}
int _Fun(int str) { Console.WriteLine(str); return 0; }
(2).泛型约束
1.格式:类修饰符 class 泛型类名称<类型参数表> where 类型参数名称:约束{ 类体;}
2.基类约束:class A<T> where T : Program //基类 { }
3.值类型和引用类型约束 struct class
1.class A1<T> where T : struct//值类 { }
2.class A2<T> where T : class//引用类 { }
4.接口约束:class A3<T> where T : IComparable //系统自带(自创)接口 { }
5.构造函数约束 new() : class A4<T> where T : new()//关键符号 { }
6.混合约束:要求:基类约束不能和值/引用类型同时使用,其他的都可以
class A5<T1,T2> where T1 : struct,IList<T1> where T2 : class,new() {}
4.多线程的调用与挂起
1.创建线程
2.实例化创建
3.启动线程
4.销毁线程
5.线程消息状态
6.线程挂起
7.学习一步线程,线程池,线程=>(就像一个人运作一个线程)
8.unity不支持多线程,其里面的线程原理就好比(一个人运作多个线程)
class Program
{
Thread Thread_TestTimer;
Thread Thread_LoopPrintf;
Thread Thread_OnePrintf;
int Sec = 0;
static void Main(string[] args)
{
//异步线程 线程池 线程
Program pro = new Program();
pro.Thread_TestTimer = new Thread(new ThreadStart(pro.Thread1));
pro.Thread_TestTimer.Start();
//while (true)
//{
// pro.Thread3();
// Thread.Sleep(5000);
//}
pro.Thread_LoopPrintf = new Thread(new ThreadStart(pro.Thread2));
pro.Thread_LoopPrintf.Start();
//pro.Thread_OnePrintf = new Thread(new ThreadStart(pro.Thread2));
//pro.Thread_OnePrintf.Start();
}
void Thread1()
{
while (true)
{
Thread.Sleep(500);
++Sec;
Console.WriteLine("辅助线程:计时每隔一秒更新一次,当前秒数计时:{0}",Sec);
if (Thread_TestTimer.IsAlive && Sec > 20)
Thread_TestTimer.Abort();
}
}
void Thread2()
{
while (true)
{
Thread.Sleep(2000);
Console.WriteLine("每隔两秒打印该文本一次");
}
}
void Thread3()
{
++Sec;
Console.WriteLine("主线程:计时每隔一秒更新一次,当前秒数计时:{0}", Sec);
}
}