导读:各位,微软开始向Rust看齐了,最看重的便是安全特性。
Lander 如此表示道:“我们设想,未来 C# 将与一系列其他语言一起,因其类型和内存安全保障而受到青睐。”
许多 C# 开发者写了好多年程序,但有的从未使用过unsafe 关键字,但其实自 C# 语言最初发布以来就已存在。“编写 unsafe 代码就像在 C# 程序中编写 C 代码一样,”C# 的作者 Anders Hejlsberg 等人撰写的早期著作《C# 程序设计语言》中这样描写道。
需要使用 unsafe 代码的情况包括与底层操作系统进行互操作、访问内存映射设备或实现时间关键型代码。unsafe 代码允许使用指针类型(.NET 垃圾回收器不会跟踪这些类型)和指针运算符。除此之外,现有的 unsafe 修饰符对类型或成员没有其他影响。
这种情况将在 C# 16 中改变,C# 16 比现在晚两个版本,根据 .NET 的年度发布周期,它将于 2027 年底发布,届时还将发布 .NET 12,而 .NET 12 将是一个长期支持 (LTS) 版本。开发者还可以期待在 C# 15 和 .NET 11 中看到预览版。
根据当前的语言提案,在新模型中,将方法标记为不安全也会将其标记为“需要不安全”,这意味着调用者必须处于不安全的上下文中,并且如果基类成员是安全的,则重写的方法不能是不安全的。这意味着不安全标记会一直传递给调用者,直到通过在方法中包含不安全的上下文(但不将该方法标记为不安全)来抑制它为止。
也有人质疑,为什么团队要依靠“unsafe”关键字的缺失来抑制传播,而不是使用“safe”关键字。“我一直在向设计团队建议这样做,”Lander说道 。
以后将无法再将类型标记为unsafe;不安全范围将下移至各个方法、属性和字段。
C# 的另一个变化是,使用指针类型和某些指针表达式将不再被视为不安全;只有解引用指针并因此访问非托管内存才需要不安全的上下文。
Lander表示,C# 16将采用可选加入的方式,这表示着开发者可以继续使用C# 1.0模型,但.NET运行时库需要选择加入。此外微软正在考虑在.NET包存储库NuGet的包上添加徽章,以显示包是否已选择加入,从而鼓励用户采用新模型。未来版本的C#可能会改为选择退出。“我们的目标是让新的C#安全模型成为新的标准,”Lander说道。
其目的并非降低不安全代码的危险性,而是使其更易于查看和审查。这同样适用于安全文档,例如在不安全成员上添加注释,定义其使用规范,静态代码分析器会鼓励这种做法。
目前开发者的反应大多是积极的。“我既是 C# 开发者也是 Rust 开发者,我非常欢迎这种改变……如果 C# 能更接近托管版的 Rust,我也不会反对,”一位开发者高兴地说道 。
这项提案的一个奇怪之处在于,从事业务应用程序开发的 C# 开发人员不会注意到任何变化,因为他们从不使用不安全的代码。尽管如此,Lander 表示,“这项功能是我们能够做出的最具影响力的改进之一”,以提升人们对 C# 代码安全性的信心。
作者:场长
参考:
https://devblogs.microsoft.com/dotnet/improving-csharp-memory-safety/
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。