使用 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()返回在构造函数中分配的私有成员。
答案 0 :(得分:2)
在此删除静态:
private static string _rawStr
阅读static classes and static members,特别是:
无论创建了多少个类实例,都只存在一个静态成员的副本。