Bis*_*ath 108 .net c# immutability
我正在创建一个不可变的类.
我已将所有属性标记为只读.
我有一个课程列表.
虽然如果属性是只读的,则可以修改列表.
公开列表的IEnumerable使其不可变.
我想知道为了使一个类不可变而必须遵循的基本规则是什么?
Bla*_*rad 117
我认为你走在正确的轨道上 -
Joe*_*Joe 17
要成为不可变的,所有属性和字段都应该是只读的.任何列表中的项目本身都应该是不可变的.
您可以按如下方式创建只读列表属性:
public class MyClass
{
public MyClass(..., IList<MyType> items)
{
...
_myReadOnlyList = new List<MyType>(items).AsReadOnly();
}
public IList<MyType> MyReadOnlyList
{
get { return _myReadOnlyList; }
}
private IList<MyType> _myReadOnlyList
}
Run Code Online (Sandbox Code Playgroud)
lub*_*sko 11
另外,请记住:
public readonly object[] MyObjects;
Run Code Online (Sandbox Code Playgroud)
即使用readonly关键字标记,也不是不可变的.您仍然可以通过索引访问器更改单个数组引用/值.
您所需要的只是 L...Ehmrecord
和C# 9.0或更高版本。
public record Customer(string FirstName, string LastName, IEnumerable<string> Items);
//...
var person = new Customer("Test", "test", new List<string>() { "Test1", "Test2", "Test3" });
// you can't change anything within person variable
// person.FirstName = "NewName";
Run Code Online (Sandbox Code Playgroud)
这被转换为名为 Customer 的不可变类,具有三个属性FirstName
、LastName
和Items
。
如果您需要一个不可变(只读)集合作为类的属性,最好将其公开为IEnumerable<T>
或ReadOnlyCollection<T>
比以下内容更好:System.Collections.Immutable
使用ReadOnlyCollection
类。它位于System.Collections.ObjectModel
命名空间中。
在返回列表的任何内容上(或在构造函数中),将列表设置为只读集合。
using System.Collections.ObjectModel;
...
public MyClass(..., List<ListItemType> theList, ...)
{
...
this.myListItemCollection= theList.AsReadOnly();
...
}
public ReadOnlyCollection<ListItemType> ListItems
{
get { return this.myListItemCollection; }
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
49883 次 |
最近记录: |