Ключевое слово 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());

}

}