【问题标题】:Why value doesn't want to change?为什么价值不想改变?
【发布时间】:2019-09-22 10:08:44
【问题描述】:

我得到了一部分代码来保存游戏变量。

Var 结构很简单:

struct Var{
/// <summary>
/// Name of variable. Unchangable
/// </summary>
public string Name { get; private set; }
/// <summary>
/// Value of variable. Can be changed via <see cref="Change(string)"/>.
/// </summary>
public string Value { get; private set; }

public Var(string s, string value) {
    this.Name = s;
    this.Value = value;
}


public void Change(string v) {
    new Debug("b", $@"Changing value from ""{Value}"" to ""{v}""", Debug.Importance.ERROR);
    this.Value = v;
    new Debug("b", $@"Result: ""{Value}""", Debug.Importance.ERROR);
}
}

new Debug(string, string, Debug.Importance) 是一个函数,在每个文件中只调用Conosle.WriteLine() 而没有using System

GameVars 类是这些列表。

我使用索引器通过变量获取Var

public string this[string s] {
    get => vars.Find(e => e.Name == s).Value;
    set {
        new Debug("a", $@"Attempt to change value of ""{s}"" to ""{value}"".", Debug.Importance.ERROR);
        if( vars.Find(e => e.Name == s).Name != null )
            vars.Find(e => e.Name == s).Change(value);
        else
            vars.Add(new Var(s, value));
        new Debug("a", $@"Result: ""{this[s]}""", Debug.Importance.ERROR);
    }
}

当我在GameVars.LoadFromFile(string s) 使用时

this[ident] = value;

new Debug("", $"When do i Fire? {this[ident]}", Debug.Importance.ERROR);

if( this[ident] != value )
    throw new System.Exception("Could not change value!");

我得到以下输出:

[ERROR]( a ) Attempt to change value of "version" to "beta 0.0.0.1".
[ERROR]( b ) Changing value from "beta 0.0.0..1" to "beta 0.0.0.1"
[ERROR]( b ) Result: "beta 0.0.0.1"
[ERROR]( a ) Result: "beta 0.0.0..1"
[ERROR](  ) When do i Fire? beta 0.0.0..1
Exception thrown: 'System.Exception' in ITW.exe
An unhandled exception of type 'System.Exception' occurred in ITW.exe
Could not change value!

为什么值没有变化?

我尝试将所有内容更改为公开,但没有任何帮助。我用Console.WriteLine() 检查了所有内容,没有什么可以覆盖这个值。它只是不会更改为新的。

Minimal runnable code on Rextester

【问题讨论】:

  • 仅供参考,“方括号 getter/setter”称为"indexer"
  • 也通俗地称为“索引属性”。
  • 您能否将其简化为可以复制/粘贴和调试的独立控制台应用程序,以便我们观察行为?
  • 也许它不想改变,因为它喜欢保持旧值。
  • 在 Rextester 的代码中,Var 是一个结构体。但在上面,Var 是一个类。这很重要,因为 vars.Find(e =&gt; e.Name == s).Change(value); 对于值类型和引用类型的工作方式不同。

标签: c# private indexer


【解决方案1】:

@wimh 想通了:

.Find() 与结构一起使用会返回副本并且不会更改原始文件。 Fiddle

谢谢

修复它的代码,但 Var 仍然是一个结构:

vars[vars.FindIndex(e => e.Name == s)] = new Var(s, value);

而不是

vars.Find(e=>e.Name==s).Change(value);

我删除了Var.Change,因为它不再有用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多