Unity学习之路——C# 位操作、Flags、接口、抽象类

来源:互联网 发布:编程 开发 编辑:程序博客网 时间:2024/06/06 20:38

1.C#位操作符

位操作符是对数据按二进制位进行运算的操作符。c#位操作符包括:

  • 按位与 &
  • 按位或 |
  • 按位取反 ~
  • 按位异或 ^
  • 左移 <<
  • 右移 >>

举例说明

public static void Main()   {     int a=6&3;     Debug.Log("a={0}",a);     //6的二进制是00000110,3的二进制是00000011,按位与后等于00000010,  即2。    int b=6|3;     Debug.Log("b={0}",b);     //6的二进制是00000110,3的二进制是00000011,按位或后等于00000111,即7     int c=~6;     Debug.Log("c={0}",c);     //6的二进制是00000110,按位取反后是11111001即-7     int d=6^3;     Debug.Log("d={0}",d);     //6的二进制是00000110,3的二进制是00000011,按位异或后等于00000101,即5     int e=6<<3;     Debug.Log("e={0}",e);     //6的二进制是00000110,左移三位后等于00101000,即48     int f=6>>2;     Debug.Log("f={0}",f);     //6的二进制是00000110,右移二位等于00000001,即1   }

2.C#的Enum中的Flags的用法

Flags关键字允许我们在使用.net 枚举变量时,使用多个组合值

只需要在Enum上使用[Flags]标签即可标记为可组合的枚举。

[Flags]    enum WeekDays    {        Monday = 0x1,        Tuesday = 0x2,        Wednesday = 0x4,        Thursday = 0x8,        Friday = 0x10,        Saturday = 0x20,        Sunday = 0x40     }
public static void Main(){        /**用'|'把各个枚举值分开*/        WeekDays wds = WeekDays.Monday | WeekDays.Tuesday | WeekDays.Sunday;        Debug.Log("分开的值:"+wds);        /**我们来看看计算过程:           或运算:            0000 0001   Monday  0x1            0000 0010   Tuesday 0x2            0100 0000   Sunday  0x40        =   0100 0011   =   67            这就用到了或运算,一个为true时结果就为true            换句话说,某个位上的1就代表了这个位上的值在枚举中存在         */        Debug.Log("3个值组合为:"+(int)wds);        //利用上面规则来判断枚举值中是否包含某个枚举值就轻而易举了        //与运算'&' 两个同时为true时结果就为ture        if ((wds & WeekDays.Monday) != 0)        {            Debug.Log("Monday是其中的值");        }        if ((wds & WeekDays.Saturday) == 0)        {            Debug.Log("Saturday不是其中的值");        }        /**如果将某个值去掉的话         * 将Sunday从枚举中去掉         *  0100 0011         * &1011 1111(~WheekDays.Sunday取反)         * =0000 0011 这样就把Sunday去掉了         */        wds = wds & (~WeekDays.Sunday);        Debug.Log("去掉Sunday的效果: " + wds);}

运行的结果:


3.C#的接口用法示例(interface)

注意:

  • 接口不能包含字段
  • 接口成员不允许添加访问修饰符,默认就是public,成员也不能加abstract访问修饰符
  • 接口不能包含实现其成员的任何代码,而只只能定义成员本身(如不允许写具有方法体的函数)
  • 实现过程必须在实现接口的类中完成。

接口的声明:

接口的成员可以是方法,属性,事件和索引器,但不能包含常数,字段,运算符,实例构造函数,析构函数或类型,也不能包括任何种类的静态成员。

定义一个公共接口:

public interface IView {    void Call();}

分别用两个类实现接口:

public class AndroidView : IView{    public void Call()    {        Debug.Log("我是AndroidView");    }}
public class IOSView : IView{    public void Call()    {        Debug.Log("我是IOSView");    }}

测试代码:
    void Init()    {        IView iv1 = new AndroidView();        iv1.Call();        IView iv2 = new IOSView();        iv2.Call();    }
输出结果:


显示实现接口:

  • 实现接口的方法前不能用访问修饰符public,必须显示指定接口名称
  • 返回值类型 接口名称.接口方法
  • 只能是通过接口来调用,而不能通过具体类来做

再定义一个接口,相同的方法:

public interface IView2 {    void Call();}
显示实现接口:

public class AllView : IView,IView2 {    void IView.Call()    {        Debug.Log("我是IView接口");    }    void IView2.Call()    {        Debug.Log("我是IView2接口");    }}
作用就是指定方法到底是哪个接口

    void Init()    {        IView iView = new AllView();        iView.Call();        IView2 iView2 = new AllView();        iView2.Call();}

测试结果:


接口使方法具有较好扩展性.

C#的抽象方法(abstract)

  • 抽象类前有关键字abstract,没有则为非抽象类
  • 抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此不能new,不能sealed
  • 如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类
  • 如果一个非抽象类从抽象类中派生,则其必须通过重载来实现所有继承而来的抽象成员
  • 抽象方法不提供任何实际实现
  • 抽象方法不能有任何可执行程序,哪怕是方法体{}
  • 重写抽象方法时采用override实现

先定义一个抽象类:

public abstract class Test {    public abstract void GetPow(int a, int b);}

继承抽象类并且实现方法:

public class Test1 : Test{    public override void GetPow(int a, int b)    {        Debug.Log("求幂的结果:" + Mathf.Pow(a, b));    }}
测试代码:

    void Init()    {        Test1 test1 = new Test1();        test1.GetPow(2,10);    }
测试结果:



原创粉丝点击