变量赋值设置其他变量

时间:2017-10-26 15:36:30

标签: c# .net

这种方法的实际内容并不重要,因为我猜这个问题特定于语言本身。所以就这样了。

这是我的方法片段:

private CellValidation.CellValidationResult Validate<B, I>(CellValidation cellToValidate, IList<B> baseListToValidateAgainst, IList<I> importListToValidateAgainst, string invalidMessage, DDSFieldEnum fieldEnum) where I : Entities.DDS.DDSEntityFieldBase where B : Entities.DDS.

    //Remove all dashes and /'s for a more realistic mapping check. We don't want the mapping to fail just because the imports - may be different. Also, create local variables of the list as don't want to modify the actual db. 
    cellToValidate.Value = cellToValidate.Value.Replace("-", " ").Trim().ToLower();

   // IList<B> baseList;
    var baseList = baseListToValidateAgainst;
    baseList.Select(x => { x.Value = x.Value.Replace("-", " ").Trim().ToLower(); return x; }).
...

所以我清楚地将本地baseList变量设置为等于传入的参数,然后我修改baseList变量。

但是,这似乎修改了参数baseListToValidateAgainst,而不仅仅是局部变量baseList。那是为什么?

3 个答案:

答案 0 :(得分:1)

如您对问题的评论中所述,您制作原始列表的副本,而是将变量baseListToValidateAgainst指定为与{{1}相同的引用}}

如果您想要列表的新副本,请尝试baseListToValidateAgainst.ToList()

答案 1 :(得分:1)

当您将baseList设置为baseListToValidateAgainst时,您没有复制原始列表;您只需为原始文件创建参考。您对baseList所做的任何更改都会对baseListToValidateAgainst对象进行。

这将复制:

var baseList = baseListToValidateAgainst.ToList();

此外,如果类型B是可变的,则创建列表副本是不够的:您还需要创建单个项目的副本。这一步可能不是直截了当的,因为它依赖于B中存在的方法,它为您提供了一个副本。例如,如果Entities.DDS有一个成员来制作该对象的副本,您可以这样写:

var baseList = baseListToValidateAgainst.Select(i => (B)i.Copy()).ToList();

答案 2 :(得分:-1)

  

然后我修改了baseList变量

不,你还没有修改它。您既没有修改变量(以后没有对它进行赋值,这是修改变量的意思),也没有修改变量引用的列表(您没有调用{的方法) {1}}改变它,例如ListAdd),也没有改变该列表中的任何对象(你定义了一个查询,执行该查询时它会改变变量引用的列表中的项目,但是你从未真正执行过该查询,所以这些项目永远不会发生变异。

您应该避免引起副作用的查询。他们很困惑。如果要对该列表中的所有项目执行某些操作,请使用Remove,这是该特定任务的正确工具:

foreach

现在你已成功改变了该列表中的项目。