-
装箱:将值类型赋值给引用类型 拆箱:将引用类型强制转换成值类型查看全部
-
事件 1、发布者和订阅者 通知事件发生的,就是发布者; 对某个事件关注,就是订阅者。 2、事件触发和注册 事件发生时,会通知所有关注该事件的订阅者。 想在事件发生时被通知,必须注册以表示关注。 3、用程序语言解释 事件发生时,通知订阅者,就是调用订阅者的注册函数。注册,就是告诉发布者调用哪一个注册函数。 4、事件声明 delegate void Handler(); public event Handler NewDog;//Handler 是委托类型,NewDog为事件名 NewDog是一个成员,并且会被隐式自动初始化为null 5、事件订阅 NewDog + = 方法 //关注 NewDog - = 方法 //取消关注 方法可以是,实例方法,静态方法,匿名方法、Lambda表达式 6、事件触发 if(NewDog!=null){ NewDog(); } 7、事件可以理解为一种封装的受限制的委托,委托当中包含着订阅者的注册函数,事件触发就是调阅委托当中的回调函数。查看全部
-
多态:虚函数virtual基类,override派生类重写基类的字段或函数 public class Pet(){ virtual public speak(); } public class Dog:Pet(){ public Dog(string name){ Name=name; } override public speak(Name+"wang"); } public class Dog:Pet(string name){ public Dog(string name){ Name=name; } override public speak(Name+"miao"); } main(){ Pet dog=new Dog(); //用基类引用,new派生类 Pet cat=new Cat(); dog.speak(); cat.speak(); } main(){ Pet[] pets=new Pet[]{new Dog("Jack"),new Cat("Tom") } for(int i=0;i<pets.length;i++){ pets[i],speak(); } }查看全部
-
Lambda表达式 1、什么是匿名方法 delegate void ActCute(); ActCute del; del=delegate(){//方法的具体内容};//声明一个匿名方法 2、Lambda表达式 del=delegate(){}; del=()=>{···};查看全部
-
委托、事件和lambda表达式 1、委托 就是持有一个或者多个方法的对象并且可以执行该对象。 2、声明委托 用delegate声明 例如:声明一个卖萌的方法 delegate void ActCute(); 3、定义委托类型的对象 既然委托是一种类型,就可以定义该类型的对象。例如ActCute actCute; 4、给委托对象赋值 例如; class Dog{ public void WagTai(){···} } actCute=dog.WagTail; 5、使用委托类型 想调用函数一样使用委托类型。 actCute();查看全部
-
1、集合 就是一种存放多种数据的复杂类型。 2、基本集合类型 动态数组 ArrayList 列表 :List 栈 Stack 字典 Dictionary 队列 Queue 3、动态数组ArrayList 初始化,可以不指定大小 获取长度,使用Count属性 添加是使用Add 删除用Remove,RemoveAt 访问[index] 4、List<T> ArrayList是类型不安全,而且有装箱拆箱的性能问题,所以有了List<T>查看全部
-
1、字典Dictionary<TKey,Tvalue> 字典容器存储的是一系列的键值对,没个值对应一个唯一的键。键的意义在于,我们可以通过键相对高效的访问到值。 2、字典操作 数量 Count 添加 Add(key,value) 删除 Remove 访问 [key] 3、栈 出栈 Pop 入栈 Push 获取栈顶元素 Peek 4、队列 先进先出容器。 出队 Dequeue 入队 Enqueue查看全部
-
封装,多态,继承查看全部
-
泛型接口 1、泛型接口允许我们将接口成员的参数和返回类型设置为泛型参数的接口。 2、语法 interface Imyself<T>{//可以写多个泛型参数 T MySELF(T self); } 3、实现泛型接口语法 class A<T>:Imyself<A>{ public A Myself(A self);//类型参数可以是实现类本身或者其他类型 } 4、代码示例 interface ILearn<A>{ void Act(A cmd);//学习技能的接口 } class Labrador:Dog,ILearn<Sit>{ public void Act(Sit cmd); }查看全部
-
约束 1、什么是约束 约束就是控制泛型这匹烈马的缰绳!缩小泛型参数的范围(无论多么泛泛,总有一个范围,范围越小越好控制) 2、约束的意义 只有添加了约束,才能调用泛型参数中(比如T)的方法。 对泛型类和方法都可添加约束。 3、约束的类型 类名 ——该类或者继承该类的类 class ——任何类 struct ——任何值 接口名 ——该接口类型或任何实现该接口的类型 new() ——带有无參共有构造函数的类 4、约束叠加规则(这三个约束可以任意存在) A、主约束,只能有一个(类名,class,struct) B、接口约束,可以有任意多个 C、构造约束 5、约束例子 void Cage<T> where T:Pet,IClibTree,new() {···}查看全部
-
泛型方法 1、什么是泛型方法:就是方法的模型,给定具体的类型,就可以实例化出一个操作该类型的具体方法。 注意:泛型类中可以有泛型方法,普通类中也可以有泛型方法。 2、泛型方法语法 例如: class Dog{ void DogIsHappy<T>(T target){//普通类中的泛型方法 ··· } }查看全部
-
泛型 1、什么是泛型类 泛型类就是一个模子,转入类型的材料,可以塑造出想要的产品。 2、语法 class Cage<T>//这是一个笼子类,这是一个泛型类,类名后加上一对<>,加上一个泛型参数(类类型参数), { T[] petArray; public void PutIn(T pet){···} public T TakeOut(int index){···}//T就是一个占位符 } //实例化 var dogCage=new Cage<Dog>();//得到狗狗笼子 var catCage=new Cage<Cat>();//得到猫咪笼子 3、为什么需要泛型 用基类或者公共的接口,甚至是所有类的基类object,也可以实现一个Cage类,但是类型态宽泛,需要显示转换类型,并且判断真是类型是什么。 4、泛型使用 声明一个泛型类->引用泛型->构造实例 class Cage<t>{···} class Cage<Dog>{···} dogCage=new Cage<Dog>;查看全部
-
重载运算符 1、什么是重载运算符 利用现有的(不能创造新的运算符)某种运算符,针对自定义类(预定义类型和现有运算符的运算含义是确定的)或者结构,定义某种运算符(比如公狗狗+母狗狗=新生狗狗)。 2、重载运算符的原因 利用现有运算符,简化自定义类型的操作。做好是,该运算符和该操作,具有一定相关性。 3、语法细节 例如公狗狗+母狗狗=新生狗狗 public static Dog operator +(Dog male,Dog female) { ··· } 4、那些运算符可以重载 一元运算符:+、-、!、~、++、- -、true、false(操作数必须是类和结构) 二元运算符:+、-、*、%、&、|!、^、<<、>>、= =、!=、>、<、>=、<=(两个操作数至少有一个表示类或者结构) 不能重载:=、&&、||、[](索引操作)、()等 5、重载运算符不能做什么 创造新运算符 改变运算符语法 重定义运算符如何处理预定义类型 改变运算符的优先级和结合性 6、重在运算符举例 ··· public void ShowAge() { Console.WriteLine("Age="+_age); } ··· //重载自增操作,针对宠物的年龄 public static Pet opertor ++(Pet pet)//返回值为Pet类型,参数为宠物自身。所有的重载方法都需要public static修饰 { ++pet._age; return pet; } ··· Dog dog=new Dog("Jack"); dog._age=2; dog++; dog.ShowAge();查看全部
-
自定义转换 1、概念 为自己的类定义和结构显示和隐式转换 2、为什么需要自定义转换 使自己的结构和类型可以变成一个预期相关的类型(比如我想将我家的狗狗转化为猫咪),并且使这种转化更加简单。 3、隐式转换语法 注意 public static implicit operator Dog(Cat cat)//implecit指定为隐式转换,operator指定为转换,参数为需要转化的类型,operator后是目标类型 { ··· } 4、显示转换 public static explicit operator Cat(Dog dog) 5、转化实例 public static implicit operator Cat(Dog dog)//将狗狗转化为猫咪 { return new Cat(dog.name); } //将猫咪转化为狗狗 public static explicit opterator Dog(Cat cat)//显示转换 { return new Dog("Tom"); } ··· Dog dog=new Dog("Jack"); dog.Speak(); Cat cat=dog; cat.Spesk(); Dog dog2=(Dog)cat; dog2.Speak();查看全部
-
装箱和拆箱 1、装箱:根据值类型的值,在堆上创建一个完整的引用类型对象,并返回对象的引用,是一种隐式转换(语言自动完成)。 2、为什么要装箱 有时候需要将值类型转化为引用类型(比如object)来进行统一的操作(比如作为函数的参数)和统一的存储(比如object[])。 3、装箱简单实例 int i=3; object oi=null; oi=i;//发生装箱,原来的int保持不变,创建了一个新的对象,该对象在堆当中。需要性能消耗的。 4、装箱的本质 就是在对上创建了一个引用类型的副本,新创建的引用类型和原来的值类型相互独立。 相互独立代码验证: int i=3; object oi=i;//发生装箱 Console.WriteLine("i="+i+",oi="+oi.ToString);//输出为i=3,oi=3 oi=10; i=7; Console.WriteLine("i="+i+",oi="+oi.ToString);//输出为i=7,oi=10 说明两者相互独立 5、拆箱 将装箱后的对象转化回值类型的过程,是一种显示转换(需要手动干预)。 6、拆箱实例 in i=3; object oi=i;//装箱 int j=(int)oi;//拆箱查看全部
举报
0/150
提交
取消