Unity热更新方案C#Like(五)-详解支持的C#特性:运算表达式

C#Like是Unity的热更方案,使用纯C#语言写出可以热更新的代码,就像可以在所有平台使用DLL(动态链接库)文件一样.遵从KISS设计原则,让用户轻松构建或升级成Unity的热更新项目.

简介

本篇主要介绍C#Like支持的C#特性:运算表达式.

  • C#Like免费版:+ - * / % += -= *= /= %= > >= < <= != == && || ! ++ -- ?: is as 
  • C#Like完整版:多了 & | ~ ^ &= |= ^= << >> <<= >>=

C#Like免费版:

示范代码如下:

using UnityEngine;  
  
namespace CSharpLike  
{  
    public partial class ExampleCSharp : LikeBehaviour  
    {  
        /// <summary>  
        /// 测试运算表达式:  
        /// + - * / % += -= *= /= %= > >= < <= != == && || ! ++ -- is as ?:  
        /// </summary>  
        void TestMathExpression()  
        {  
            Debug.LogError("示范运算表达式:你不能在C#Like免费版里使用位运算和可空运算.(在完整版已支持).强烈推荐升级到完整版: ";  
            // 我们提供以下方案给免费用户:  
            // 位运算: 使用函数来代替.  
            // 可空运算: 不使用  
  
            int i = 1;  
            int j = 2;  
            int k = 100;  
            //测试+ - * / %  
            Debug.Log("i = 1, j = 2, test i + j = " + (i + j));//输出 3  
            Debug.Log("i = 1, j = 2, test i - j = " + (i - j));//输出 -1  
            Debug.Log("i = 1, j = 2, test i * j = " + (i * j));//输出 2  
            Debug.Log("i = 1, j = 2, test i / j = " + (i / j));//输出 0  
            Debug.Log("i = 1, j = 2, test i % j = " + (i % j));//输出 1  
  
            //测试+= -= *= /= %=  
            k += j;  
            Debug.Log("j = 2, k = 100, test k += j then k = " + k);//输出 102  
            k = 100;  
            k -= j;  
            Debug.Log("j = 2, k = 100, test k -= j then k = " + k);//输出 98  
            k = 100;  
            k *= j;  
            Debug.Log("j = 2, k = 100, test k *= j then k = " + k);//输出 200  
            k = 100;  
            k /= j;  
            Debug.Log("j = 2, k = 100, test k /= j then k = " + k);//输出 50  
            k = 100;  
            k %= j;  
            Debug.Log("j = 2, k = 100, k %= j then k = " + k);//输出 0  
  
            //测试> >= < <= != ==  
            Debug.Log("i = 1, j = 2, test (i < j) = " + (i < j));//输出 True  
            Debug.Log("i = 1, j = 2, test (i <= j) = " + (i <= j));//输出 True  
            Debug.Log("i = 1, j = 2, test (i == j) = " + (i == j));//输出 False  
            Debug.Log("i = 1, j = 2, test (i != j) = " + (i != j));//输出 True  
            Debug.Log("i = 1, j = 2, test (i > j) = " + (i > j));//输出 False  
            Debug.Log("i = 1, j = 2, test (i >= j) = " + (i >= j));//输出 False  
  
            //测试&& || !  
            bool b1 = true;  
            bool b2 = false;  
            Debug.Log("b1 = true, b2 = false, test (b1 && b2) = " + (b1 && b2));//输出 False  
            Debug.Log("b1 = true, b2 = false, test (b1 || b2) = " + (b1 || b2));//输出 True  
            Debug.Log("b1 = true, test (!b1) = " + (!b1));//输出 False  
  
            //测试++ --(含前置后置)  
            k = 100;  
            Debug.Log("k = 100, test (k++) = " + (k++));//输出 100  
            Debug.Log("finally k = " + k);输出 101  
            k = 100;  
            Debug.Log("k = 100, test (++k) = " + (++k));//输出 101  
            Debug.Log("finally k = " + k);输出 101  
            k = 100;  
            Debug.Log("k = 100, test (k--) = " + (k--));//输出 100  
            Debug.Log("finally k = " + k);输出 99  
            k = 100;  
            Debug.Log("k = 100, test (--k) = " + (--k));//输出 99  
            Debug.Log("finally k = " + k);输出 99  
              
            // 我们暂不支持 '++' '--'和运算符'[]'同时使用  
            // 例如List或Dictionary或JSONData.  
             List<int> lists = new List<int>();  
             lists.Add(1);  
             lists[0]++;//编译时错误,建议改成'lists[0] += 1;'  
             ++lists[0];//运行时报错,建议改成'lists[0] += 1;'  
  
            //测试三元表达式 ?:  
            Debug.Log("i = 1, j = 2, test ((i < j) ? i : j) = " + ((i < j) ? i : j));//输出 1  
  
            //测试转换符号is as  
            object o = i;  
            Debug.Log("int i = 1,object o = i, test (o is int) = " + (o is string));//输出 False  
            Debug.Log("int i = 1,object o = i, test (o as string) = " + (o as string));//输出 null  
        }  
    }  
} 

 C#Like完整版:

示范代码如下:

using UnityEngine;  
  
namespace CSharpLike  
{  
    public partial class ExampleCSharp : LikeBehaviour  
    {  
        /// <summary>  
        /// 测试运算表达式:  
        /// + - * / % += -= *= /= %= > >= < <= != == && || ! ++ -- is as & | ~ ^ &= |= ^= << >> <<= >>= ? ?? ?. ?:  
        /// </summary>  
        void TestMathExpression()  
        {  
            Debug.LogError("Test MathExpression:");  
            int i = 1;  
            int j = 2;  
            int k = 100;  
            //测试+ - * / %  
            Debug.Log("i = 1, j = 2, test i + j = " + (i + j));//输出 3  
            Debug.Log("i = 1, j = 2, test i - j = " + (i - j));//输出 -1  
            Debug.Log("i = 1, j = 2, test i * j = " + (i * j));//输出 2  
            Debug.Log("i = 1, j = 2, test i / j = " + (i / j));//输出 0  
            Debug.Log("i = 1, j = 2, test i % j = " + (i % j));//输出 1  
  
            //测试+= -= *= /= %=  
            k += j;  
            Debug.Log("j = 2, k = 100, test k += j then k = " + k);//输出 102  
            k = 100;  
            k -= j;  
            Debug.Log("j = 2, k = 100, test k -= j then k = " + k);//输出 98  
            k = 100;  
            k *= j;  
            Debug.Log("j = 2, k = 100, test k *= j then k = " + k);//输出 200  
            k = 100;  
            k /= j;  
            Debug.Log("j = 2, k = 100, test k /= j then k = " + k);//输出 50  
            k = 100;  
            k %= j;  
            Debug.Log("j = 2, k = 100, k %= j then k = " + k);//输出 0  
  
            //测试> >= < <= != ==  
            Debug.Log("i = 1, j = 2, test (i < j) = " + (i < j));//输出 True  
            Debug.Log("i = 1, j = 2, test (i <= j) = " + (i <= j));//输出 True  
            Debug.Log("i = 1, j = 2, test (i == j) = " + (i == j));//输出 False  
            Debug.Log("i = 1, j = 2, test (i != j) = " + (i != j));//输出 True  
            Debug.Log("i = 1, j = 2, test (i > j) = " + (i > j));//输出 False  
            Debug.Log("i = 1, j = 2, test (i >= j) = " + (i >= j));//输出 False  
  
            //测试&& || !  
            bool b1 = true;  
            bool b2 = false;  
            Debug.Log("b1 = true, b2 = false, test (b1 && b2) = " + (b1 && b2));//输出 False  
            Debug.Log("b1 = true, b2 = false, test (b1 || b2) = " + (b1 || b2));//输出 True  
            Debug.Log("b1 = true, test (!b1) = " + (!b1));//输出 False  
  
            //测试++ --(含前置后置)  
            k = 100;  
            Debug.Log("k = 100, test (k++) = " + (k++));//输出 100  
            Debug.Log("finally k = " + k);输出 101  
            k = 100;  
            Debug.Log("k = 100, test (++k) = " + (++k));//输出 101  
            Debug.Log("finally k = " + k);输出 101  
            k = 100;  
            Debug.Log("k = 100, test (k--) = " + (k--));//输出 100  
            Debug.Log("finally k = " + k);输出 99  
            k = 100;  
            Debug.Log("k = 100, test (--k) = " + (--k));//输出 99  
            Debug.Log("finally k = " + k);//输出 99  
              
            // 我们暂不支持 '++' '--'和运算符'[]'同时使用  
            // 例如List或Dictionary或JSONData.  
             List<int> lists = new List<int>();  
             lists.Add(1);  
             lists[0]++;//编译时错误,建议改成'lists[0] += 1;'  
             ++lists[0];//运行时报错,建议改成'lists[0] += 1;'  
  
            //测试三元表达式 ?:  
            Debug.Log("i = 1, j = 2, test ((i < j) ? i : j) = " + ((i < j) ? i : j));//输出 1  
            //测试可空运算符 ? 和 合并运算 ?. ??  
            Vector2? v1 = null;//可空运算符 ?  
            Debug.Log("Vector2? v1 = null, test v1.HasValue = " + v1.HasValue);//输出 False  
            //Debug.Log("Vector2? v1 = null, test v1.Value = " + v1.Value);//报错  
            Debug.Log("Vector2? v1 = null, test v1.GetValueOrDefault = " + v1.GetValueOrDefault());//输出 (0.0,0.0)  
            Debug.Log("Vector2? v1 = null, test v1 = " + v1);//输出 null  
            v1 = Vector2.one;  
            Debug.Log("Vector2? v1 = Vector2.one, test v1.HasValue = " + v1.HasValue);//输出 True  
            Debug.Log("Vector2? v1 = Vector2.one, test v1.Value = " + v1.Value);//输出 (1.0,1.0)  
            Debug.Log("Vector2? v1 = Vector2.one, test v1.GetValueOrDefault = " + v1.GetValueOrDefault());//输出 (0.0,0.0)  
            Debug.Log("Vector2? v1 = Vector2.one, test v1 = " + v1);//输出 (1.0,1.0)  
            v1 = null;  
            Vector2 v2 = v1.HasValue ? v1.Value : v1.GetValueOrDefault();//你不能这样强转 'Vector2 v2 = (Vector2)v1;'  
            Debug.Log("Vector2 v2 = v1.HasValue ? v1.Value : v1.GetValueOrDefault(), test v2 = " + v2);//输出 (0.0,0.0)  
            v1 = Vector2.one;  
            v2 = v1 ?? Vector2.zero;//合并运算 '??'  
            Debug.Log("Vector2 v2 = v1 ?? Vector2.zero, test v2 = " + v2);//输出 (1.0,1.0)  
            System.Random r = null;  
            int? iNull = r?.Next(1000);  
            Debug.Log("int? iNull = r?.Next(1000), test iNull = " + iNull);//输出 null  
            r = new System.Random();  
            iNull = r?.Next(1000); //合并运算 '?.'  
            Debug.Log("int? iNull = r?.Next(1000), test iNull = " + iNull);//输出 [0,1000)  
            iNull += i;  
            Debug.Log("i = 1, iNull += i, test iNull = " + iNull);//output [1,1001)  
  
            //测试转换符号is as  
            object o = i;  
            Debug.Log("int i = 1,object o = i, test (o is int) = " + (o is string));//输出 False  
            Debug.Log("int i = 1,object o = i, test (o as string) = " + (o as string));//输出 null  
  
            //测试位运算<< >> <<= >>=  
            Debug.Log("i = 1, j = 2, test i << j = " + (i << j));//输出 4  
            Debug.Log("i = 1, j = 2, test i >> j = " + (i >> j));//输出 0  
            k = 100;  
            k <<= j;  
            Debug.Log("j = 2, k = 100, test k <<= j then k = " + k);//输出 400  
            k = 100;  
            k >>= j;  
            Debug.Log("j = 2, k = 100, test k >>= j then k = " + k);//输出 25  
  
            //测试位运算& | ^ &= |= ^= ~  
            Debug.Log("i = 1, j = 2, test i & j = " + (i & j));//输出 0  
            Debug.Log("i = 1, j = 2, test i | j = " + (i | j));//输出 3  
            Debug.Log("i = 1, j = 2, test i ^ j = " + (i ^ j));//输出 3  
            k = 100;  
            k &= j;  
            Debug.Log("j = 2, k = 100, test k &= j then k = " + k);//输出 0  
            k = 100;  
            k |= j;  
            Debug.Log("j = 2, k = 100, test k |= j then k = " + k);//输出 102  
            k = 100;  
            k ^= j;  
            Debug.Log("j = 2, k = 100, test k ^= j then k = " + k);//输出 102  
            Debug.Log("i = 1, test (~i) = " + (~i));//输出 -2  
        }  
    }  
} 

 本系列文章导读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C#Like

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值