首页 > 解决方案 > 如何派生引用时生成的对象并仍然更新基础?

问题描述

我知道这个问题不是很清楚,我什至不知道可以用什么词来描述我正在尝试做的事情,但这个例子应该更清楚。

说这段代码

public string Underscores;
public string Spaces 
{ 
    get => Underscores.Replace('_', ' '); 
    set => Underscores = value.Replace(' ', '_'); 
}

在此示例中,Underscores 的值存储在内存中,但 Spaces 的值不是,而是在引用时动态生成。如果 Spaces 的值发生变化,Underscored 的值也会相应变化。我想做的是将这个概念扩展到结构和类:

struct StringStruct
{
    public string Value { get; set; }
}

...

public string Underscores;
public StringStruct Spaces
{
    get => new StringStruct { Value = Underscores.Replace('_', ' ') }; 
    set => UnderScores = value.Value.Replace(' ', '_') };
}

如果我用新的 StringStruct 覆盖 Spaces,它可以正常工作,但是尝试更改 Space 的 Value 属性的值会导致编译器错误,因为它不是变量。相同的场景,但 StringStruct 是一个类不会导致错误,但更改将被忽略,并且下划线将保持不变。

这些例子是为了解释而编造的,而不是我真正想要做的。

标签: c#.netproperties

解决方案


您的代码中的valueandUnderscores不是字符串,而是StrigStruct. 所以你不能string.Replace()在他们身上调用方法。

这将解决您的问题。

public StringStruct Underscores;
public StringStruct Spaces
{
    get => new StringStruct { Value = Underscores.Value.Replace('_', ' ') };
    set => Underscores = new StringStruct { Value = value.Value.Replace(' ', '_') };
}

编辑

在 OP 用新信息编辑帖子之后。

您收到错误的原因是因为Cannot modify the return value of 'expression' because it is not a variable您使用的是 a而不是 a ,因为它不是与 a 不同的引用类型。请在此处阅读更多内容。structStringStructclassstructclass


推荐阅读