c#【7】枚举、结构体、委托

184 阅读6分钟

1、常量

image.png

2、枚举类型

1、枚举类型是使用 enum 关键字声明的。

  • 将枚举声明到命名空间的下面,类的外面,表示这个命名空间下,所有的类都可以使用这个枚举。 image.png 2、枚举类型可以和int类型互相转换。 可以用Convert.ToInt32() image.png 枚举类型默认可以跟int类型相互转换 , 枚举类型和int类型是兼容的。
enum QQState
{ Online,OffLine,Leave,Busy}

    QQState state=QQState.OnLine;
    int n=(int)state;
    Console.WritrLine(n);
    COnsole.WriteLine((int)QQState.Leave);

image.png

3、枚举类型和字符类型的相互转换。

  • 可以用Convet.TOString()
  • 所有的类型都可以转换成string类型 image.png
  • 将字符串转成枚举类型,用Enum.Parse()方法。
  • 写法:(要转换的枚举类型)Enum.Parse(typeof(要转换的枚举类型),"要转换的字符串");
  • 如果转换的字符串是数字,则就算枚举中没有,也不会抛出异常。
  • 如果转换的字符串是文本,且枚举中没有,则会抛出异常。
string s="0";或者 string s="OnLine";
QQState state = (QQState)Enum.Parse(typeof(QQState),s);

4、使用foreach可以遍历枚举中的数值 (1)Enum类中的GetNames方法,获取值。 (2)Enum类中的GetValus方法,获取枚举类型中对应名称后面的值, image.png

image.png

3、结构体

1、基本语法 image.png image.png 2、赋值 image.png

4、异常处理

就一个语句 image.png

5、委托

1、什么是委托?

委托是C#中的一种引用类型,委托的本质是一个类,定义了方法的类型,是将方法作为参数传递到另一个方法的特殊类。

从数据结构来讲,委托是和类一样是一种用户自定义类型**。

  • 从设计模式来讲,委托(类)提供了方法(对象)的抽象.
  • 委托是定义指定了一个返回类型和一个参数列表。
  • 定义了委托之后,就可以声明该委托类型的变量,接着就可以把一个返回类型和参数列表跟委托一样的函数赋值给这个变量。

既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的时候,委托包含的所有方法将被执行。

2、委托类型的定义

(1)以deleagate关键字开头。 (2)返回类型+委托类型名+参数列表。

3、使用委托的具体步骤

image.png

4. 委托的用法(指向函数)
using System;
namespace _委托
{
   class Program
   {
      static double Multiply(double n1,double n2)
      {  return n1*n2 ; }
      
      static void Text()
      {
        Console.WriteLine("Text");
      }
      
       //要想用委托,委托的返回值和参数列表要和指向的函数的返回值和参数列表一样
       //定义委托
      delegate double MyDelegate(double n1,double n2)
      delegate void MyDelegate2();
     
      static void Main(string[] args)
      {
          MyDelegate delegate1;
          MyDelegate delegate2=Test;
          delegate1=Multiply;
          
          Console.WriteLine(delegate1.Multiply(2,4));  //输出8
          delegate2(); //输出Text
      }
   }
}
class Program
{
    delegate void onDelegate();
    static void Play(onDelegate onDie)
    {
        Console.WriteLine("做任务");
        Console.WriteLine("玩家正在战斗");
        Console.WriteLine("死亡");
        //调用委托
        if(onDie != null)
        {
           onDie();
        }
    }
    static void ShowDieUI()
    {
         Console.WriteLine("显示游戏死亡后的UI");
         Console.WriteLine("返回首页UI");
    }
    
    static void Main(string[] args)
    {
        Play(ShowDieUI);
    }
    
}
5. 初始化委托变量

(1) 使用new运算符

new运算符的操作数的组成如下:

  • 委托类型名
  • 一组圆括号,其中包含作为调用列表中的第一个成员的方法的名字。方法可以是实例方法或静态方法。
del1 = new MyDel( myInstObj.MyM1 );
del2 = new MyDel( SClass.OtherM2 );
复制代码

(2)使用快捷语法

快键语法,它仅由方法说明符构成。之所以能这样,是因为在方法名称和其相应的委托类型之间有隐式转换。

del1 = myInstObj.MyM1;
del2 = SClass.OtherM2;
复制代码
6. 赋值委托

 由于委托是引用类型,我们可以通过给它赋值来改变包含在委托变量中的方法地址引用。旧的引用会被垃圾回收器回收。

MyDel del;
del = myInstaObj.MyM1; 委托初始化
del = SClass.OtherM2;//委托重新赋值,旧的引用将被回收
复制代码
7. 组合委托

 委托可以使用额外的运算符来组合。这个运算最终会创建一个新的委托,其调用列表是两个操作数的委托调用列表的副本的连接。

委托是恒定的,操作数委托创建后不会被改变。委托组合拷贝的是操作数的副本

MyDel del1 = myObj.MyMethod;
MyDel del2 = SClass.OtherM2;
MyDel del3 = del1 + del2;   //组合调用列表
复制代码
8. 委托加减运算

可以使用+=运算符,为委托新增方法。

同样可以使用-=运算符,为委托移除方法。

MyDel del = myObj.MyMethod;
del += SClass.OtherM2; // 增加方法
del -= myObj.MyMethod; // 移除方法
复制代码
9. 委托调用

委托调用跟方法调用类似。委托调用后,调用列表的每个方法将会被执行。

在调用委托前,应判断委托是否为空。调用空委托会抛出异常。

if(null != del)
{
     del();//委托调用
}
复制代码
10. 匿名方法

匿名方法是在初始化委托时内联声明的方法。

基本结构:

deleage( 参数 ) { 语句块 }
复制代码

例如:

delegate int MyDel (int x); //定义一个委托 

MyDel del = delegate( int x){ return x; };
复制代码

从上面我们可以看到,匿名方法是不会显示声明返回值的

11. Lambda表达式

Lambda表达式主要用来简化匿名方法的语法。在匿名方法中,delegate关键字有点多余,因为编译器已经知道我们将方法赋值给委托。通过几个简单步骤,我们就可以将匿名方法转换为Lambda表达式:

  • 删除delegate关键字
  • 在参数列表和匿名方法主体之间防Lambda运算符=>。Lambda运算符读作"goes to"。
MyDel del = delegate( int x) { return x; };//匿名方法
MyDel del2 = (int x) => {return x;};//Lambda表达式
MyDel del3 = x => {return x};//简写的Lambda表达式

6、关键字(部分)

var 在方法范围中声明的变量具有可以隐式类型var。隐式类型的本地变量是强类型变量(就好像是已经声明该类类型一样),但由编译器确定类型。有返回值。

unsafe 表示不安全上下文,该上下文是任何涉及指针的操作所必需的

sealed 当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承。在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承。

readonly 关键字是可以在字段上使用的修饰符。当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中。 readonly 标识一个变量的值在初始化后不可修改可以自己在确定一下readonly是否正确

7、转义字符

image.png