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
}
}
}
本系列文章导读:
- Unity热更新方案C#Like(一)-序言
- Unity热更新方案C#Like(二)-导出官方示范的例子,确认方案可行性
- Unity热更新方案C#Like(三)-详解支持的C#特性:类
- Unity热更新方案C#Like(四)-详解支持的C#特性:委托和Lambda
- Unity热更新方案C#Like(五)-详解支持的C#特性:运算表达式
- Unity热更新方案C#Like(六)-详解支持的C#特性:循环语法
- Unity热更新方案C#Like(七)-详解支持的C#特性:get/set访问器
- Unity热更新方案C#Like(八)-详解支持的C#特性:多线程
- Unity热更新方案C#Like(九)-详解支持的C#特性:Using和命名空间
- Unity热更新方案C#Like(十)-详解支持的C#特性:宏和区域
- Unity热更新方案C#Like(十一)-详解支持的C#特性:枚举
- Unity热更新方案C#Like(十二-详解支持的C#特性:参数修饰符
- Unity热更新方案C#Like(十三)-详解支持的C#特性:函数重载和默认参数
- Unity热更新方案C#Like(十四)-详解支持的C#特性:异常处理
- Unity热更新方案C#Like(十五)-详解支持的C#特性:关键字:unsafe typeof nameof $ @ #pragma #warning #error
- Unity热更新方案C#Like(十六)-详解支持的C#特性:其他杂项:初始值设定项,表达式主体,内联变量声明
- Unity热更新方案C#Like(十七)-详解支持的长链接Socket和WebSocket
- Unity热更新方案C#Like(十八)-详解如何和Unity交互
- Unity热更新方案C#Like(十九)-详解KissJSON:唯一可以在本热更新框架使用的JSON库
- Unity热更新方案C#Like(二十)-详解KissCSV:一个简易实用的CSV表格读取方式
- Unity热更新方案C#Like(廿一)-详解KissFrameworkServer:对应的示范例子和官网所用的服务器框架
- Unity热更新方案C#Like(廿二)-详解内置的例子C#Like Demo:飞机大战,简易聊天室,简易账号/物品/邮件系统
- Unity热更新方案C#Like(廿三)-实战:示范如何把Unity官方免费例子Tanks! Tutorial转成可热更新项目
- Unity热更新方案C#Like(廿四)-实战:示范如何把Unity官方免费例子Platformer Microgame转成可热更新项目
- Unity热更新方案C#Like(廿五)-实战:示范如何建立初始包CSharpLikeFreeDemo项目
- Unity热更新方案C#Like(廿六)-(可选)详解免费版的演示如何升级到完整版的演示