27用d编程消灭

class LifetimeObserved {
    int[] array;
    static size_t counter;//静态成员

    this() {
        array.length = 30_000;
        ++counter;
    }//结构好像没有().

    ~this() {
        --counter;
    }
}
import std.stdio;

void main() {
    foreach (i; 0 .. 20) {
        auto variable = new LifetimeObserved;
        write(LifetimeObserved.counter, ' ');
        destroy(variable);//后来加上
    }//1 2 3 4 5 6 7 8 2 3 4 
    //未执行析构
    //1 1 1 1 1 1 1 1

    writeln();

//按值传递的,生命期完,执行析构.
//按引用传递的,交给垃集.
//消灭时,指针为空针,但实体交给垃集来处理

问题是抛异常时,还未执行消灭(...),就退出区间了.
这时可用,std.typecons.scoped来代替new,其将类对象包含在结构中,这样退出区间时析构函数就调用类的析构函数了.

import std.typecons;
// ...
void main() {
    const courses = scoped!XmlElement("courses", 0);

    foreach (courseId; 0 .. 2) {
        const courseTag = "course" ~ to!string(courseId);
        const courseElement = scoped!XmlElement(courseTag, 1);

        foreach (i; 0 .. 3) {
            const gradeElement = scoped!XmlElement("grade", 2);
            const randomGrade = uniform(50, 101);

            writeln(indentationString(3), randomGrade);
        }//没有消灭()了,自动调用
    }
}
//----
import std.typecons;

class C {
    void foo() {
    }
}

void main() {
    auto p = scoped!C();
    p.foo();    //就是C,没啥区别,只是出域就退出了
}
//但不能这样:
    C c = scoped!C();//代理转为原来了,移动了,原来的实体.
    c.foo();    //出错. 
    C         a = scoped!C();    // <- 漏洞
    auto      b = scoped!C();    // <- 正确
    const     c = scoped!C();    // <- 正确
    immutable d = scoped!C();    // <- 正确
posted @   zjh6  阅读(11)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示