В C#, как я могу сгенерировать значение для свойства класса, только если его нет? - PullRequest
2 голосов
/ 06 мая 2020

У меня есть следующий класс C# со свойством Id, которое я хотел бы установить с помощью GUID и вернуть, если потребитель вызывает значение экземпляра myClass.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 (очевидно, не этот сайт). Лучшее предположение, вызов this.Id в геттере того же свойства, кажется, приводит к циклическому logi c.

В Salesforce Apex , с этим аналогичным кодом, он работает ли так, как ожидал бы I , оценивая значение 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#?
  • Если да, как ?

Ответы [ 2 ]

6 голосов
/ 06 мая 2020

Вероятно, вам следует создать полную собственность с частным полем.

public class IdentifiableClass{
   private string id;
   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;
   }
}
4 голосов
/ 06 мая 2020

Что вам нужно сделать, так это не использовать функцию автоматического свойства.

Вы должны явно указать поле private string _id;, и ваши геттеры и сеттеры должны внутренне использовать это

...