В чем разница между полем и свойством? - PullRequest
971 голосов
/ 17 ноября 2008

Что в C # отличает поле от свойства и когда следует использовать поле вместо свойства?

Ответы [ 30 ]

1 голос
/ 27 февраля 2018

В большинстве случаев это будет имя свойства, к которому вы обращаетесь, а не имя переменной ( поле ). Причина в том, что это считается хорошей практикой в ​​.NET и, в частности, в C # чтобы защитить каждый фрагмент данных в классе, будь то переменная экземпляра или статическая переменная (переменная класса), потому что она связана с классом.

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

Но в других случаях, таких как Math class (Пространство имен системы), в класс встроено несколько статических свойств. одна из которых является математической константой PI

например. Math.PI

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

1 голос
/ 26 июня 2017

Подумайте об этом: у вас есть комната и дверь, чтобы войти в эту комнату. Если вы хотите проверить, как кто входит и обезопасить вашу комнату, тогда вы должны использовать свойства, иначе они не будут иметь никаких дверей, и каждый легко войдет без каких-либо правил

class Room {
   public string sectionOne;
   public string sectionTwo;
}

Room r = new Room();
r.sectionOne = "enter";

Люди попадают в раздел. Довольно легко, проверки не было

class Room 
{
   private string sectionOne;
   private string sectionTwo;

   public string SectionOne 
   {
      get 
      {
        return sectionOne; 
      }
      set 
      { 
        sectionOne = Check(value); 
      }
   }
}

Room r = new Room();
r.SectionOne = "enter";

Теперь вы проверили человека и знаете, есть ли у него что-то злое

1 голос
/ 14 июня 2017

Свойства используются для выставления поля. Они используют методы доступа (set, get), через которые можно читать, записывать или манипулировать значениями приватных полей.

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

Используя свойства, мы можем установить проверку типа данных, заданных для поля.

Например, у нас есть частное целое поле возраста, на котором мы должны разрешить положительные значения, поскольку возраст не может быть отрицательным.

Мы можем сделать это двумя способами, используя getter и setters и используя свойство.

 Using Getter and Setter

    // field
    private int _age;

    // setter
    public void set(int age){
      if (age <=0)
       throw new Exception();

      this._age = age;
    }

    // getter
    public int get (){
      return this._age;
    }

 Now using property we can do the same thing. In the value is a key word

    private int _age;

    public int Age{
    get{
        return this._age;
    }

    set{
       if (value <= 0)
         throw new Exception()
       }
    }

Автоматически реализованное свойство, если мы не используем логику в методах get и set, мы можем использовать автоматически реализованное свойство

Когда автоматически компилируемое свойство u se создает частное анонимное поле , к которому можно получить доступ только через методы доступа get и set.

public int Age{get;set;}

Абстрактные свойства Абстрактный класс может иметь абстрактное свойство, которое должно быть реализовано в производном классе

public abstract class Person
   {
      public abstract string Name
      {
         get;
         set;
      }
      public abstract int Age
      {
         get;
         set;
      }
   }

// overriden something like this
// Declare a Name property of type string:
  public override string Name
  {
     get
     {
        return name;
     }
     set
     {
        name = value;
     }
  }

Мы можем установить частную собственность В этом мы можем установить свойство auto в личном режиме (устанавливается с помощью класса)

public int MyProperty
{
    get; private set;
}

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

private int myProperty;
public int MyProperty
{
    get { return myProperty; }
}
1 голос
/ 01 марта 2016

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

Например, давайте возьмем класс с именем Employee, с закрытыми полями для имени, возраста и Employee_Id. Мы не можем получить доступ к этим полям извне класса, но мы можем получить доступ к этим частным полям через свойства.

Почему мы используем свойства?

Делать поле класса общедоступным и обнародовать его рискованно, так как у вас не будет контроля над тем, что будет назначено и возвращено.

Чтобы понять это на примере, давайте возьмем ученический класс, у которого есть ID, пароль, имя. Теперь в этом примере некоторые проблемы с открытым полем

  • ID не должен быть -ve.
  • Имя не может быть установлено на ноль
  • Пропуск должен быть только для чтения.
  • Если имя ученика отсутствует, имя не возвращается.

Чтобы устранить эту проблему, мы используем метод Get и set.

// A simple example
public class student
{
    public int ID;
    public int passmark;
    public string name;
}

public class Program
{
    public static void Main(string[] args)
    {
       student s1 = new student();
       s1.ID = -101; // here ID can't be -ve
       s1.Name = null ; // here Name can't be null
    }
}

Теперь мы возьмем пример метода get и set

public class student
{
    private int _ID;
    private int _passmark;
    private string_name ;
    // for id property
    public void SetID(int ID)
    {
        if(ID<=0)
        {
            throw new exception("student ID should be greater then 0");
        }
        this._ID = ID;
    }
    public int getID()
    {
        return_ID;
    }
}
public class programme
{
    public static void main()
    {
        student s1 = new student ();
        s1.SetID(101);
    }
    // Like this we also can use for Name property
    public void SetName(string Name)
    {
        if(string.IsNullOrEmpty(Name))
        {
            throw new exeception("name can not be null");
        }
        this._Name = Name;
    }
    public string GetName()
    {
        if( string.IsNullOrEmpty(This.Name))
        {
            return "No Name";
        }
        else
        {
            return this._name;
        }
    }
        // Like this we also can use for Passmark property
    public int Getpassmark()
    {
        return this._passmark;
    }
}
1 голос
/ 26 августа 2015

Из Википедии - Объектно-ориентированное программирование :

Объектно-ориентированное программирование (ООП) - это парадигма программирования, основанная на концепции «объектов», которые представляют собой структуры данных, которые содержат данные в форме полей , часто называемых атрибутами; и код в форме процедур, часто называемых методами . (выделение добавлено)

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

1 голос
/ 16 декабря 2013

IMO, Свойства - это просто пары функций / методов / интерфейсов "SetXXX ()" "GetXXX ()", которые мы использовали ранее, но они более лаконичны и элегантны.

1 голос
/ 01 апреля 2015

когда у вас есть класс "Автомобиль". Свойства цвета, формы ..

Где в качестве полей указаны переменные, определенные в области видимости класса.

1 голос
/ 01 апреля 2015

Традиционно закрытые поля устанавливаются через методы получения и установки. Ради меньшего количества кода вы можете использовать свойства для установки полей.

1 голос
/ 17 ноября 2008

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

0 голосов
/ 16 января 2017

Дополнительная информация: По умолчанию методы доступа get и set доступны так же, как и само свойство. Вы можете контролировать / ограничивать доступ к средствам доступа индивидуально (для получения и установки), применяя к ним более ограничивающие модификаторы доступа.

Пример:

public string Name
{
    get
    {
        return name;
    }
    protected set
    {
        name = value;
    }
}

Здесь get все еще общедоступен (так как свойство общедоступно), но set защищен (более ограниченный спецификатор доступа).

...