Contents

C#7新增语法

字面值改进

基本概念:在声明数值变量时,为了方便查看数值

可以在数值之间插入_作为分隔符

主要作用:方便数值变量的阅读

int i = 9_9123_1239;
print(i);
int i2 = 0xAB_CD_17;
print(i2);

out变量的快捷使用 和 弃元

以前使用带out函数的写法

int a;
int b;
Calc(out a, out b);

现在的写法

Calc(out int x, out int y);

结合var类型更简便(但是这种写法在存在重载时不能正常使用,必须明确调用的是谁)

Calc(out int a, out var b);

可以使用 _弃元符号 省略不想使用的参数

Calc(out int c, out _);

ref修饰临时变量和返回值

基本概念:使用ref修饰临时变量和函数返回值,可以让赋值变为引用传递

作用:用于修改数据对象中的某些值类型变量

int testI = 100;
ref int testI2 = ref testI;
testI2 = 900;
print(testI);//900 不使用ref输出100
//2.获取对象中的参数
ref int atk = ref r.atk;
atk = 99;
print(r.atk);
//函数返回值
int[] numbers = new int[] { 1, 2, 3, 45, 5, 65, 4532, 12 };
ref int number = ref FindNumber(numbers, 5);
number = 98765;
print(numbers[4]);//98765

本地函数

基本概念:在函数内部声明一个临时函数

注意:

本地函数只能在声明该函数的函数内部使用

本地函数可以使用声明自己的函数中的变量

public int TestTst(int i)
{
    bool b = false;
    i += 10;
    Calc();
    print(b);
    return i;

    void Calc()
    {
        i += 10;
        b = true;
    }
}

抛出表达式

一般的使用方式 都是 throw后面 new 一个异常类

C#常见异常类:

  • IndexOutOfRangeException:当一个数组的下标超出范围时运行时引发。
  • NullReferenceException:当一个空对象被引用时运行时引发。
  • ArgumentException:方法的参数是非法的
  • ArgumentNullException: 一个空参数传递给方法,该方法不能接受该参数
  • ArgumentOutOfRangeException: 参数值超出范围
  • SystemException:其他用户可处理的异常的基本类
  • OutOfMemoryException:内存空间不够
  • StackOverflowException 堆栈溢出

在C# 7中,可以在更多的表达式中进行错误抛出

好处:更节约代码量

空合并操作符后用throw

 private void InitInfo(string str) => jsonStr = str ?? throw new ArgumentNullException(nameof(str));

三目运算符后面用throw

private string GetInfo(string str, int index)
{
    string[] strs = str.Split(',');
    return strs.Length > index ? strs[index] : throw new IndexOutOfRangeException();
}

=>符号后面直接throw

Action action = () => throw new Exception("错了,不准用这个委托");

元组

基本概念:

多个值的集合,相当于是一种快速构建数据结构类的方式

一般在函数存在多返回值时可以使用元组 (返回值1类型,返回值2类型,….) 来声明返回值

在函数内部返回具体内容时通过 (返回值1,返回值2,….) 进行返回

无变量名元组的声明

(int, float,bool,string) yz = (1, 5.5f, true, "123");
print(yz.Item1);
print(yz.Item2);
print(yz.Item3);
print(yz.Item4);

有变量名元组的声明

(int i, float f, bool b, string str) yz2 = (1, 5.5f, true, "123");
print(yz2.i);
print(yz2.f);
print(yz2.b);
print(yz2.str);

元组可以进行等于和不等于的判断

//  数量相同才比较,类型相同才比较,每一个参数的比较是通过==比较 如果都是true 则认为两个元组相等
if (yz == yz2)
    print("相等");
else
    print("不相等");

元组不仅可以作为临时变量 成员变量也是可以的

public (int, float) yz;
public void Test()
{
    print(yz.Item1);
}

元组的应用——函数返回值

private (string str, int i, float f) GetInfo()
{
    return ("123", 2, 5.5f);
}
var info = GetInfo();
print(info.Item1);
print(info.Item2);
print(info.Item3);
//使用变量名获取值
print(info.f);
print(info.i);
print(info.str);

元组的解构赋值

int myInt;
string myStr;
float myFloat;
(myStr, myInt, myFloat) = GetInfo();
//(string myStr, int myInt, float myFloat) = GetInfo();
print(myStr);
print(myInt);
print(myFloat);

配合丢弃参数

(string ss, _, _) = GetInfo();
print(ss);

元组的应用——字典

//字典中的键 需要用多个变量来控制
Dictionary<(int i, float f), string> dic = new ();
dic.Add((1, 2.5f), "123");
if(dic.ContainsKey((1,2.5f)))
{
    print("存在相同的键");
    print(dic[(1, 2.5f)]);
}

模式匹配

基本概念:

模式匹配时一种语法元素,可以测试一个值是否满足某种条件,并可以从值中提取信息

在C#7中,模式匹配增强了两个现有的语言结构

  1. is表达式,is表达式可以在右侧写一个模式语法,而不仅仅是一个类型
  2. switch语句中的case

常量模式(is 常量):用于判断输入值是否等于某个值

object o = null;
if(o is 1)
{
    print("o是1");
}
if(o is null)
{
    print("o是null");
}

类型模式(is 类型 变量名、case 类型 变量名):用于判断输入值类型,如果类型相同,将输入值提取出来

//以前的写法
object o = 1;
//if (o is int)
//{
//    int i = (int)o;
//    print(i);
//}
if (o is int i)
{
    print(i);
}
//结合switch
switch (o)
{
    case int value:
        print("int:" + value);
        break;
    case float value:
        print("float:" + value);
        break;
    case null:
        print("null");
        break;
    default:
        break;
}

var模式:用于将输入值放入与输入值相同类型的新变量中

if(o is var v)
{
    print(v);
}