【发布时间】:2020-08-21 17:01:10
【问题描述】:
我有以下 C# 类,其属性为Id尚未设置,否则保留并返回现有值。
public class IdentifiableClass{
public string Id {
get {
if (this.Id == null) {
this.Id = Guid.NewGuid().ToString();
Console.WriteLine("########## Id : " + this.Id );
}
return this.Id;
}
set => this.Id = value;
}
}
在 C# 中,这不起作用,但我得到了一个 stackoverflow(显然不是这个站点)。 最好的猜测是,在同一个属性的 getter 中调用 this.Id 似乎会导致循环逻辑。
在 Salesforce Apex 中,使用此 类似 代码,它确实 像 我 期望的那样工作,将 this.Id 的值评估为 null,将值分配给新的 Guid,显示该值,然后返回该值:
public class IdentifiableClass {
public string Id {
get {
if (this.Id == null) {
this.Id = String.valueOf(Integer.valueof((Math.random() * 10)));
System.debug('########## Id : ' + this.Id );
}
return this.Id;
}
set;
}
}
- 是否可以在 C# 中完成这项工作?
- 如果是这样,如何?
【问题讨论】:
-
你是对的 - 在 getter 中访问
if (this.Id == null)会递归调用 getter(因为这就是this.Id在后台调用的内容)。解决方案是使用明确定义的支持字段,而不是自动属性。 -
你有一个堆栈溢出,因为
if(this.Id == null)调用了你已经在其中的Id属性的getter,导致无限递归。正如下面的答案所述,解决方案是为属性使用显式支持字段。 -
干杯。给大家寻求解决方案!....我会在 8 分钟内接受@daniel89 的解决方案(只要 StackOverflow 允许我),除非有人有更聪明的答案。 :-)
-
它回答你的问题了吗? Why does Property Set throw StackOverflow exception? 好像是一模一样
-
@PavelAnikhouski,您对“精确”的定义可以使用一些微调,但它无疑是一个类似的问题。另一方面,该问题涉及一个非常简单的用例,并没有明确说明从访问器中访问您希望设置的属性的任何和所有尝试都同样注定要失败。也许对于习惯于 C# 的人来说应该很明显,但对于 Apex 开发人员来说,这是一种常见的模式,就不是那么明显了。
标签: c# conditional-statements guid getter accessor