【问题标题】:How can I derive an object generated when referenced and still update the base?如何派生引用时生成的对象并仍然更新基础?
【发布时间】:2020-07-10 22:48:10
【问题描述】:

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

说这段代码

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 是一个类不会导致错误,但更改将被忽略,下划线将保持不变。

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

【问题讨论】:

  • value 在以下代码中是指StringStruct 的实例,而不是字符串:value.Replace(' ', '_')。但是Replace()是一个字符串函数。
  • 糟糕,我会更新示例

标签: c# .net properties


【解决方案1】:

代码中的valueUnderscores 不是字符串,而是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 错误的原因是因为您使用struct 代替StringStruct 而不是class,因为struct 不是与class 不同的引用类型。请阅读更多here

【讨论】:

  • 是和不是。我注意到了这个问题并更新了结构。问题在于如何允许修改“派生”结构的属性并反映“派生”结构所基于的变量的变化,并可能对类做同样的事情。
  • 这个例子在它自己的作品上,但问题是当试图做类似Spaces.Value = "abc";的事情时,我知道我构造它的方式是不可能的,我正在寻找一种新的方法来实现它无需存储下划线和空格即可。
  • 好的,那是因为您使用的是struct 而不是class(在此处阅读:stackoverflow.com/a/1747702/302248
  • 对,使用结构会出错,但用类替换它仍然无法解决。虽然没有错误,但更改被忽略,下划线保持不变。理想情况下,它应该调用 setter,其中 value 是 getter 返回值的修改版本,但它看起来不像这样。
  • 是的,但这是预期的行为,不是吗?您只是在StringStruct 中覆盖Value 属性的值。您的解决方案是您应该只将 Value 设为吸气剂,并使用 Replace 进行设置。我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2017-02-26
  • 2020-10-11
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多