与此不同的是.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.属性?确实是对的,但我的情况并非如此(