D中的仅不可变类

D中的仅不可变类,d,D,如何创建一个不可变的类 我的目标是创建一个实例总是不可变的类。现在我只是用不可变的方法和构造函数创建一个“可变”类。我叫它mData,我代表可变的。然后我制作了一个别名别名不可变(mData)数据并在任何地方使用它,而不是类名。这很有效,但似乎没有必要 如果我用immutable(immutable class Data{…})标记类定义,那么就不会遵循类的用法。因此,如果我从另一个类或函数中使用它并调用不可变方法(它们都是),编译器会抱怨在可变对象上调用不可变方法,即使根据定义该类是不可变的!

如何创建一个不可变的类

我的目标是创建一个实例总是不可变的类。现在我只是用不可变的方法和构造函数创建一个“可变”类。我叫它mData,我代表可变的。然后我制作了一个别名
别名不可变(mData)数据
并在任何地方使用它,而不是类名。这很有效,但似乎没有必要

如果我用immutable(
immutable class Data{…}
)标记类定义,那么就不会遵循类的用法。因此,如果我从另一个类或函数中使用它并调用不可变方法(它们都是),编译器会抱怨在可变对象上调用不可变方法,即使根据定义该类是不可变的!为了解决这个问题,我必须在所有类型名称前面添加immutable关键字。这就是化名真正为我做的

别名真的是最好的方法吗? 不可变关键字对类定义有什么作用? 如果它什么也不做,这不应该是某种警告或错误吗

(在Windows 8上使用Xamarin Studio和dub以及DMD32 D编译器v2.066.0)

我认为alias是最好的方法,再加上类外不可变的特性。后者的作用是:

如果一个类声明有一个常量、不可变或共享存储类,那么就好像该类的每个成员都是用该存储类声明的一样。如果基类是常量、不可变或共享的,那么从它派生的所有类也都是常量、不可变或共享的

因此,它避免了对内部所有内容设置不可变,也适用于继承。但是它并没有改变类型本身-
数据
仍然是一个可变的引用,只引用所有不可变的数据(顺便说一句,这有时可能很有用,因为它可以很容易地重新绑定到另一个实例)。您的别名实现了类型的全部更改

顺便说一句,还要向不可变类添加构造函数。即使它只是空的,不可变构造函数的存在(如果您将不可变放在外部,这将是全部)将完全禁止可变构造:

immutable class Foo { }

Foo foo = new Foo(); // permitted. All the data will be immutable, but it will let you construct it this way

immutable class Foo {
    this() {} 
}         

Foo foo = new Foo(); // Error: immutable method test100.Foo.this is not callable using a mutable object
那么你想用

auto foo = new immutable Foo(); // (infers based on right hand side)
你也可以这样写:

immutable foo = new immutable Foo(); // (infers always to an immutable type)

取决于你喜欢什么

immutable(Foo) foo = new immutable Foo(); // (explicitly writing the immutable type)