1、运算符重写operator
运算符:+ - * / % == += > <
方法重载:方法名一样通过参数的改变,使同名方法完成不同的功能
重载:用一样的名字实现不同的功能
Student s1=new Student(20,"张三","中原区");
Student s2=new Student(20,"张三","中原区");
Console.WriteLine(s1==s2);//一样的参数结果却返回False,因为此时比较的是地址
引用类型存储在栈中的是指向堆中的地址,虽然最终指向的内容一样但地址不是同一个地址,在判断s1,s2是否相等时结果为False
如果想让两对象相等需要他们的地址相同,这时就需要进行运算符重载。
static void Main(string[] args)//主函数内容
{
//对==进行运算符重载
Student s1=new Student(20,"张三","中原区");
Student s2=new Student(20,"张三","中原区");
Console.WriteLine(s1==s2);//一样的参数结果却返回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.age==s2.age&&s2.name==s1.name&&s1.address==s2.address)
{
return true;
}
else
{
return false;
}
}
public static bool operator !=(Student s1, Student s2)//定义相对应的运算符重载
{
bool result = s1==s2;
return !result;
/*或者
bool result = !(s1==s2);
return result;
*/
}
}
2、泛型类与动态类型(dynamic)
泛型是一种让代码在编写时不确定具体类型,而在使用时再确定类型的技术。它就像给类型(比如 String、Integer)准备了一个“占位符”或“类型参数”。通过泛型可以对不同的数据类型进行相同的操作。
泛型类中可以声明一般成员。
动态类型 dynamic,直到程序运行时再确定具体的数据类型,在编译时先声明为动态类型。
internal class Program
{
static void Main(string[] args)
{//泛型类
//var a=10; 匿名var来看是什么类型
//FanXing<int> c1 = new FanXing<int>(10,20);//泛型类进行实例化时需要在类名后加上具体要用的数据类型
//FanXing<double> c2 = new FanXing<double >(15.6,20.6);//泛型类进行实例化时需要在类名后加上具体要用的数据类型
//c1.Add();
//c2.Add();
FanXing<double, int> c2 = new FanXing<double, int>(15.6, 20);//泛型输出多种类型实例化时,会按照泛型定义的顺序来规定后面的参中对应的数据类型的值
c2.Add();
Chifan<int, string, DateTime, double, string> cf1 = new Chifan<int, string,
DateTime, double, string>(20,"张三",DateTime.Now,14.5,"鸡腿饭");
cf1.Show();
}
}
public class FanXing<T,S>
{
//定义泛型字段
public T a;
public S b;
//定义一个a+b的方法,使用构造函数对参数赋值,参数类型与泛型一致
public FanXing(T a, S b)
{
this.a=a;
this.b=b;
}
public void Add()
{
//Console.WriteLine(a + b);//不知道参数的类型,无法相加
//只有在实例化后才能知道参数的类型
//动态类型 dynamic
//直到程序运行时再确定具体的数据类型,在编译时先声明为动态类型
dynamic a = this.a;
dynamic b = this.b;
Console.WriteLine(a+b);
}
}
3、泛型方法
使用泛型方法时与泛型类的使用方法类似。使用泛型类时必须在类名后跟上数据类型,但在使用泛型方法时允许不加<数据类型>。调用时在方法名后加上<数据类型>可以限定参数类型,所以在使用泛型方法时一定要注意指明数据类型。
在一般类中也可以声明泛型方法。
internal class Program
{
static void Main(string[] args)
{
//泛型方法
MyClass m1 = new MyClass();
m1.Add<int>(20,30);
//使用泛型方法时与泛型类的使用方法类似
//调用时在方法名后加上<数据类型>可以限定参数类型
}
}
public class MyClass
{
public void Add<T>(T A,T B)
{//在方法中做加法运算
Console.WriteLine((dynamic)A+B);
}
}
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);
动态数组中的常用方法 API
1.添加数据
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.RemoveAt
list2.RemoveAt(2);//移除指定下标处的元素
10.RemoveRange()
list2.RemoveRange(3,6);//从下标3的元素开始移除6个元素,第一个元素是下标,第二个元素是个数
11.反转
list2.Reverse();
将数组中元素从后往前排列
12.Sort()排序
list2.Sort();
字符串的排列顺序:符号<数字<字母<中文
中文排序时:拼音<音调<笔顺

361

被折叠的 条评论
为什么被折叠?



