1、运算符重写operator运算符 - * / % 方法重载方法名一样通过参数的改变使同名方法完成不同的功能重载用一样的名字实现不同的功能Student s1new Student(20,张三,中原区); Student s2new Student(20,张三,中原区); Console.WriteLine(s1s2);//一样的参数结果却返回False因为此时比较的是地址引用类型存储在栈中的是指向堆中的地址虽然最终指向的内容一样但地址不是同一个地址在判断s1,s2是否相等时结果为False如果想让两对象相等需要他们的地址相同,这时就需要进行运算符重载。static void Main(string[] args)//主函数内容 { //对进行运算符重载 Student s1new Student(20,张三,中原区); Student s2new Student(20,张三,中原区); Console.WriteLine(s1s2);//一样的参数结果却返回False因为此时比较的是地址 //引用类型存储在栈中的是指向堆中的地址虽然最终指向的内容一样但地址不是同一个地址在默认情况下判断S1s2是否相等时结果为False Console.WriteLine(s1 ! s2); }public class Student//类中内容 { public int age; public string name; public string address; public Student(int age,string name,string address) { this.age age; this.name name; this.address address; } public static bool operator (Student s1,Student s2)//定义一个运算符重载 { if (s1.ages2.ages2.names1.names1.addresss2.address) { return true; } else { return false; } } public static bool operator !(Student s1, Student s2)//定义相对应的运算符重载 { bool result s1s2; return !result; /*或者 bool result !(s1s2); return result; */ } }2、泛型类与动态类型(dynamic)泛型是一种让代码在编写时不确定具体类型而在使用时再确定类型的技术。它就像给类型比如 String、Integer准备了一个“占位符”或“类型参数”。通过泛型可以对不同的数据类型进行相同的操作。泛型类中可以声明一般成员。动态类型 dynamic直到程序运行时再确定具体的数据类型在编译时先声明为动态类型。internal class Program { static void Main(string[] args) {//泛型类 //var a10; 匿名var来看是什么类型 //FanXingint c1 new FanXingint(10,20);//泛型类进行实例化时需要在类名后加上具体要用的数据类型 //FanXingdouble c2 new FanXingdouble (15.6,20.6);//泛型类进行实例化时需要在类名后加上具体要用的数据类型 //c1.Add(); //c2.Add(); FanXingdouble, int c2 new FanXingdouble, int(15.6, 20);//泛型输出多种类型实例化时会按照泛型定义的顺序来规定后面的参中对应的数据类型的值 c2.Add(); Chifanint, string, DateTime, double, string cf1 new Chifanint, string, DateTime, double, string(20,张三,DateTime.Now,14.5,鸡腿饭); cf1.Show(); } } public class FanXingT,S { //定义泛型字段 public T a; public S b; //定义一个ab的方法使用构造函数对参数赋值参数类型与泛型一致 public FanXing(T a, S b) { this.aa; this.bb; } public void Add() { //Console.WriteLine(a b);//不知道参数的类型无法相加 //只有在实例化后才能知道参数的类型 //动态类型 dynamic //直到程序运行时再确定具体的数据类型在编译时先声明为动态类型 dynamic a this.a; dynamic b this.b; Console.WriteLine(ab); } }3、泛型方法使用泛型方法时与泛型类的使用方法类似。使用泛型类时必须在类名后跟上数据类型但在使用泛型方法时允许不加数据类型。调用时在方法名后加上数据类型可以限定参数类型所以在使用泛型方法时一定要注意指明数据类型。在一般类中也可以声明泛型方法。internal class Program { static void Main(string[] args) { //泛型方法 MyClass m1 new MyClass(); m1.Addint(20,30); //使用泛型方法时与泛型类的使用方法类似 //调用时在方法名后加上数据类型可以限定参数类型 } } public class MyClass { public void AddT(T A,T B) {//在方法中做加法运算 Console.WriteLine((dynamic)AB); } }4.动态数组/数组列表//定义一个数组 int[] a1 { 1, 2, 3 }; int[] a2 new int[20]; //类型固定长度固定当我们定义一个数组时数组的类型和长度是固定的无法满足多种需求这时就该使用动态数组。动态数组的两种定义方法//动态数组 数组列表 ArrayList list1 new ArrayList(); ArrayList list2 new ArrayList() { 10,20.6,zhangsasn,a,true,30.3F}; //在动态数组中获取数组长度不是使用Length属性而是count获取元素数量 Console.WriteLine(list2.Count);动态数组中的常用方法 API1.添加数据list2.Add(10);//添加完的数据会默认放在最后2.清除数据list2.Clear();//清除列表中所有元素3.插入数据list2.Insert(0,插入的元素);//两个参数第一个参数是插入的位置第二个是需要插入的数据4.查找数据是否存在list2.Contains(10); Console.WriteLine(list2.Contains(10));//返回bool类型的结果在指定的单个长字符串中找到其中特定包含的子字符串结果是可以找到的。在数组列表中要找到某个长字符串元素中的字字符串是无法找到的。5.查找数组中元素的位置list2.IndexOf(10); Console.WriteLine(list2.IndexOf(10));//找的到的元素会返回元素的下标找不到的元素会返回-1。如果数组中有多个相同的数据那么只会返回第一个找到的元素的下标6.从末尾查找数组中元素的位置list2.LastIndexOf(10); Console.WriteLine(list2.LastIndexOf(10));7.GetRange返回一个新的数组列表ArrayList list3 list2.GetRange(0,0);复制数组列表两个参数分别为开始下标和元素个数。list2.GetRange(0,list2.Count)用来复制全部数组8.Remove移除元素list2.Remove(null);//移除空或者不存在的元素等于不移除 list2.Remove(张三);移除括号中指定的元素后面的元素自动补齐9.RemoveAtlist2.RemoveAt(2);//移除指定下标处的元素 10.RemoveRange list2.RemoveRange(3,6);//从下标3的元素开始移除6个元素第一个元素是下标第二个元素是个数11.反转list2.Reverse();将数组中元素从后往前排列12.Sort()排序list2.Sort();字符串的排列顺序符号数字字母中文中文排序时拼音音调笔顺