Оператор this и автосвойства в c#

435
23 августа 2017, 14:55

Перечитываю уже не первый раз теорию, но не могу понять в чем особенность использования оператора this или авто свойств {get;set;} Опишите особенности в этих двух классах. Либо где правильно или нет, и почему.

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Person(string fName, string lName)
    {
        FirstName = fName;
        LastName = lName;
    }
}

Либо так, как я понимаю это одно и тоже?

class Person
{
    public string FirstName;
    public string LastName;
    public Person(string FirstName, string LastName)
    {
        this.FirstName = FirstName;
        this.LastName = LastName;
    }
}

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

Answer 1

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

public string FirstName { get; private set; }

В таком случае значение для свойства можно установить лишь изнутри класса, из вне - это просто, грубо говоря, readonly переменная. Так же для свойств вместо простого get можно использовать методы, которые возвращают значение того же типа:

public string FirstName { get { return GetFirstNameValue(); } }

Таким образом вызов метода происходит только при обращении к свойству, удобно, не правда ли?

Что касается this, это просто вспомогательное ключевое слово, для тех случаев, когда две сущности имеют одинаковое имя. То есть для того, что бы компилятор понял к какой сущности вы обращаетесь. Во всяком случае я так это понял(интуитивно), так как подробно в этот вопрос не вникал, было не интересно и отсутствовала необходимость :) Так что можете еще информации поискать.

Answer 2

1) С помощью this ты указываешь, что используешь именно переменную класса, а не то что передаётся в метод. Это позволяет использовать одинаковые называния у переменных и не путаться потом в названиях.

class Person
{
    public string FirstName; //this переменная этого класса
    public string LastName;  //this переменная этого класса
    public Person(string FirstName, string LastName)
    {
        this.FirstName = FirstName; //Присваешь значение переменной переданной в метод, переменной в классе где находится этот метод.
        this.LastName = LastName;
    }
}

2)Автосвойства реализуют инкапсуляцию и используются вместо геттеров и сеттеров. И по сути являются синтаксическим сахаром. Например мы можем сделать автосвойство типа int

    public int number
{
    get { return this.number*2; } //вернёт значение этой переменной умноженное на 2, работает как метод.
    set { this.number = value; } //присвает переданное значение этой переменной
}
Answer 3

Пример ситуации, когда без this практически не обойтись:

  class A : List<int> 
  {
     public void Iterate()
     {
       foreach (int num in this)
       {
         // Итерация по коллекции
       } 
     }
   }
Answer 4

1й класс - принцип инкапсуляции. get и set - приватные, мы не можем получить или изменить значение из другого класса. Установить можно через соответствующий метод.
2й класс - в методе переменные FirstName и LastName существуют в двух контекстах - глобальном (объявлено выше) и локальном (пришло в метод в качестве параметров). Для того, чтобы в переменную класса записать пришедшее значение, компилятору нужно явно указать на контекст класса с помощью this.
P.S и если нет явной необходимости, объявляйте переменные приватными

READ ALSO
Вернуть дочерний элемент WinForms C#

Вернуть дочерний элемент WinForms C#

Нужно вернуть дочерний элементЕсть какой то Panel например, в нем есть несколько PictureBox, label и бог знает что еще

435
Динамическое создание элементов формы

Динамическое создание элементов формы

Недавно перешел с консоли на FormsТребуется создать приложение, которое будет парсить каталог, и в зависимости о его содержания создавать элемента...

362
Запуск проекта без CrystalReports

Запуск проекта без CrystalReports

В проекте используются элементы CrystalReportsНо в моей студии он не установлен

212
Проблема с System.Runtime.InteropServices.COMException

Проблема с System.Runtime.InteropServices.COMException

Всем доброго времени сутокСуть: Необходимо запустить скрипт COM приложения, по кнопке с сайта

305