-
访问修饰符
1. public:(公有的)任何类都可以访问
2. private:(私有的)当前类内部可以访问
3. protected:(受保护的)当前类以及继承他的子类可访问
4. internal:(内部的)只限于本项目内访问
5. protected internal:(内部保护访问)只能本项目内部或者子类访问,其他类不可访问
-
参数修饰符
1. 无修饰符:如一个参数无参数修饰符标记,那么他将按值进行传递,这意味着被调用的方法收到原始数据的一份副本。
2. out:
(1)输出参数由被调用的方法赋值,因此按引用传递。如果被调用的方法没有给输出参数赋值,就会出现编译错误。调用者仅使用一次方法调用就能获得多个返回值。
(2) 如在一个方法中返回多个类型相同的值的时候,可以考虑返回一个数组。但是,如返回多个类型不同的值得时候可以使用该参数。
(3)out参数要求在方法的内部必须为其赋值。
3. ref:
(1)调用者赋初值,并且可以由被调用的方法可选择的重新赋值(数值按引用传递)。通俗说:它将以变量带入一个方法内进行改变,改变完后再将改变后的值带出方法。
(2)ref参数要求在方法外必须为其赋值,而在方法内可以不赋值。即被调用的方法未能给ref参数赋值,也不会报错。
4.params:(可变参数)将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理。
注:params可变参数必须是形参列表的最后一个元素
out与ref的区别:
(1)out修饰的参数必须在方法内修改,ref可改也可不改。
(2)out在传入参数时,参数是局部变量的话可以不用赋值。
(3)ref修饰的参数在实参中必须有初始值才能调用。
-
传参&返回值:
static void Main(string[] args)
{
int a = 3;
Test(a);
Console.Write(a);
}
public static void Test(int a)
{
a = a + 5;
}
//此时打印出来的结果仍为3,因为方法未将值返回
我们在Main()函数中,调用Test()函数,我们称Main()为调用者,Test()为被调用者。
如果被调用者想要得到调用者的值:
(1)传递参数;
(2)使用静态字段来模拟全局变量;
如果调用者想要得到被调用者的值:
static void Main(string[] args)
{
int a = 3;
int res = Test(a);
Console.Write(res);//此时结果为8
}
public static int Test(int a)
{
a = a + 5;
return a;
}
//注意理解什么是形参,什么是实参!
return:1、在方法中返回要返回的值
2、立即结束本次方法
-
多态
概念:让一个对象能够表现出多种的状态/类型
实现多态的三种手段:
(1)虚方法
将父类的方法重新标记为虚方法,父类使用关键字virtual,子类使用关键字override,则这个父类函数可被子类重写一遍。
(2)抽象类
当父类的方法不知如何去现实时,可以考虑将父类抽象写成抽象类,方法写成抽象方法。
标记一个类为抽象类时使用关键字abstract,方法亦使用改关键字。方法抽象后无方法体。
①、抽象成员必须标记为abstract,并且不能有任何实现。
②、抽象成员必须在抽象类中。
③、子类继承抽象类后,必须把父类中所有的抽象成员都重写。
④、抽象类不能被实例化。
⑤、抽象成员的访问修饰符不可为private
⑥、在抽象类中可包含实例成员,并且抽象类中的实例成员可以不被子类实现。
⑦、抽象类是有构造函数的,虽然不能被实例化。
⑧、若父类中的抽象方法中有参数,则继承这个抽象父类的子类在重写父类方法的时候必须传入对应的参数,返回值亦是如此。
(3)接口 关键字interface
接口是一种规范
只要一个类继承了一个接口,这个类就必须实现这个接口中的所有成员。
//接口语法:
[public] interface I...able//接口的名字通常以"I"开头,以"able"为结尾,表示这个接口有...的能力
{
成员;//成员包含:①方法、②自动属性、③索引器 //他三个本质上都是方法
}
为了多态,接口不可被实例化;
一个类可同时继承一个类与多个接口,若一个子类同时继承了父类A并且实现了接口IA,那么语法上A必须在IA之前。
-
string提供的方法
(1)ToUpper() :将字符转换成大写形式;
ToLower() :将字符转换成小写形式;
(2)字符串①.Equals(字符串②,StringComparison.OrdinalIgnoreCase) //不区分大小写
比较两个字符串
(3)Split() :分割字符串,返回字符串类型的数组
(4)Substring() :截取字符串。在截取时包含要截取的那个位置
(5)IndexOf() :判断某个字符在字符串中第一次出现的位置,如果未出现则返回-1;
LastIndexOf() :判断某个字符在字符串中最后一次出现的位置,如果未出现则返回-1;
(6)StartWith() :判断以...开始;
EndWith() :判断以...结束;
(7)Replace() :将某个字符串替换成新的字符串
(8)Contains() :判断是否包含指定的字符串
(9)Trim() :去掉字符串中前后的空格;
TrimEnd() :去掉字符串中开头的空格;
TrimStart() :去掉字符串中结尾的空格;
(10).IsNullOrEmpty() :判断一个字符串是否为空/null
(11)string.Join() :将数组按照指定的字符串连接,返回一个字符串
-
构造函数
构造函数是用来创建对象,并企稳可以再构造函数中对对象进行初始化。构造函数的访问修饰符仅可为public。
初始化即给对象的每个属性依次赋值。
该函数是创建对象的特殊方法,方法名和类名一样且无返回值,连void都不用写。
public Student (string name,int age,char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}//构造函数可以重载
static void Main(string[] args)
{
Student ZS = new Student("张三",18,'男')//new的时候传参给构造函数
Student LS = new Student("李四",19,'男')
}
注:类当中会有一个默认的无参的构造函数,当新写了一个构造函数时,原来那个默认的无参的构造函数就被干掉了。
//补充:在类中通过自己的构造函数去显式地调用另一个构造函数
public Student(string name,int age,char gender,int chinese,int math)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
this.Chinese = chinese;
this.Math = math;
}
public Student(string name,int age,int math):this(name,age,'c',0,math)
{
}