Ключевое слово this.
Классы. Основные понятия
Для представления объекта в языке программирования C# используется понятие класс. Класс – абстрактный тип данных. Класс – ссылочный тип данных. Класс является обобщенным понятием, определяющим характеристики и поведение некоторого множества конкретных объектов этого класса, называемых экземплярами класса.
«Классический» класс содержит данные, задающие свойства объектов класса, и функции, определяющие их поведение, так же, в класс добавляют еще одну составляющую – события, на которые класс может реагировать объект класса.
Класс является типом данных, определяемым пользователем. Он должен представлять собой одну логическую сущность, являться моделью реального объекта или процесса.
Данные поля и константы. Синтаксис:
[атр] [спец] [const] тип имя [=знак];
Описание класса содержит ключевое слово class, за которым следует его ИМЯ, а далее, в фигурных скобках – тело класса, т.е. список его элементов. Кроме того, для класса можно задать его базовые классы (предки) и ряд необязательных атрибутов и спецификаторов, определяющих различные характеристики класса.
[атрибут] [спецификатор] class NAME [:предки]{тело класса}
Имя класса задается самостоятельно, по общим правилам C#. Тело класса – это список описаний его элементов, список может быть пустым, если класс не содержит ни одного элемента.
По умолчанию все элементы класса являются закрытыми. Все методы класса имеют доступ к закрытым полям. К элементам относятся: константы, поля (содержат данные класса), методы (выполняют какие-либо действия, вычисления), свойства (определяют характеристики класса в совокупности со способами их задания и получения), конструкторы (методы класса, которые реализуют свои действия по инициализации экземпляров), деструкторы (методы класса, которые определяют действие, которое необходимо выполнить до того, как объект будет уничтожен), индексаторы (обеспечивают возможность доступа к элементам класса по индексу), операции (задают действия с объектами с помощью перегруженных знаков операции), события (определяют уведомления, которые может генерировать класс), типы данных - внутренние по отношению к классу.
class Person
{
…
}
Спецификаторы определяют свойства класса, а также доступность класса для других элементов программы. Класс можно описывать непосредственно внутри пространства имен или внутри другого класса. В последнем случае класс называется вложенным. В зависимости от места описания класса некоторые из спецификаторов могут быть запрещены.
[атрибут] [спецификатор] class NAME [:предки]
{тело класса}
Спецификатор | Описание |
new | Используется для вложенных классов. Задает новое описание класса взамен унаследованного от предка |
public | Доступ не ограничен |
protected | Используется для вложенных классов. Доступ только из элементов данного и производных классов |
internal | Доступ только из данной программы |
protected internal | Доступ только из данного и производных классов или из данной программы |
private | Используются для вложенных классов. Доступ только из элементов класса, внутри которого описан класс |
abstract | Абстрактный класс |
sealed | Бесплодный класс |
static | Статический класс |
class Person
{
string name;
int age;
string profession;
public Person(string name)
{
this.name = name;
}
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
public Person(string name, string profession)
{
this.name = name;
this.profession = profession;
}
public Person(string name, int age, string profession)
{
this.name = name;
this.age = age;
this.profession = profession;
}
public string GetInformation()
{
string information;
information = "Имя: " + this.name + "; Возраст: " + this.age.ToString() + "; Профессия: " + this.profession;
return information;
}
}
Спецификаторы 2 – 6 называются спецификаторами доступа. Они определяют, откуда можно непосредственно обращаться к данному классу. Спецификаторы доступа могут присутствовать в описании только в вариантах, приведенных в таблице, а так же могут комбинироваться с остальными спецификаторами. Класс является обобщенным понятием, определяющим характеристики и поведение некоторого множества конкретных объектов этого класса, называемых экземплярами или объектами класса.
Существует два способа передачи параметров: по значению и по ссылке.
При передаче по значению метод получает копии значений аргументов, операторы метода работают с этими копиями. Доступа к исходным значениям аргументов у метода нет, а следовательно, нет возможности их изменить.
При передачи по ссылке (по адресу) метод получает копии адресов аргументов, он осуществляет доступ к ячейкам памяти по этим адресам и может изменять исходные значения аргументов, модифицируя параметры.
В С# для обмена данными между вызывающей и вызываемой функциями предусмотрено четыре тина параметров:
- параметры-значения;
- параметры-ссылки — описываются с помощью ключевого слова ref;
- выходные параметры — описываются с помощью ключевого слова out;
- параметры-массивы — описываются с помощью ключевого слова params.
Ключевое слово предшествует описанию типа параметра. Если оно опущено, параметр считается параметром-значением. Параметр-массив может быть только один и должен располагаться последним в списке.
Если несколько объектов имеют одинаковое значение критерия сортировки, их относительный порядок следования после сортировки не изменится.
Каждый объект содержит свой экземпляр полей класса. Методы находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов нестатических экземпляров с полями именно того объекта, для которого они были вызваны. Для этого в любой нестатический метод автоматически передается скрытый параметр this, в котором хранится ссылка на вызвавший функцию экземпляр.
В явном виде параметр this применяется для того, чтобы возвратить из метода ссылку на вызвавший объект, а также для идентификации поля в случае, если его имя совпадает с именем параметра метода.
using System;
class CShape
{
bool IsShape() {return true;}
}
interface IShape
{
double Square();
}
class CRectangle: CShape, IShape
{
double width;
double height;
public CRectangle(double width, double height)
{
this.width = width;
this.height = height;
}
public double Square()
{
return (width * height);
}
}
class CCircle: CShape, IShape
{
double radius;
public CCircle(double radius)
{
this.radius = radius;
}
public double Square()
{
return (Math.PI * radius * radius);
}
}
class Example_3
{
public static void Main()
{
CRectangle rect = new CRectangle(3, 4);
CCircle circ = new CCircle(5);
Console.WriteLine(rect.Square());
Console.WriteLine(circ.Square());
}
}