d改进:参数中的引用

//1,ref,想返回的任何参数引用,必须用`中`
//模板与λ可以推导,其余则必须手动加属性
@safe:
ref int fun(ref int a) { return a; }//错误
ref int gun(return ref int a) { return a; } //好
ref T hun(T)(ref T a) { return a; } //好,自动推导
//2,悬挂引用,弱
ref int fun(int x) {//x在栈参数上,所以也算错
  return x; //错误:转义局部变量x的引用
}
ref int gun() {
  int x;return x; //错误:转义局部变量x的引用
}
struct S {int x;}
ref int hun() {
  S s;return s.x;//有问题
}
ref int iun() {
  int a[42];return a[5];//有问题
}
//3,绕过(作用域和生命期)
ref int identity(ref int x) {
  return x; //啥都没干
}

ref int fun(int x) {//可能是转义整为地址吧?
  return identity(x); //转义参数地址.
}

ref int gun() {
  int x;return identity(x); //转义局部为地址?
}
//所谓的转义,就是在x可能已是垃圾数据的栈中,将垃圾数据转义成引用,即乱转

struct S {
    int x;
    ref int get() { return x; }
}

ref int hun(S x) {
  return x.get; //转义部分参数地址?
}

ref int iun() {
  S s;return s.get;//转义本地地址
}

ref int jun() {
  return S().get;//最差,转义部分右值地址
}
//没用递归,可自动发现
//代码可用.但编译器看不见(标识或主体)的函数体.得设计出通过给定签名(而不是函数体),得出安全分析的足够信息
//本改进,允许按引用的对象下传至函数,并从函数返回引用,而当引用指向未分配块时,禁止再使用引用
//问题是返回引用为T的类型检查函数,接收自己按引用的一些参数
//一是返回本地引用,已部分解决,但关键是参数
//提议,中+引用,将参数的生命期扩展至函数返回
@safe ref int wrongIdentity(ref int x) { 
    return x; //错误!不能返回参数引用,用"中 引用"
}
@safe ref int identity(return ref int x) { 
    return x; // 好
}//通过标识return,说明x和相关调用函数的生命期>=标识函数的生命期
@safe ref int fun(return ref int x) {//return
    //表明,参数的x在fun函数外,可能仍存在
    int a;return a; //错误
    static int b;return b;//当前正确,可以局部返回
    return identity(a);//错误,转义局部地址
    return x;//正确,延长x的生命期
    return identity(x);//id函数仍为延长,正确
    return identity(identity(x)); //正确,延长
}
@safe ref int gun(ref int input) {
    static int[42] data;
    return data[input];//工作,总是可以返回静态对象
}//静态对象,类似全局,

@safe struct S {
    private int x;
    ref int get() return { return x; }//应工作,见下
}
//句法上当前在同一参数上同时用`auto ref`和`return ref`不合法.返回属性,也可用,中=>其实就是扩展生命期
auto ref T identity(auto ref T x) {
    return x;//正确,auto->扩展了
}//通用,自动推导,就自动扩展了(纯,泛型和λ)
@safe ref int fun(return ref float x);
//当前改进忽略类型,允许这种转换,但函数作者可能会限制输出的生命期
//多个`中 引用`,则生命期为最短的那个
//带`中`的成员函数返回引用则必须保证,函数的生命期不能超过`this`.
@safe struct S {
    static int a;
    int b;
    ref int fun() { return a; } //好,静态,无穷期
    ref int gun() { return b; } //错误!不能返回直接成员
    ref int hun() return { return b; }//好,b返回的生命期扩展至this(生命期)这么长.
}
//当前仅标记为@safe且返回参数引用的函数,在参数上必须加`中`.避免打断其他代码,且不清楚是否与系统语言的有效构造冲突.
@safe   ref int fun(ref int x)        { return x;} //错误
@safe   ref int gun(return ref int x) { return x;} //好
@system ref int hun(ref int x)        { return x;} //目前好,@system码,即不安全嘛.
@system ref int jun(return ref int x) { return x;} //最好,给出x的生命期(编译器)

可发现包含的意思.
直接退出(),不会运行模块析构函数,文件句柄,缓存刷新未反应.
D守护线程随机崩溃.
-preview = Feature表示启用Feature可以在它成为默认值之前对其进行试用。 -revert = Feature表示禁用已成为默认功能的功能,因为您的代码尚未准备好。
package int a;代表级别可访问.
D中的数组仅表示为指针和长度(并且仅在调整大小/串联时分配),因此表达式pixels[w*y..w*(y+1)]不创建副本。
感觉我写的一些掉了.小内存下,chrome没事就清掉部分标签页,真是有毛病.
一篇好文章.
干就行了.
区域标记你不准备存储的引用.
类析构器,确保你不访问任何对象外部的内存或人工管理类内存.
别名本可能转义引用,其允许隐式转换,让用户绕开禁止后传输,绕过对数据的引用.
通过用@禁止本(本);禁止后传输.

posted @   zjh6  阅读(11)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示