Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与此不同的是.Property和C#NET中的属性_C#_Android_Properties_Mono_This - Fatal编程技术网

与此不同的是.Property和C#NET中的属性

与此不同的是.Property和C#NET中的属性,c#,android,properties,mono,this,C#,Android,Properties,Mono,This,我们一直在努力调试一些非常奇怪的东西,我想了解一下为什么/发生了什么。当然,让我给你一些背景知识 一个简单的方法使用其ViewModel进行异步调用,使用其中的ViewModel的一个属性 在通话的一方,我们的财产(为了这个例子,我们称之为“行程”)在那里,完好无损。在方法的另一端,在异步调用内部,由于某种原因,它是null 堆栈跟踪显示中间的行程为空,其中只调用System.Runtime方法,不可能影响行程本身 我们花了大约3个小时研究这个堆栈跟踪和代码变量,从非null到null 即使它的

我们一直在努力调试一些非常奇怪的东西,我想了解一下为什么/发生了什么。当然,让我给你一些背景知识

一个简单的方法使用其
ViewModel
进行异步调用,使用其中的
ViewModel的一个属性

在通话的一方,我们的财产(为了这个例子,我们称之为“行程”)在那里,完好无损。在方法的另一端,在异步调用内部,由于某种原因,它是
null

堆栈跟踪显示中间的行程为空,其中只调用System.Runtime方法,不可能影响行程本身

我们花了大约3个小时研究这个堆栈跟踪和代码变量,从非null到null

即使它的getter是
return\u Itinerary
在stacktrace中始终为null,该Itinerary属性也不是null!这毫无意义

代码行程中的任何地方都显示null,除非将属性声明本身悬停。这也没有道理,对吧

在某个时候,我们只是键入了这个。行程,因为,我们不知道该做什么,它是绝望的

它成功了

该属性现在在整个异步过程中保持正常,一切都像使用它一样顺利运行

注:

我们正在Xamarin中使用Mono框架,使用Xamarin Studio,这只发生在android运行中。iOS有一个干净的日程安排

下面是一些伪代码:

//In a previous method
viewModel.DoSomethingAsync();   //Here the itinerary is valid
下面只有3行

 async void DoSomethingAsync(){

      DoSomethingElseWith(Itinerary);  //Here Itinerary is null, adding this.  fixes the issue.

  }
我只有一个行程属性,没有名称冲突

现在我的问题是:


任何人,任何地方,都能想出某种可能发生的解释吗?在同一个班级工作时,
这个属性与
属性不同。

看看这个代码:

   public class YourClass
    {
        public int id;
        public YourClass(int id)
        {
            this.id = id;
        }
    }

您可以使用与属性同名的参数,因为在构造函数中,很明显,如果您写“this.id”,您指的是属性。如果只写“id=id;”,程序将执行无用的赋值,id属性仍然为null

听起来Mono/Android有一些特殊的问题。以下是您可以尝试的:

是否可以尝试修改方法
doSomethingelsWith
,使其不接受属性类型的参数,而是传递实际的当前对象?大致如下:

// Interface for DI reasons. :)
interface IItineraryContainer { string Itinerary { get; } }

class MyObj : IItineraryContainer
{
    public string Itinerary { get; set; }

    public async void DoSomethingAsync()
    {
        ItineraryOperations.DoSomethingElseWith(this);
    }
}

class ItineraryOperations
{
    public static void DoSomethingElseWith(IItineraryContainer container)
    {
        string valueToWorkWith = container.Itinerary;
    }
}

这可能不是您要查找的代码,但它可能有助于进一步隔离问题。

为什么要删除android标记?我认为使用
这一功能的唯一原因。
会产生不同,因为还有另一个同名的局部变量。你们能展示一些代码吗?对不起,我以为这个问题和安卓无关。再次添加了android标签。我添加了一些伪代码,实际代码与编译此文件时的IL更改几乎相同。属性vs.属性?确实是对的,但我的情况并非如此(