设为首页 加入收藏

TOP

未来的C#之只读引用与结构体
2017-05-02 10:23:42 】 浏览:357
Tags:未来 只读 引用 结构

C++中提供了const特性,使用该特性定义的参数,其所引用的参数或对象将不会被调用函数修改(当然const还提供了更多的特性,参见“Const正确性”)。在新的建议中,C#也将提供类似的特性。


只读ref参数


在C#中,“只读引用”也可称为“in参数”,两者提供了类似的限制。只读引用的基本思想是,如果用“readonly ref”或仅是“in”标注一个参数,那么编译器会解释为“将该参数按引用传递以改进性能,但不允许实际更改该参数”。该特性对于在高性能场景下的大型结构体尤为有用。在建议中引用了如下的例子:


该语法还结合了C++版本的const。即参数本身是不可更改的,参数所引用的对象或结构体中的所有数据也是不可更改的。


当前在通过引用传递一个参数时,必须使用“ref”或“out”关键字。在这个建议实现后,使用“in”参数无需受此限制。进而表达式的结果也可以传递进来(当前这在VB中是允许的,但是在C#中尚不允许)。


实现细节


对比“ref”和“out”参数,它们的重载规则具有相同的工作机制。


这依然有待议定,但是当前的计划是不允许“in”参数被匿名函数或async函数捕获(即生成一个闭包对象)。捕获“in”参数的问题在于会导致一次拷贝,这破坏了使用“in”参数的初衷,即避免拷贝所导致的性能损耗。


将参数标为“readonly ref”或“in”,并不会令引用值成为不可变值。虽然参数值无法被声明函数更改,但可以在其它地方修改。无需使用多线程,只需能访问参数所引用原始变量的方法即可。


在结构体上调用方法可能会导致问题。在建议中是这样说的:


使用“out”参数时,一个特殊的参数标识了是否需要“in”参数。该参数将被旧的编译器忽略,因此没有向后兼容的问题。


只读ref返回


与该特性密切相关的是将ref returns标为只读的功能。开发人员使用“in”参数,主要因为它能提供良好的性能,但是“in”参数不允许返回表达式的结果。返回值必须是正常ref返回的一个合法变量,其中可以包含数组元素、ref参数和对象中的域。


ref/in的扩展方法


“ref”扩展方法将允许扩展方法修改传递进来的结构体。需要编译器能验证传递给ref扩展方法的参数是可变的。


虽然“in”扩展方法不允许修改参数,但对于性能敏感的代码依然十分有用,尤其是结构体非常大的时候。这时当然不需要一个可变参数。


在上面两种情况下,该特性只能用于结构体。


编辑按:假定广泛使用了PureAttribute,编译器将不允许对“in”扩展方法调用非PureAttribute的方法。但由于对性能并无太大改善,因此不大可能广泛应用。


只读结构体


将结构体变量标为readonly可能会对性能产生影响。编译器无法确定某个调用是否会对结构体产生改动,因此会默认能够修改,并始终复制只读结构体变量的副本。


使用该特性,开发人员可以在类型层面上将整个结构体标为只读。这样一来,编译器就知道:在通过只读结构体的变量暴露该只读结构体时,不需要进行拷贝。


在建议中指出:


缺点


建议还指出,这些功能对已有代码不大可能有帮助,但在如下新场景中会很有用,例如:


在建议中也提出了警告,在“in”参数上的限制可循环作用于被调用函数。但这一问题并不严重,因为已经可以使用“out”参数执行同一操作了。


查看英文原文: C# Futures: Read-Only References and Structs


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java实现基本排序算法 下一篇如何用Java实现冒泡排序

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目