1

Посоветуйте как без создания дополнительных переменных реализовать такое:

public int Rekt {
    get;
    set {
        Logger.Log("new Value " + value);
    }
}

Повторюсь, без добавления новых полей

  • Может без добавления дополнительных полей? – Zergatul Aug 30 '18 at 15:20
  • @Zergatul я думаю int это переменная... – Костя Aug 30 '18 at 15:24
  • здесь описание свойства Rekt с типом int. никаких переменных не используется – Grundy Aug 30 '18 at 15:25
  • Ну так можно реализовать как-то что описано? – Костя Aug 30 '18 at 15:29
  • 1
    @Костя, любое авто-свойство под собой имеет поле. поэтому разницы нет, используешь ли ты поле автоматически созданное или свое. однако, обратиться к автоматически созданному полю нельзя. поэтому без ручного создания поля в данном случае не обойтись если нужен и set и get. – Grundy Aug 30 '18 at 15:42
  • @Grundy мне просто нужно логирование изменение значения – Костя Aug 30 '18 at 16:25
  • 1
    @Костя, тогда придется отказаться от автосвойств – Grundy Aug 30 '18 at 17:10
  • @Костя думаю, многим интересно: а зачем? В чем задумка? Размер объекта не изменяется, размер кода - больше на 1 строчку. – Алексей Саровский Aug 30 '18 at 20:00

2 Answers2

4

Автосвойства в C# не подразумевают дополнительных операций при get и set, поэтому при их необходимости придется переходить к обычным свойствам.

private int rekt;
public int Rekt {
    get => rekt;
    set {
        Logger.Log("new Value " + value);
        rekt = value;
    }
}

Кроме этого можно воспользоваться какими-нибудь AOP решениями типа PostSharp.

Grundy
  • 81,538
  • не подходит такое , так как меняют rekt а не Rekt – Костя Aug 30 '18 at 18:47
  • @Костя кто меняет-то? – Pavel Mayorov Aug 30 '18 at 19:18
  • @Костя, в окружающем коде поведение не поменяется, где-то все так же будет obj.Rekt = val, просто теперь будут записываться логи. Ну и как говорилось в предыдущем комментарии, поле есть и в автосвойствах, просто оно имеет специальное имя, то есть в твоем коде на самом деле меняют не Rekt, а какой-нибудь <Rekt>k__BackingField – Grundy Aug 30 '18 at 19:43
3

Нет, того, что вы хотите, в языке нету.

На текущий момент (C# 7.3) вы можете создать либо либо полностью автоматическое свойство, в котором несущее поле создаётся автоматически и вам недоступно, либо полностью неавтоматическое свойство, в котором несущее поле вам приходится декларировать самостоятельно.

В репозитории, посвящённом разработке и развитию языка C#, есть несколько обсуждений, в которых предлагается функциональность, близкая к тому, что нужно вам. Например, вот одно из них: Semi-Auto-Properties; field keyword.

VladD
  • 206,799