1、ref 关键字
ref可以让值类型参数作为引用类型来使用,必须在定义和使用的时候同时加上ref 进行修饰
// 定义
public int te(ref int i)
{
return i;
}
// 调用
i = 123;
int res = te(ref i);
2、out 参数
输出参数,可以在函数外声明,可以不进行初始化,但是必须要预先声明,
同时调用的时候也必须添加out 进行修饰
// 定义函数
public int te(out int i ){
i = 123;
return 100;
}
// 声明变量
int i;
int x = te(out i); // x = 100
Console.WriteLine(i); // i = 123
c# 7.2之后添加了in 参数修饰符,被in修饰的参数数据不可以在函数体内被更改。
3、参数顺序:
可以在调用函数的过程中使用参数名称来指定传入参数的顺序,这样即使不按照定义函数时的参数顺序传参也可以得到相同的结果和执行过程。
//函数定义
public string allName(string firstName,string lastName)
{
return firstName + "-" + lastName;
}
//函数的两种调用方式:
// 默认: 顺序调用
allName("li","bai"); // li-bai
// 指定参数名
allName(lastName:"bai",firstName:"li"); //li-bai
4、可选参数:可以传值也可以不传值的参数
如果需要设置可选参数,即这个参数在定义的时候有默认值,这时候这个可选的参数必须放置在参数列表的最后面。
// 定义可选参数score
public void allSorce(string subject,int score = 100)
{
Console.WriteLine(subject + "-" + score);
}
//调用
allscore("数学");
allscore("体育",100);
可变参数:
参数有一系列同类型的参数组成,使用params 修饰符修饰
void allParams(params int[] data){
}
5、方法重载:
方法名相同;
参数个数不同或者参数类型不同;
与返回值没关系;
void all(string name)
{
Console.WriteLine(name);
}
int all(int name)
{
return name;
}
void all(string name,string subject)
{
Console.WriteLine(name+"-"+subject);
}
6、get,set属性:
自动实现:没有任何逻辑限制的时候使用,一般都可以使用
public int Age{get;set}
设置只读或者只写属性:两者设置其中的一个get或者set实现
//只读
public int Age{
get{
return Age;
}
}
// 只写
public int Age{
set{
Age = value;
}
}
7 、构造函数:
实例构造函数:
修饰符 类名(参数列表){函数体}
public MyClass(){
}
类构造函数:
使用static修饰,
只可以执行一次,
且不可以有参数列表
修饰符 static 类名(){函数体}
public static MyClass(){
}
执行顺序: 先执行静态构造函数,后执行实例构造函数。
8、只读字段:
常量:const 修饰
必须进行初始化操作
const int a = 100;
只读字段:readonly 修饰
可以只声明,不初始化,在需要的地方初始化,一旦初始化完成,值就不可以再次更改.
一般情况下,在构造函数中进行初始化只读字段的值。
public readonly int i ;
9、匿名类型:
当var 和new 一起使用的时候,构成了匿名类型,类型有实际创建的对象类型来决定。
匿名类型可以在没有实体类的情况下,创建对象和其属性值。
var all = new {FirstName="li",LastName="bai"};
var caption = new {person.name,person.age,student.subject};
// 此时person的属性和student的属性会映射到caption中,这样caption就拥有了perosn和student的属性
10、表达式方法:
使用=> 由简单的语句组成
public bool IsQuare(Reactangle rect) => rect.Height == rect.Width;
11、可空操作符:
?? 类似三目运算
int x6 = x3 ?? -1 ; // 如果x3为null,则获取-1,否则获取x3的值为x6 的结果
12、可空类型:
类型后加? 表示这是一个可以为空的数据,类似与swift中的option类型
int x = 1;
int? x2 = null; // 为空设置
int? x3 = x; // 直接使用就可以
int x4 = (int)x3 ; // 可空类型必须进行强制转换
13、is 、as
as 类型转换,如果转换失败则返回null
is 判断是不是指定的类型,返回true 或false
String account = per as String ;
if(account == null){
// 不是指定的类型
}
if(per is String){
}