我想记录我的键盘击打。但是,当我向keyList添加新键盘时,它会将所有项目更改为新键盘。例如,如果keyList包含A和B,并且我键入C,那么我的keyList将是C,C,C而不是A,B,C。
你知道是什么导致了这个问题吗?我不应该使用List吗?
KeyboardEvent myKeyBoardEvent = new KeyboardEvent();
List<KeyboardEvent> keyList = new List<KeyboardEvent>();
List<WorkflowEvent> myLogs = new List<WorkflowEvent>();
public void LogKeyboadEvent(Key keyboard)
{
myKeyBoardEvent.Key = keyboard.ToString();
keyList.Add(myKeyBoardEvent);
myLogs.Add(myKeyBoardEvent);
}发布于 2009-06-11 15:04:59
KeyboardEvent是一个类,因此“通过引用”传递。这意味着你只有一份副本。您正在将同一对象添加到列表中3次。
这也会有相同的效果:
myKeyBoardEvent.Key = "A";
myLogs.Add(myKeyBoardEvent);
myLogs.Add(myKeyBoardEvent);
myLogs.Add(myKeyBoardEvent);
myKeyBoardEvent.Key = "C";列表现在将包含: C、C、C
要解决此问题,请将myKeyBoardEvent设置为函数的本地,并且每次只创建一个新的KeyboardEvent。
下面是一个固定的版本:
List<KeyboardEvent> keyList = new List<KeyboardEvent>();
List<WorkflowEvent> myLogs = new List<WorkflowEvent>();
public void LogKeyboadEvent(Key keyboard)
{
KeyboardEvent myKeyBoardEvent = new KeyboardEvent();
myKeyBoardEvent.Key = keyboard.ToString();
keyList.Add(myKeyBoardEvent);
myLogs.Add(myKeyBoardEvent);
}发布于 2009-06-11 15:07:03
这是一个基本的问题。myKeyBoardEvent是一个引用而不是一个值,list包含对同一对象的引用。
正确的实现应该是:
public void LogKeyboadEvent(Key keyboard)
{
keyBoardEvent = new KeyboardEvent();
keyBoardEvent.Key = keyboard.ToString();
keyList.Add(keyBoardEvent);
myLogs.Add(keyBoardEvent);
}在这里它可以工作,但是更改myLogs列表上的对象也会更改keyList上的对象。其他方法将占用更多内存,但将保护它不受更改的影响:
public void LogKeyboadEvent(Key keyboard)
{
keyBoardEvent = new KeyboardEvent();
keyBoardEvent.Key = keyboard.ToString();
keyList.Add(keyBoardEvent);
keyBoardEvent2 = new KeyboardEvent();
keyBoardEvent2.Key = keyboard.ToString();
myLogs.Add(keyBoardEvent2);
}第三种方法是使用List,但这里没有代码。
https://stackoverflow.com/questions/981641
复制相似问题