d语言的改进:默认不抛与安全
加抛
为函数属性
理由
当前,默认情况下允许函数引发异常.可以通过应用不抛
属性来更改此行为.但一旦不抛
在模块域或块
中使用,其域中的所有函数都会受到影响;
因此聚合不继承
从外部域的不抛
属性.如需要整个模块不抛
,那么该属性不仅必须在模块域内应用,而且必须在每个聚合的定义内应用:
空 栏(); //可抛
struct S1 {
不抛 void foo(){bar();}//错误,bar()抛
}
不抛{
struct S2{
void foo(){bar();}//正确,因为未应用`不抛`
}
}
问题是,即使在永不抛
的代码中,异常成本很高.因此,异常应该是选进
,而不是选出
.尽管此DIP不建议启用异常
,但抛
属性是其关键要求.该属性对文档也有帮助,是的,函数确实可抛
.
先前工作
@安全,@信任和@系统
属性可互相覆盖.
描述
加抛
到属性.加抛
到函数属性
.这与抛语句
的开头有歧义, 但可向前看是否式
后有个声明
来消歧.
该属性仅适用于函数和闭包
类型,忽略其他类型.如在函数声明中出现,则表明该函数可抛
出异常.
空 bar()抛 ;
struct S1 {
不抛 void foo(){bar();}//错误,bar()抛
}
struct S2 {
void foo(){bar();} //正确
}
不能同时抛
且不抛
,但可在闭域
内相互覆盖:
空 abc()抛 抛 ; //错误
void bar()抛 不抛 ; //错误
不抛:
foo()抛 ; //好
抛:
def()不抛 ; //好
语法变化
加抛
到函数属性
:
函数属性:
- 抛
不抛
纯
属性
重大变更和弃用
无
参考
Herb Sutter在"去碎片化的C++"的使异常更便宜且有用
中说:“一半以上C++用户在C++代码中全部或部分禁止了异常”.
将@安全
设为默认值
当前,D函数默认为@系统.本DIP建议将默认值改为@安全
.
理由
最初开发D时,几乎不额外检查安全@安全.但,随着不安全代码的成本越来越明显和昂贵
,且@安全函数
越来越强大,平衡已发生了变化.用户期望默认安全
,而不是相反.
先前工作
其他语言(如Rust和C#
)具有安全性,可选出
而不是选进
.
描述
当前未注解
函数(例如模板函数,嵌套函数和λ
)具有@安全/@系统
属性.此行为不变.而现在所有其他未注解
函数默认为@安全
而不是@系统
.
由于会破坏很多现有代码,可用编译器开关
启用它:
-preview=默认安全
,无语法变化.
重大变更和弃用
很可能会影响大量未注解@安全,@信任或@系统
的代码.幸运的是,方法很简单,尽管很麻烦:用@信任或@系统
注解不安全
的函数.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现