2017-06-19 34 views
0

我一直在编写一个使用Web服务的应用程序,下载JSON格式的数据,将它反序列化为类。该服务是基于PHP的(我相信)。Inline Encapsulation停止工作

最近,网络服务已经有一个更新,对我的类声明有意想不到的后果。 直到最近,我一直在使用这种线为类变量

public string consent_id { get { return consent_id.ToUpper(); } set { consent_id = value; } } 

之一,它似乎已被很好地工作。但自从更新到他们的服务。这已经导致堆栈溢出异常,我不得不更改代码以

string Consent_id; 
public string consent_id { get { return Consent_id.ToUpper(); } set { Consent_id = value; } } 

感觉就像第一行开始递归调用设定的封装。

有谁知道为什么第一个停止工作?它抛出堆栈溢出异常的实际原因是什么?有没有办法设置Getter而不设置Setter内联,所以我不打算封装所有需要修改Getter的内容?

谢谢

+0

在您的第一行中,当您调用'return consent_id.ToUpper();'时,递归调用getter。所以,在这种情况下使用备份是一个很好的做法。你不能设置一个吸气体没有设置一个setter身体 –

+0

@GeorgeAlexandria在测试中,我们把ToUpper()拿出来,它没有改变。这是Setter也抛出异常。 – Seige

+0

你测试了第一个例子还是第二个与后台字段? –

回答

1

第一个选项永远不会有效。

它抛出了一个堆栈溢出异常,因为在你调用getter的getter中调用了getter,它调用getter,等等,直到你用完堆栈空间。

+0

有没有另外一种方法可以内联?我似乎无法设置一个没有其他。我认为制定者不会从内部自我调用。每天都有新的东西。 – Seige

+0

@Seige如果您不想使用自动属性,那么您需要将值*存储在某个地方*,无论是在某个字段,另一个属性,某个其他位置或其他位置。具有隐式字段的唯一方法是用于自动属性。 – Servy

+0

具有自动属性,是不是完全默认封装相同,但速记?或者它在内部做了些什么?我原以为把setter中的默认代码和auto-property一样。因此我的代码。 – Seige