Каково различие между свойством и переменной экземпляра?

Фундаментальный принцип работы сборщиков мусора в .NET и Java заключается в том, что, если память не будет полностью повреждена, никогда не будет возможно наблюдать ненулевую ссылку, которая не идентифицирует живой объект. Если в .NET Framework или виртуальной машине Java была включена функция для явного освобождения связанной с управляемой GC ссылки, они должны были бы убедиться, что никаких наблюдаемых ссылок на объект нигде не существует, прежде чем он сможет перезапустить хранилище. Поскольку такая гарантия будет стоить примерно столько же, сколько цикл сбора мусора, а цикл GC может освободить хранилище для объекта без необходимости ссылки на него, возможность «ручного» удаления объекта редко добавляет много значение.

7
задан Iain 1 May 2009 в 13:32
поделиться

10 ответов

Иэн, это в основном вопрос терминологии, и, несмотря на то, что тег «независимый от языка» связан с этим вопросом, он очень связан с языком / средой.

Для обсуждения дизайна, свойства и Переменная экземпляра может использоваться взаимозаменяемо, поскольку идея состоит в том, что свойство представляет собой элемент данных, описывающий объект.

Когда речь идет о конкретном языке, эти два могут различаться. Например, в C # свойство фактически является функцией, которая возвращает объект, в то время как переменная экземпляра является нестатической переменной-членом класса.

17
ответ дан 6 December 2019 в 06:51
поделиться

Hershi is right about this being language specific. But to add to the trail of language specific answers:

In python, an instance variable is an attribute of an instance, (generally) something that is referred to in the instance's dictionary. This is analogous to members or instance variables in Java, except everything is public.

Properties are shortcuts to getter/setter methods that look just like an instance variable. Thus, in the following class definition (modified from Guido's new style object manifesto):

class C(object):

    def __init__(self):
        self.y = 0

    def getx(self):
        if self.y < 0: return 0
        else: return self.y

    def setx(self, x):
        self.y = x

    x = property(getx, setx)

>>> z = C()
>>> z.x = -3
>>> print z.x
0
>>> print z.y
-3
>>> z.x = 5
>>> print z.x
5
>>> print z.y
5

y is an instance variable of z, x is a property. (In general, where a property is defined, there are some techniques used to obscure the associated instance variable so that other code doesn't directly access it.) The benefit of properties in python is that a designer doesn't have to go around pre-emptively encapsulating all instance variables, since future encapsulation by converting an instance variable to a property should not break any existing code (unless the code is taking advantage of loopholes your encapsulation is trying to fix, or relying on class inspection or some other meta-programming technique).

All this is a very long answer to say that at the design level, it's good to talk about properties. It is agnostic as to what type of encapsulation you may need to perform. I guess this principle isn't language agnostic, but does apply to languages beside python.

3
ответ дан 6 December 2019 в 06:51
поделиться

пример кода на C #

public class ClassName
{
   private string variable;

   public string property
   {
      get{ return variable; }
      set { variable = value; }
   }
}
2
ответ дан 6 December 2019 в 06:51
поделиться

In objective c, a property is an instance variable which can take advantage of an overloaded dot operator to call its setter and getter. So my.food = "cheeseburger" is actually interpreted as [my setFood:"cheeseburger"]. This is another case where the definition is definitely not language agnostic because objective-c defines the @property keyword.

2
ответ дан 6 December 2019 в 06:51
поделиться

При добавлении к сказанному в языке, подобном C #, свойство по сути является функцией get и set. В результате, он может иметь собственную логику, которая работает в дополнение к получению / настройке. Переменная экземпляра не может этого сделать.

0
ответ дан 6 December 2019 в 06:51
поделиться

A property is some sort of data associated with an object. For instance, a property of a circle is its diameter, and another is its area.

An instance variable is a piece of data that is stored within an object. It doesn't necessarily need to correspond directly with a property. For instance (heh), a circle may store its radius in an instance variable, and calculate its diameter and area based on that radius. All three are still properties, but only the radius is stored in an instance variable.

Some languages have the concept of "first class" properties. This means that to a client application, the property looks and is used like an instance variable. That is, instead of writing something like circle.getDiameter(), you would write circle.diameter, and instead of circle.setRadius(5), you would write circle.radius = 5.

0
ответ дан 6 December 2019 в 06:51
поделиться

Может быть, это потому, что вы впервые пришли из C ++, верно ?! В школьные годы у меня были профессора, которые все время говорили о свойствах класса или атрибутах класса. С тех пор как я перешел в мир Java C #, я начал слышать об участниках. Члены класса, члены экземпляра ...

А потом Свойства! в Java и .NET. Поэтому я думаю, что вам лучше называть его членами. Являются ли они членами экземпляра (или, как вы называли это переменной экземпляра) или членами класса ....

Приветствия!

1
ответ дан 6 December 2019 в 06:51
поделиться

В Java у нас есть нечто, называемое Свойства JavaBeans , но это в основном переменная экземпляра, которая следует определенному шаблону именования для своих методов получения и установки.

0
ответ дан 6 December 2019 в 06:51
поделиться

Свойство может, и я полагаю, что в большинстве случаев возвращает переменную экземпляра, но может сделать больше. Вы можете поместить логику в свойство, агрегировать значения или обновить другие переменные экземпляра и т. Д. Однако я думаю, что лучше избегать этого. Логика должна идти в методы.

1
ответ дан 6 December 2019 в 06:51
поделиться

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

Различие заключается в том, что Наиболее очевидно в компонентно-ориентированном программировании, которое полезно везде, но легче всего понять в графическом интерфейсе. В этом контексте я склонен думать о конфигурации компонента во время разработки как о манипулировании «свойствами» объекта. Например, я выбираю цвета переднего плана и фона, стиль рамки и шрифт поля ввода текста, устанавливая его свойства. Хотя эти свойства могут быть изменены во время выполнения, обычно они не изменяются. Во время выполнения гораздо более вероятно чтение и запись другого набора переменных, представляющих содержимое поля. Я думаю об этой информации как о «состоянии» компонента.

Почему это различие полезно? При создании абстракции для соединения компонентов, как правило, необходимо отображать только переменные «состояния». Возвращаясь к примеру с текстовым полем, вы можете объявить интерфейс, обеспечивающий доступ к текущему контенту. Но «свойства», которые управляют внешним видом компонента, определяются только в конкретном классе реализации.

0
ответ дан 6 December 2019 в 06:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: