Авто-недвижимость с или без полевого поля - предпочтение?

StackOverflow https://stackoverflow.com//questions/9645938

Вопрос

Я знаю, что при использовании авто-свойств компилятор создает свое собственное поле поддержки за экраном.Однако во многих программах я читаю, чтобы учиться у того, я вижу людей явно написать

private int _backingField;

public int Property { get { return _backingField; } }
.

Какая разница между вышеперечисленными, а ниже?

public int Property { get; private set; }
.

Я понимаю, что его очевидно использовать свойство, когда у вас на самом деле есть побочные эффекты в Getter или Setter, но это часто не так.Кроме того, я понимаю, что вы должны явно использовать поле поддержки в случае структуру, вы не можете получить доступ к своим членам через свойства.

Единственное отличие, которое я смог найти, так это то, что способ вызова значения отличается внутри класса, он определен. Это затем простое предпочтение, или есть что-то большее для вызова значения через его свойство илиПрямой доступ к полю? Простые конвенции?

Это было полезно?

Решение

There's not much difference between those two snippets - you can't pass a property by reference, for example, but that's rarely an issue. However, if you want the field to be readonly, like this:

private readonly int _backingField;    
public int Property { get { return _backingField; } }

then there's a difference. The code I've written above prevents the value from being changed elsewhere within the class, making it clear that this is really meant to be immutable. I'd really like to be able to declare a read-only field with a read-only automatically implement property, settable only within the constructor - but that's not available at the moment.

This is rather confusing, by the way:

Also, I understand that you have to explicitly use the backing field in the case of structs, you can't access their members via properties.

What do you mean? You can definitely use properties within structs. Are you talking about backing fields which are mutable structs, i.e. the difference between:

foo.someField.X = 10;

and

foo.SomeProperty.X = 10;

? If so, I normally avoid that being an issue by making my structs immutable to start with :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top