调用方法后,方法参数的值会更改

时间:2013-10-28 14:20:06

标签: c# mono

也许我太累了,我很幻觉,或者说C#+ Mono确实有问题!!

当我遇到SetPropertyValueJsonSerializerInternalReader方法时,我正在Json.Net进行测试和调试。此方法调用另一个名为CalculatePropertyDetails的私有方法。传递给CalculatePropertyDetails的其中一个参数称为reader类型JsonReader。这个对象在传递给CalculatePropertyDetails方法之前已经有了值,之后它就是null !!

我知道这听起来很愚蠢,相信我并不天真,但是为了看到这种奇怪的行为会发生什么呢?谁能想出一个合理的解释?我所知道的是,这个项目不是多线程的,结果是可重现的。

我得到的唯一证据是我的调用堆栈顶部的两个条目:

Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CalculatePropertyDetails (property={Id}, propertyConverter={JsonRpcTest.ObjectIdConverter}, containerContract={Newtonsoft.Json.Serialization.JsonObjectContract}, containerProperty=(null), reader=(null), target=(null), useExistingValue=false, currentValue=(null), propertyContract=(null), gottenCurrentValue=false) in Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs:792
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue (property={Id}, propertyConverter={JsonRpcTest.ObjectIdConverter}, containerContract={Newtonsoft.Json.Serialization.JsonObjectContract}, containerProperty=(null), reader={Newtonsoft.Json.JsonTextReader}, target={JsonRpcTest.E}) in Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs:750

查找reader参数。

我正在使用Ubuntu 12.04,Mono 3.2.3和Monodevelop 4.1.7,项目是使用Mono / .Net 4.5开发的。

[UPDATE]

以下是定义SetPropertyValue的位置以及调用CalculatePropertyDetails的部分代码:

private bool SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, object target)
{
    object currentValue;
    bool useExistingValue;
    JsonContract propertyContract;
    bool gottenCurrentValue;

    if (CalculatePropertyDetails(property, ref propertyConverter, containerContract, containerProperty, reader, target, out useExistingValue, out currentValue, out propertyContract, out gottenCurrentValue))
        return false;

1 个答案:

答案 0 :(得分:4)

可能是GC在执行时收集你的对象?我在其中一个单叉中看到了这种行为。您可以检查它 - 在SetPropertyValue的父类中使用reader对象创建公共字段,并使用实际的reader设置它。如果是GC问题,在此之后不应该为空。