不可预见的词典行为

时间:2014-10-16 21:17:02

标签: c#

使用 C# Dictionary<TKey, TValue>课时,我遇到了一些好奇的行为。 首先介绍一下:

我有一个名为AVariable的类的定义:

public class AVariable
{
    public AType VarType { get; set; }

    public AObject Value { get; set; }

    public AVariable(AObject val, AType type)
    {
        VarType = type;
        Value = val;
    }
}

以下类在将它们插入到Dictionary

中时会处理这些变量
public class VariablePool
{
    private readonly Dictionary<string, AVariable> _runtimeVariableMap;

    public VariablePool()
    {
        _runtimeVariableMap = new Dictionary<string, AVariable>();
    }

    public void AddNewVariable(string name, AVariable vrb)
    {
        _runtimeVariableMap[name] = vrb;
    }

    public void DebugDump(TextWriter tw) // Just a demo for here
    { ... prints out stuff about variable...  }
} 

这就是我使用上述类的方法:

private static void Main(string[] args)
{
    var varPool = new VariablePool();
    varPool.AddNewVariable("a", new AVariable(new ANumeric(120), AType.ANumeric));
    varPool.AddNewVariable("b", new AVariable(new ANumeric(130), AType.ANumeric));
    varPool.AddNewVariable("c", new AVariable(new AString("Hello"), AType.AString));
    varPool.AddNewVariable("d", new AVariable(new AString("World"), AType.AString));
    varPool.DebugDump(Console.Out);
    Console.Read();
}

编辑:A [类型]层次结构

public class AObject
{
}

public class AString : AObject
{
    private static string _rawStr;

    public AString(string str)
    {
        _rawStr = str;
    }

    public AString(AString str)
    {
        _rawStr = str.GetRawValue();
    }

    public string GetRawValue()
    {
        return _rawStr;
    }
}

public class ANumeric : AObject
{
    private static double _rawVal;

    public ANumeric(double val)
    {
        _rawVal = val;
    }

    public ANumeric(ANumeric num)
    {
        _rawVal = num.GetRawValue();
    }

    public double GetRawValue()
    {
        return _rawVal;
    }
}

我期望成为DebugDump的输出:

Name: a
Type: ANumeric
Value: 120

Name: b
Type: ANumeric
Value: 130


Name: c
Type: AString
Value: Hello

Name: d
Type: AString
Value: World

实际发生的事情:

Name: a
Type: ANumeric
Value: 130

Name: b
Type: ANumeric
Value: 130

Name: c
Type: AString
Value: World


Name: d
Type: AString
Value: World

我的问题很简单:为什么会这样?为什么最后Value应用于所有相同类型的变量?

感谢您的时间。

编辑: GetRawValue()返回在构造函数中分配的私有成员。

1 个答案:

答案 0 :(得分:2)

在此删除静态:

private static string _rawStr

阅读static classes and static members,特别是:

  

无论创建了多少个类实例,都只存在一个静态成员的副本。