C# C语言中的Byref问题#

C# C语言中的Byref问题#,c#,C#,我在使用一本字典时遇到困难,我想将更新版本与原始版本进行比较 第一个方法在字典中传递,然后从那里传递到更新该字典的静态帮助器类 在将原始词典传递给helper类之前,我想复制一份原始词典,以便比较 这就是我遇到麻烦的地方。在helper类之后,字典的“副本”也被更新了 我甚至尝试过创建一个包含字典的结构,认为它可以复制原始字典值,但这似乎也是通过ref实现的!下面是一段代码 public PartialViewResult updateItem(string submit, FormCollec

我在使用一本字典时遇到困难,我想将更新版本与原始版本进行比较

第一个方法在字典中传递,然后从那里传递到更新该字典的静态帮助器类

在将原始词典传递给helper类之前,我想复制一份原始词典,以便比较

这就是我遇到麻烦的地方。在helper类之后,字典的“副本”也被更新了

我甚至尝试过创建一个包含字典的结构,认为它可以复制原始字典值,但这似乎也是通过ref实现的!下面是一段代码

public PartialViewResult updateItem(string submit, FormCollection Collection)
{            
    SurveyItem UpdatedItem = new SurveyItem();
    ItemSettingsCopy OriginalSettings;

    ItemBank CurrentSurvey = (ItemBank)Session["Survey"];

    string _itemName = (string)Session["CurrentItem"];

    OriginalSettings.ItemSettings = CurrentSurvey[_itemName].ItemSettings;  
    //this is where I'm trying to make a copy of the original settings.

    UpdatedItem = BankManagerHelper.UpdateItem(CurrentSurvey[_itemName], Collection, submit);  //static item now updates the fields in the item

    //AT THIS POINT OriginalSettings.ItemSettings HAS BEEN CHANGED TOO
这就是我遇到麻烦的地方。在helper类之后,“copy” 词典的版本也已更新

是的,因为您实际上正在更新内存中的相同变量。当您将
字典
作为函数的参数传递时,实际上是将引用传递给变量

在调用
UpdateItem
方法之前,您可以创建一个包含相同对象列表的新字典。然后,内存中将有两个不同的对象,这样就可以比较它们了


请注意,您可能希望创建存储在词典中的项的新实例,或者这两个词典都包含对相同对象的引用(我不知道您是要比较词典本身还是要比较存储在词典中的对象)。

您需要克隆词典

这个答案是一条路要走

[此代码是从链接复制的]

public static Dictionary<TKey, TValue> CloneDictionaryCloningValues<TKey, TValue>
                        (Dictionary<TKey, TValue> original) where TValue : ICloneable
{
    Dictionary<TKey, TValue> ret = new Dictionary<TKey, TValue>(original.Count,
                                                        original.Comparer);
    foreach (KeyValuePair<TKey, TValue> entry in original)
    {
       ret.Add(entry.Key, (TValue) entry.Value.Clone());
    }
    return ret;
}
公共静态字典clonedictionary值
(字典原文)其中TValue:iClonable
{
Dictionary ret=新字典(original.Count,
原件(比较器);
foreach(原始的KeyValuePair条目)
{
ret.Add(entry.Key,(TValue)entry.Value.Clone());
}
返回ret;
}

但是我如何将这些值放入新字典中而不将其作为参考的一部分呢?我们这里要讨论的是深度复制与浅复制>谢谢!我最终使用了这个:var newDictionary=oldDictionary.ToDictionary(entry=>entry.Key,entry=>entry.Value);