D中C#`readonly`关键字的等价物?

栏目: C# · 发布时间: 5年前

内容简介:根据我在阅读D时的理解,当在变量上使用immutable关键字时,变量的值必须在编译时知道,而C#的readonly不需要,并且readonly字段可以在类构造函数中使用non分配 – 静态价值观.这可能在D?翻译自:https://stackoverflow.com/questions/6036807/equivalent-of-c-sharp-readonly-keyword-in-d

根据我在阅读D时的理解,当在变量上使用immutable关键字时,变量的值必须在编译时知道,而C#的readonly不需要,并且readonly字段可以在类构造函数中使用non分配 – 静态价值观.这可能在D?

由于似乎存在一些关于不可变的混淆(来自原始问题和he_the_great的评论),我想我会补充一下.

当你说immutable int i = 42时,你说我不会被修改,而不是在编译时知道它的值. immutable实际上是一个类型修饰符,并创建一个新类型. immutable T是不可变(T)的简写. immutable(T)创建一个永远不会变异的T,也就是说,如果你读取了值,然后调用一个函数,则值将是相同的.将此与const(T)进行比较,它提供了较弱的保证,即该类型的实例不会被修改,但有人可能对其他地方有可变的访问权限,所以如果你读取该值然后调用一个函数,你就不能假设价值会是一样的.

通常,不可变(T)!= T.但是在某些情况下,它们可以隐式地相互转换.例如,如果T是一种据说没有“可变间接”的类型.也就是说,如果我传递一个函数一个不可变(int),它们会收到一个副本 – 如果类型系统不允许,那么该函数无法修改我传递的值,因为它被复制了它只会令人烦恼而没有额外的保证,所以D型系统允许它.但是,如果我传递一个immutable(int *),那么可以通过调用函数进行更改.在结构的情况下,如果任何成员具有可变间接,那么结构也被认为具有它.

因此,为了摆脱理论并回到更实际的问题,在编译时必须知道不可变值,并且没有好的方法来创建它们.但是,唯一的突变可能发生在构造函数内部.对于简单的标量类型,这很明显:

immutable(int) i = rand();

但是像物体一样呢?好吧,构建我们使用的类型T.

auto t = new T();

所以要构造我们使用的类型immutable(T)

auto t = new immutable(T)();

这是一个更完整的小例子

class Useless
{
    int i;

    this(int i)
    {
        this.i = i;
    }
}

int main(string[] args)
{
    auto o = new immutable(Useless)(cast(int) args.length);
    //o.i = 17;  error
    return o.i;  // fine
}

如您所见,构造函数内部可能发生变异.您可以读取成员变量,但不能写它们(不可变是传递的;也就是说,如果父进程,每个成员(以及成员的每个成员)都变为不可变.只有当它们被标记为const时才能调用方法.

我为偏离话题的漫无边际道歉,但我看到很多人似乎对这个话题感到困惑.

翻译自:https://stackoverflow.com/questions/6036807/equivalent-of-c-sharp-readonly-keyword-in-d


以上所述就是小编给大家介绍的《D中C#`readonly`关键字的等价物?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First Design Patterns

Head First Design Patterns

Elisabeth Freeman、Eric Freeman、Bert Bates、Kathy Sierra、Elisabeth Robson / O'Reilly Media / 2004-11-1 / USD 49.99

You're not alone. At any given moment, somewhere in the world someone struggles with the same software design problems you have. You know you don't want to reinvent the wheel (or worse, a flat tire),......一起来看看 《Head First Design Patterns》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具