В чем разница между полем и свойством?

Изучив различные решения на разных форумах и не найдя подходящего решения, я чувствую, что я получил нижний взломанный код, который проще всего отслеживать и кодировать:

Пример. Предположим, у вас есть несколько параметров для перейдите в предложение «IN». Просто поместите фиктивную строку в предложение «IN», скажем, «PARAM» обозначить список параметров, которые будут появляться на месте этой фиктивной строки.

    select * from TABLE_A where ATTR IN (PARAM);

Вы можете собрать все параметров в одну переменную String в вашем Java-коде. Это можно сделать следующим образом:

    String param1 = "X";
    String param2 = "Y";
    String param1 = param1.append(",").append(param2);

Вы можете добавить все ваши параметры, разделенные запятыми, в одну переменную String, 'param1', в нашем случае.

После сбора всех параметры в одну строку вы можете просто заменить фиктивный текст в вашем запросе, то есть «PARAM» в этом случае, с параметром String, т. е. param1. Вот что вам нужно сделать:

    String query = query.replaceFirst("PARAM",param1); where we have the value of query as 

    query = "select * from TABLE_A where ATTR IN (PARAM)";

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

Примечание. Хотя это не подготовленный запрос, он выполняет работу, которую я хотел, чтобы мой код выполнял.

992
задан 6 revs, 6 users 100%Anonymous 18 February 2018 в 16:08
поделиться

12 ответов

Свойства представляют поля. Поля должны (почти всегда) быть сохраненными частными к классу и получили доступ через, получают и устанавливают свойства. Свойства обеспечивают уровень абстракции, разрешающей Вам изменить поля, не влияя на внешний путь к ним получают доступ вещи, которые используют Ваш класс.

public class MyClass
{
    // this is a field.  It is private to your class and stores the actual data.
    private string _myField;

    // this is a property. When accessed it uses the underlying field,
    // but only exposes the contract, which will not be affected by the underlying field
    public string MyProperty
    {
        get
        {
            return _myField;
        }
        set
        {
            _myField = value;
        }
    }

    // This is an AutoProperty (C# 3.0 and higher) - which is a shorthand syntax
    // used to generate a private field for you
    public int AnotherProperty{get;set;} 
}

@Kent указывает, что Свойства не требуются, чтобы инкапсулировать поля, они могли сделать вычисление на других полях или служить другим целям.

@GSS указывает, что можно также сделать другую логику, такую как проверка, когда к свойству получают доступ, другая полезная функция.

866
ответ дан 8 revs, 4 users 66% 18 February 2018 в 16:08
поделиться

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

3
ответ дан Erik Burger 18 February 2018 в 16:08
поделиться

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

, Если Вы пишете библиотеку классов, разработанную для широкого потребления (как Платформа.NET, которая используется миллионами людей), который может быть проблемой. Однако, если Вы пишете, класс, используемый внутренне в небольшой кодовой базе (скажите < = 50 строк K), это - действительно не грандиозное предприятие, потому что ни на кого не оказали бы негативное влияние Ваши изменения. В этом случае это действительно просто сводится к персональному предпочтению.

12
ответ дан Scott Wisniewski 18 February 2018 в 16:08
поделиться

Если Вы собираетесь использовать примитивы потока, Вы вынуждены использовать поля. Свойства могут повредить Ваш потоковый код. Кроме этого, какой сказанный cory корректен.

4
ответ дан 2 revs 18 February 2018 в 16:08
поделиться

Кроме того, свойства позволяют Вам использовать логику при устанавливании значений.

, Таким образом, можно сказать, Вы только хотите установить значение к целочисленному полю, если значение больше, чем x, иначе выдайте исключение.

Действительно полезная функция.

4
ответ дан GurdeepS 18 February 2018 в 16:08
поделиться

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

Свойства могут работать в течение очень долгого времени, иметь побочные эффекты и могут даже выдать исключения. Поля быстры, без побочных эффектов, и никогда не будут выдавать исключения. Из-за побочных эффектов свойство может возвратить различное значение для каждого вызова (как может иметь место для DateTime. Теперь, т.е. DateTime. Теперь не всегда равно DateTime. Теперь). Поля всегда возвращают то же значение.

Поля могут использоваться для / касательно параметров, свойства не могут. Свойства поддерживают дополнительную логику †“, это могло использоваться для реализации ленивой загрузки среди прочего.

Свойства поддерживают уровень абстракции путем инкапсуляции независимо от того, что это означает получать/устанавливать значение.

свойства Use в большинстве / все случаи, но стараются избегать побочных эффектов.

10
ответ дан Brian Rasmussen 18 February 2018 в 16:08
поделиться

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

  • Ленивая Инициализация : , Если у Вас есть свойство объекта, это дорого для загрузки, но не получено доступ все так очень в нормальных выполнениях кода, можно задержать его загрузку через свойство. Тем путем это просто находится там, но в первый раз другой модуль пытается назвать то свойство, это проверяет, является ли базовое поле пустым - если это, это идет вперед и загружает его, неизвестный модулю вызова. Это может значительно ускорить объектную инициализацию.
  • Грязное Отслеживание: , О котором я на самом деле узнал от моего собственный вопрос здесь на StackOverflow. Когда у меня есть много объектов, которые значения, возможно, изменили во время выполнения, я могу использовать свойство, чтобы отследить, если они должны быть сохранены назад к базе данных или нет. Если ни одно свойство объекта не изменилось, флаг IsDirty не будет смещен, и поэтому функциональность сохранения перескочит через него при решении что потребности возвратиться к базе данных.
94
ответ дан 4 revs, 3 users 78% 18 February 2018 в 16:08
поделиться

В фоновом режиме свойство компилируется в методы. Так Name свойство компилируется в get_Name() и set_Name(string value). Вы видите это при изучении скомпилированного кода. Таким образом, существует (очень) маленькая производительность наверху при использовании их. Обычно Вы будете всегда использовать Свойство, если Вы представите поле внешней стороне, и Вы будете часто использовать ее внутренне, если необходимо сделать проверку значения.

10
ответ дан 2 revs, 2 users 67% 18 February 2018 в 16:08
поделиться

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

154
ответ дан Hans Løken 18 February 2018 в 16:08
поделиться

Объект, ориентируемый, программируя принципы, говорит, что, внутренние работы класса должны быть скрыты от внешнего мира. Если Вы представляете поле, Вы в сущности представляете внутреннюю реализацию класса. Поэтому мы обертываем поля со Свойствами (или методы в случае Java), чтобы дать нам способность изменить реализацию, не повреждая код в зависимости от нас. Наблюдение, поскольку мы можем поместить логику в Свойство также, позволяет нам выполнять логику проверки и т.д., если нам нужен он. C# 3 имеет возможно запутывающее понятие автосвойств. Это позволяет нам просто определять Свойство, и компилятор C#3 генерирует частное поле для нас.

public class Person
{
   private string _name;

   public string Name
   {
      get
      {
         return _name;
      }
      set
      {
         _name = value;
      }
   }
   public int Age{get;set;} //AutoProperty generates private field for us
}
239
ответ дан danswain 18 February 2018 в 16:08
поделиться

(Это действительно должен быть комментарий, но я не могу опубликовать комментарий, извините, если он не подходит для публикации).

Однажды я работал в месте, где рекомендовалось использовать общедоступные поля вместо свойств, когда эквивалентное свойство def просто обращалось к полю, как в:

get { return _afield; }
set { _afield = value; }

Их аргументация заключалась в том, что общедоступное поле может быть преобразовано в собственность позже, если потребуется. Тогда мне это показалось немного странным. Судя по этим постам, похоже, что и здесь не многие согласятся. Что вы могли бы сказать, чтобы попытаться что-то изменить?

Изменить: я должен добавить, что вся база кода в этом месте была скомпилирована одновременно, поэтому они могли подумать, что изменение открытого интерфейса классов (путем изменения публичное поле к собственности) не было проблемой.

4
ответ дан 19 December 2019 в 20:20
поделиться

Используя Свойства, вы можете генерировать событие, когда значение свойства изменяется (также известное как PropertyChangedEvent) или до того, как значение будет изменено для поддержки отмены.

Это невозможно с полями (прямым доступом к).

public class Person {
 private string _name;

 public event EventHandler NameChanging;     
 public event EventHandler NameChanged;

 public string Name{
  get
  {
     return _name;
  }
  set
  {
     OnNameChanging();
     _name = value;
     OnNameChanged();
  }
 }

 private void OnNameChanging(){
   EventHandler localEvent = NameChanging;
   if (localEvent != null) {
     localEvent(this,EventArgs.Empty);
   }
 }

 private void OnNameChanged(){
   EventHandler localEvent = NameChanged;
   if (localEvent != null) {
     localEvent(this,EventArgs.Empty);
   }
 }
}
49
ответ дан 19 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

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