Перечитываю уже не первый раз теорию, но не могу понять в чем особенность использования оператора 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;
}
}
Элементарные вопросы, но не могу понять, что правильно будет в использовании.
В первом случае вы объявляете свойства, во втором - поля. Разница в том, что для свойств можно довольно гибко использовать модификаторы доступа:
public string FirstName { get; private set; }
В таком случае значение для свойства можно установить лишь изнутри класса, из вне - это просто, грубо говоря, readonly
переменная.
Так же для свойств вместо простого get
можно использовать методы, которые возвращают значение того же типа:
public string FirstName { get { return GetFirstNameValue(); } }
Таким образом вызов метода происходит только при обращении к свойству, удобно, не правда ли?
Что касается this
, это просто вспомогательное ключевое слово, для тех случаев, когда две сущности имеют одинаковое имя. То есть для того, что бы компилятор понял к какой сущности вы обращаетесь. Во всяком случае я так это понял(интуитивно), так как подробно в этот вопрос не вникал, было не интересно и отсутствовала необходимость :) Так что можете еще информации поискать.
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; } //присвает переданное значение этой переменной
}
Пример ситуации, когда без this
практически не обойтись:
class A : List<int>
{
public void Iterate()
{
foreach (int num in this)
{
// Итерация по коллекции
}
}
}
1й класс - принцип инкапсуляции. get и set - приватные, мы не можем получить или изменить значение из другого класса. Установить можно через соответствующий метод.
2й класс - в методе переменные FirstName и LastName существуют в двух контекстах - глобальном (объявлено выше) и локальном (пришло в метод в качестве параметров). Для того, чтобы в переменную класса записать пришедшее значение, компилятору нужно явно указать на контекст класса с помощью this.
P.S и если нет явной необходимости, объявляйте переменные приватными
Виртуальный выделенный сервер (VDS) становится отличным выбором
Нужно вернуть дочерний элементЕсть какой то Panel например, в нем есть несколько PictureBox, label и бог знает что еще
Недавно перешел с консоли на FormsТребуется создать приложение, которое будет парсить каталог, и в зависимости о его содержания создавать элемента...
В проекте используются элементы CrystalReportsНо в моей студии он не установлен
Всем доброго времени сутокСуть: Необходимо запустить скрипт COM приложения, по кнопке с сайта