gpt4 book ai didi

C#不可变对象(immutable对象)setter理解

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:43 24 4
gpt4 key购买 nike

我有不可变类 F1。我想改变其中一个领域。在 set 方法中,我必须返回 F1 类的新实例并进行更改。我不明白我该怎么做。

public class F1
{
public readonly int k1;
public readonly ImmutableList<int> k2;

public F1(int k)
{
...
}

public int GetItem(int pos)
{
return k2[pos];
}

public F1 SetItem(int pos, int val)
{
return new F1() // How i can create new instance with changes in pos
}
}

String.cs中有Replace方法。 String 是 C# 中的不可变类(或者我认为是)。替换方法定义如下:

[SecuritySafeCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
private string ReplaceInternal(char oldChar, char newChar);

[__DynamicallyInvokable]
public string Replace(char oldChar, char newChar)
{
return this.ReplaceInternal(oldChar, newChar);
}

所以我不知道 ReplaceInternal 是如何工作的,因此找不到我的问题的答案。

最佳答案

很难说出您到底想在构造函数中做什么,但您可以添加另一个接受 ImmutableList 的构造函数,如 Kryzsztof 所示,并像这样修改 SetItem 方法:

public F1 SetItem(int pos, int val)
{
return new F1(k1, k2.SetItem(pos, val));
}

完整实现:​​

public class F1
{
public readonly int k1;
public readonly ImmutableList<int> k2;

public F1(int k)
{
...
}

private F1(int k1, ImmutableList<int> k2)
{
this.k1 = k1;
this.k2 = k2;
}

public int GetItem(int pos)
{
return k2[pos];
}

public F1 SetItem(int pos, int val)
{
return new F1(k1, k2.SetItem(pos, val));
}
}

请注意,我将新的构造函数设为私有(private),假设您不想出于此目的之外的任何目的公开此构造函数。

编辑:我还应该注意,ImmutableList 的语义是这样的,即使用典型列表方法对列表进行的任何修改都会产生一个新列表,例如对 SetItem 的调用:

k2.SetItem(pos, val)

关于C#不可变对象(immutable对象)setter理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32799288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com