首页 > 编程语言 >[Unity脚本运行时更新]C#7.2新特性

[Unity脚本运行时更新]C#7.2新特性

时间:2023-04-28 16:01:44浏览次数:59  
标签:arr 更改 C# 修饰符 兼容 7.2 Unity ref


洪流学堂微信公众号。

本文是该系列《Unity脚本运行时更新带来了什么?》的第7篇。
洪流学堂公众号回复runtime,获取本系列所有文章。

Unity2017-2018.2中的4.x运行时已经支持到C#6,之前的文章已经介绍完毕。Unity2018.3将支持到C# 7.3,今天我们来看看C#7.2新特性能给代码带来什么吧,不过这些特性得等到Unity2018.3才可以用哦

C#7.2 新特性

C#7.2的一项主要功能是避免不必要的复制或内存分配,进而更有效地处理值类型。

值类型的引用语法

在C# 7.2中,值类型的引用语法做了优化,旨在尽量减少值类型的拷贝、内存分配,进而提升性能。 功能包括:

  • 添加实参的 in 修饰符:指定形参通过引用传递,但不会在调用的方法中修改。新增的参数 in 修饰符是源兼容的更改

源兼容的更改
如果使用库的应用程序和库不需要更改源代码,但必须根据新版本重新编译源才能正常工作,那么对库的更改属于源兼容的更改。

  • 针对方法返回值的 ref readonly 修饰符:指示方法通过引用返回其值,但不允许写入该对象。 如果向某个值赋予返回值,则添加 ref readonly 修饰符是源兼容的更改。 将 readonly 修饰符添加到现有的 ref 返回语句是不兼容的更改。 需要调用方更新 ref 本地变量的声明以包含 readonly 修饰符。

不兼容的更改
如果更改既不是源兼容的更改,也不是二进制兼容的更改,则需要在从属库和应用程序中进行源代码更改和重新编译。

  • readonly struct 声明,指示结构不可变,且应作为 in 参数传递到其成员方法。 将 readonly 修饰符添加到现有的结构声明是二进制兼容的更改

二进制兼容的更改
如果更新的库可以在不重新生成应用程序和使用它的库的情况下使用,那么对库的更改属于二进制兼容的更改。 不需要重新生成从属程序集,也不需要更改任何源代码。 二进制兼容的更改也是源兼容的更改。

  • ref struct 声明,指示结构类型直接访问托管的内存,且必须始终分配有堆栈。 将 ref 修饰符添加到现有 struct 声明是不兼容的更改。 ref struct 不能是类的成员,也不能用于可能在堆上分配的其他位置。

更多细节可以查阅:https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.2/readonly-ref.md

条件ref

C# 7.2之前,ref变量无法通过条件表达式来返回。通常的变通方案是通过方法:

ref T Choice(bool condition, ref T consequence, ref T alternative)
{
    if (condition)
    {
         return ref consequence;
    }
    else
    {
         return ref alternative;
    }
}

但是这样写其实是有问题的:

ref var r = ref Choice(arr != null, ref arr[0], ref otherArr[0]);

如果arr为空,arr[0]在传入时会引发异常。

新的功能如下:

<condition> ? ref <consequence> : ref <alternative>;

实现上面的功能的代码类似:

ref var r = ref (arr != null ? ref arr[0]: ref otherArr[0]);

条件ref既可以作为右值,也可以作为左值,常见的用法有:

// pass by reference
foo(ref (arr != null ? ref arr[0]: ref otherArr[0]));

// return by reference
return ref (arr != null ? ref arr[0]: ref otherArr[0]);

// assign to
(arr != null ? ref arr[0]: ref otherArr[0]) = 1;

int x = (arr != null ? ref arr[0]: ref otherArr[0]);

不在尾部的指定名字参数

从C# 7.2开始,指定名字的参数可以不在尾部位置,只要他们的位置是正确的。比如:DoSomething(isEmployed:true, name, age);

更多例子如:

public void DoSomething(bool isEmployed, string personName, int personAge) { ... }

DoSomething(isEmployed:true, name, age); // CS7.2后编译通过
DoSomething(true, personName:name, age); // CS7.2后编译通过
DoSomething(name, isEmployed:true, age); // 非法
DoSomething(name, age, isEmployed:true); // 非法
DoSomething(true, personAge:age, personName:name); // 之前已经可以编译通过

数值字面值的下划线

C# 7.0 中实现了对数字分隔符的支持,但这不允许文字值的第一个字符是 _。 C# 7.2之后,十六进制文本和二进制文本可以 _ 开头。

例如:

int binaryValue = 0b_0101_0101;

private protected 访问修饰符

新的复合访问修饰符 private protected 指示可通过包含同一程序集中声明的类或派生类来访问成员。 虽然 protected internal 允许通过同一程序集中的类或派生类进行访问,但 private protected 限制对同一程序集中声明的派生类的访问。

小结

本文讲解了C#7.2的新特性中对Unity编程有影响的新特性,不过这些特性得等到Unity2018.3才可以用哦

洪流学堂公众号回复runtime,获取本系列所有文章。

把今天的内容分享给其他Unity开发者朋友,或许你能帮到他。



《郑洪智的Unity2018课》,倾尽我8年的开发经验,结合最新的Unity2018,带你从入门到精通。


标签:arr,更改,C#,修饰符,兼容,7.2,Unity,ref
From: https://blog.51cto.com/u_5746184/6234719

相关文章

  • Memcache实践总结【转】
    附件为ppt介绍memcached基本问题1、memcached的基本设置 1)启动Memcache的服务器端 #/usr/local/bin/memcached-d-m10-uroot-l192.168.0.200-p12000-c256-P/tmp/memcached.pid-d选项是启动一个守护进程, -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB, -u......
  • blockimgdiff中方法分析01
    https://blog.csdn.net/Android_2016/article/details/98947824 关于blockimgdiff文件,本篇文档将详细分析初步生成transfer对象和生成diff的字典,并对几个重要方法进行解析.一、传入blockimgdiff的参数分析二、blockimgdiff中方法分析 一、传入blockimgdiff的参数分析......
  • C++中关于默认构造函数(Default Constructor)
    读<<深度探索C++对象模型>>,第二章介绍了默认构造函数,自觉知识点虽基础但是很是被忽略,故作此文记录.关于基础概念不做介绍,先看代码#include<stdio.h>#include<string>classSample{public:intintVal;};classFoo{public:Foo(inta=1000):int......
  • CSS animation (animation-timing-function) 测试脚本
    代码:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=de......
  • RocketMQ(一):基本概念
    RocketMQ官方文档地址:RocketMQ官网文档地址。一、什么是RocketMQRocketMQ是一款分布式、队列模型的消息中间件。二、RocketMQ的基本概念2.1、Topic-主题Topic是RocketMQ中消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息,通过TopicName来做唯一标识和区......
  • vscode-leetcode
    vscode里写leetcode需要的插件xavier-cai.vscode-leetcode-cpp-debug,leetcode.vscode-leetcodeLeetCodeC++Debugger.DeleteTemporaryContents置为falsectrl+shift+p运行LeetCodeC++Debugger:StartDebugging在leetcode-main.cpp进行debug注意不要使用mingw的调试......
  • cf-div.2-868-D
    题目链接:https://codeforces.com/contest/1823/problem/D比赛的时候关键性质已经想到,但没想到怎么正确构造。性质:每次新加一个字母,回文子串的数量最多增加1(因为题目需要不相同的回文子串)。证明:可以用反证法,易证。构造方法:由于k的值很小(只有20),所以对于不再增加(回文子串)的......
  • C# 多线程
    首先要关注电脑配置是否是多核多CPU的。因为一个CPU在同一时刻只能运行一个线程,但是多个CPU在同一时刻就可以运行多个线程。 多线程的优点:1、可以同时完成多个任务;2、可以使程序的响应速度更快;3、可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给......
  • CMakeLists---自定义变量-add_definitions()函数
    转载:https://blog.csdn.net/qq_35699473/article/details/115837708引言其实这个函数在安装一些库的时候,它的CMakeLists里面就有这样的函数。典型的就是opencv了。opencv安装时候有一些指令也是针对这个函数的,比如安装命令(随便搜索的):cmake ../opencv-3.4.1-DWITH_GTK_2......
  • echarts饼图实现圆环图例修改
    实现效果:代码:constoption={//环形图中间文字title:{text:'1200',subtext:'总户数',textStyle:{fontSize:16,color:'#333',fontWeight:600,},subtextStyle:{fontSize:12,c......