Прежде чем перейти непосредственно к исследованию конструктивных особенностей языка программирования C#, рассмотрим ход его развития.
История основной ветви языков программирования, которая привела к появлению C#, восходит к 60-м годам, а именно, ко времени возникновения языка B. Последний является типичным представителем ранних
Следующим шагом в "алфавите" языков программирования, ведущем к языку C#, стал язык C, который был изобретен на основе языка B в 1972 году. Авторами нового языка программирования стали К.Томпсон и Д.Ритчи (Dennis Ritchie), которые работали в исследовательской лаборатории компании ATT (ATT
Заметим, что название C++ для нового языка предложил Р.Маскитти (Rics Mascitti,
Наконец, уже в 2000 году, то есть более чем через 15 лет, корпорация Microsoft выпустила в свет C++ нового поколения под названием C# ("Си шарп"), основным постулатом которого является высказывание: "всякая сущность есть объект". Язык основан на строгой
Как уже отмечалось в ходе лекции, язык программирования C# объединил лучшие черты целого ряда предшественников. Кроме упомянутой ранее ветви языков B-C-C++, необходимо указать еще несколько знаковых для настоящего времени языков программирования, а именно, Java и Visual Basic.
Несмотря на весьма существенные различия между компонентной объектной моделью COM (основного стандарта Microsoft для компонентного проектирования и реализации программного обеспечения) и моделью
Как уже отмечалось, язык программирования C# основан на строгой
Перечислим наиболее характерные черты сходства языков программирования C# и Java. Прежде всего, оба языка относятся к категории объектно-ориентированных и предполагают единственность наследования. Другими важными особенностями, которые сближают языки программирования C# и Java, являются механизмы
От своего прямого предшественника, языка программирования C++, языком C# унаследованы следующие механизмы:
| Подобен языкам Java, C++ и VB, однако является компонентно-ориентированным и более безопасным | |
|---|---|
| Добавлен ряд новых черт (делегаты, | |
Сходство с Java |
Сходство с С++
|
К числу принципиально важных решений, которые реализованы корпорацией Microsoft в языке программирования C#, можно отнести следующие:
try );delegate – развитие indexer – операторы индекса для обращения к элементам класса-контейнера);foreach (обработка всех элементов классов-коллекций, аналог Visual Basic);boxing и unboxing для
(рис 15.1) Структура программы на языке C#.Особенности языка программирования C#, которые в большей степени отвечают целям настоящего учебного курса, будут рассмотрены в данной лекции более подробно.
Прежде всего, рассмотрим обобщенную структуру программы на языке программирования C#. Представим структуру программы на примере (см. рис.15.1).
Заметим, что программа на C# может состоять как из одного, так и из нескольких файлов, содержащих исходный текст на языке программирования C#. Каждый такой файл имеет расширение .CS (в нашем примере файлы названы FileName1.cs, FileName2.cs и FileName3.cs ).
Любой файл с исходным текстом на языке программирования C# может как содержать FileName2.cs включает три A, B и C, а FileName1.cs и FileName3.cs не содержат
Наконец, каждое B содержит три описания трех X, Y и Z ), а А и С не содержат ни одного описания
Ранее в ходе лекций уже обсуждались механизмы
| Типы-значения | Ссылочные типы | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Переменная содержит | значение | ссылку на значение | ||||||||||
| Переменная хранится | в стеке | в куче | ||||||||||
| Значение по умолчнию | 0, false, ‘\0’ |
null |
||||||||||
| Оператор присваивания | копирует значение | копирует ссылку | ||||||||||
| Пример |
|
|
Рассмотрим более подробно реализацию двух основных семейств
Местом хранения переменной, определенной как
Значением, которым переменная инициализируется по умолчанию (необходимость выполнения этого требования диктуется идеологией безопасности Microsoft .NET) в случае определения посредством 0 (для целого или вещественного false (для логического ‘\0’ (для строкового null.
При выполнении оператора присваивания в случае переменной-значения копируется значение, а в случае переменной-ссылки – ссылка.
Приведенный пример иллюстрирует различия в реализации
Перейдем к более подробному описанию основных
Для большей наглядности сопоставления сведем отображения в таблицу на табл. 15.3.
| C# | | | Диапазон |
|---|---|---|---|
| sbyte | System.SByte | --- | -128..127 |
| byte | System.Byte | byte | 0..255 |
| short | System.Int16 | int | -32768..32767 |
| ushort | System.UInt16 | word | 0..65535 |
| long | System.Int64 | --- | -263..263-1 |
| float | System.Single | real | +1.5E-45..+3.4E+38 (32 Bit) |
| double | System.Double | --- | +5E-324..+1.7E+308 (64 Bit) |
| decimal | System.Decimal | --- | +1E-28..+7.9E+28 (128 Bit) |
| bool | System.Boolean | bool | true, false |
| char | System.Char | char | Символ (в коде unicode) |
Даже из предварительного анализа таблицы видно, что
Наконец, отметим, что все без исключения System.
Кроме понятия переменной, которое уже рассматривалось ранее в связи с
Напомним, что константные объекты в К с характеристикой Kxy = x.
Рассмотрим ряд примеров описания
enum языка C# представляет собой
enum Color {red, blue, green}
enum Access {personal=1, group=2, all=4}
enum Access1 : byte {personal=1,
group=2, all=4}
Пример использования
Color c = Color.blue;
Заметим, что для перечислимых
Access a = Access.personal | Access.group;
if((Access.personal a) != 0)
Console.WriteLine("access granted");
typeof, который для любого заданного
Заметим, что o.GetType(). Рассмотрим пример, иллюстрирующий использование оператора typeof:
Type t = typeof(int); Console.WriteLine(t.Name);
При выполнении данного примера Int32, что вполне соответствует данным из сравнительной таблицы отображения
Еще одной практически важной конструкцией C#, оперирующей sizeof, который возвращает размер элемента данного
csc /unsafe xxx.cs.
Приведем пример использования оператора sizeof (заметим, что ):
unsafe {
Console.WriteLine(
sizeof(int));
Console.WriteLine(
sizeof(MyEnumType));
Console.WriteLine(
sizeof(MyStructType));
}
Рассмотрим пример описания Point, моделирующей точку на плоскости:
struct Point {
public int x, y;
public Point (int x, int y) {
this.x = x;
this.y = y;
}
public void MoveTo (int a,int b) {
x=a;
y=b;
}
}
Заметим, что координаты точки x, y (в простейшем случае целочисленные), которые используются для определения ее положения, являются
Операция Point является функцией this представляет собой ссылку на текущий объект.
Наконец, операция (или, иначе, MoveTo изменяет текущее местоположение точки на пару целочисленных координат (a,b).
Для использования объекта-структуры необходимо проинициализировать объект-значение в MoveTo:
Point p = new Point(3, 4); p.MoveTo(10, 20);
Мы познакомились с одним из основных видов объектов языка программирования C#, а именно, со
В предыдущем примере фрагмента программы на C# дважды фигурировал Point. В связи с этим уместно вспомнить о проблеме коллизий переменных и возможных путях ее преодоления (в предыдущей части курса для решения этой задачи использовался
Объекты языка программирования C# могут быть описаны:
При этом принимаются следующие контекстные соглашения.
Во-первых, недопустимо двукратное описание в пределах данной
Кроме того, принимаются следующие соглашения об
Во-первых, любой private, protected ).
В процессе изучения структуры программы на языке C# неоднократно употреблялся термин
Рассмотрим два файла X.cs и Y.cs, содержащих исходные тексты программ на языке C#.
Содержание файла X.cs:
namespace A {
class C ...
interface I...
... struct S...
... enum e ...
... delegate d ...
namespace B {
// полное имя: A.B
...
}
}
Содержание файла Y.cs:
namespace A {
...
namespace B {
...
}
namespace C {
...
}
}
Заметим, что в файле X.cs содержатся описания A и B, а в файле Y.cs – A, B и C, причем в обоих случаях последующие A. При обращении к вложенному A.B.
Необходимо отметить, что
Несмотря на то, что язык программирования C# реализует объектно-ориентированный подход к программированию, целый ряд характерных особенностей унаследован им еще от ранних процедурных прародителей, прежде всего, языка C.
; ", ограниченная фигурными скобками " { " и " } "
Аналогом оператора
В языке программирования С# выделяют различные виды
void foo (int x) {
// блок методов
... локальные переменные ...
{ // вложенный блок
... локальные
переменные ...
}
for (int i = 0; ...) {
// блок структурированных
// операторов
... локальные
переменные ...
}
}
Как видно из примера,
Рассмотрим подробнее особенности описания локальных переменных в языке программирования C# на следующем примере программы:
void foo(int a) {
int b;
if (...) {
int b;
// ошибка: переменная b уже
// описана в другом блоке
int c;
// пока описание корректно,
// однако ...
int d;
...
}
else {
int a;
// ошибка: переменная а уже
// описана во внешнем блоке
int d;
// конфликтов с переменной d
// из предыдущего блока нет
}
for (int i=0;...){
...
}
for (int i=0;...){
...
}
// фрагмент корректен: нет
// конфликтов с переменной
// i из предыдущего
// цикла
int c;
// ошибка: c уже описана в
// данном пространстве имен
}
Рассмотрим функцию foo с одним целочисленным аргументом a, которая не возвращает значения.
Как видно из данного примера, коллизии описаний переменных возникают в случаях множественного описания внутри одного и того же
Заметим попутно, что условный оператор if...else языка C# весьма схож с подобным оператором языка for является оператором цикла.
Рассмотрим более сложный пример использования
Пусть программный проект на языке программирования C# содержит три файла с описаниями
Color.cs
namespace Util {
public enum Color {
...
}
}
Figures.cs
namespace Util.Figures {
public class Rect {
...
}
public class Circle {
...
}
}
Triangle.cs
namespace Util.Figures {
public class Triangle {
...
}
}
В данном случае при использовании полного имени Util. ) возможно обойтись без конкретизации Rect ), описанных внутри этого Util.Color ):
using Util.Figures;
class Test {
Rect r;
// без указания полного
// имени т.к. используем
// (Util.Figures)
Triangle t;
Util.Color c;
// c указанием
// полного имени
}
Проанализировав основные особенности языка программирования C#, а также исследовав структуру и принципы построения программ на этом языке, обозначим наиболее очевидные преимущества изучаемого языка программирования.
Прежде всего, необходимо отметить, что язык программирования C# претендует на подлинную объектную ориентированность (а всякая языковая сущность претендует на то, чтобы быть объектом).
Кроме того, язык программирования C# призван практически реализовать
Принципиально важным отличием от предшественников является изначальная ориентация на
Унифицированная, максимально близкая по масштабу и гибкости к
Расширенная поддержка событийно-ориентированного программирования выгодно отличает язык программирования C# от целого ряда предшественников.
Язык программирования C# является "родным" для создания приложений в среде Microsoft .NET, поскольку наиболее тесно и эффективно интегрирован с ней.
Объединение лучших идей современных языков программирования (Java, C++, Visual Basic и др.) делает язык C# не просто суммой их достоинств, а языком программирования нового поколения.
Несмотря на значительное количество принципиальных преимуществ по сравнению с существующими аналогами, язык программирования C# не лишен и отдельных недостатков, которые, весьма вероятно, носят субъективный, локальный, временный характер.
Утверждение, что язык программирования C# является чисто объектным, допускает неоднозначную интерпретацию. Так, например, профессор K. Гуткнехт (K.Gutknecht) из института ETH (г. Цюрих, Швейцария) предложил альтернативную (так называемую "активную") объектную модель для разработанного им языка программирования Zonnon.
На сегодня компилятор и среда разработки программного обеспечения, поддерживающие язык C#, обладают относительно невысокой производительностью (т.е. код программы на языке C# компилируется и выполняется примерно в 100 раз медленнее, чем тот же код на языке C). Справедливости ради нужно отметить, что производительность программ на C# вполне сравнима с тем же показателем для языка Java.
Пока программы, написанные на языке C#, не могут функционировать под управлением альтернативных операционных систем (ведутся работы по обеспечению совместимости с операционными системами Linux и FreeBSD семейства UNIX).
Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [ 23, 38, 53, 63, 77].
Прежде чем перейти непосредственно к исследованию конструктивных особенностей языка программирования C#, рассмотрим ход его развития.
История основной ветви языков программирования, которая привела к появлению C#, восходит к 60-м годам, а именно, ко времени возникновения языка B. Последний является типичным представителем ранних
Следующим шагом в "алфавите" языков программирования, ведущем к языку C#, стал язык C, который был изобретен на основе языка B в 1972 году. Авторами нового языка программирования стали К.Томпсон и Д.Ритчи (Dennis Ritchie), которые работали в исследовательской лаборатории компании ATT (ATT
Заметим, что название C++ для нового языка предложил Р.Маскитти (Rics Mascitti,
Наконец, уже в 2000 году, то есть более чем через 15 лет, корпорация Microsoft выпустила в свет C++ нового поколения под названием C# ("Си шарп"), основным постулатом которого является высказывание: "всякая сущность есть объект". Язык основан на строгой
Как уже отмечалось в ходе лекции, язык программирования C# объединил лучшие черты целого ряда предшественников. Кроме упомянутой ранее ветви языков B-C-C++, необходимо указать еще несколько знаковых для настоящего времени языков программирования, а именно, Java и Visual Basic.
Несмотря на весьма существенные различия между компонентной объектной моделью COM (основного стандарта Microsoft для компонентного проектирования и реализации программного обеспечения) и моделью
Как уже отмечалось, язык программирования C# основан на строгой
Перечислим наиболее характерные черты сходства языков программирования C# и Java. Прежде всего, оба языка относятся к категории объектно-ориентированных и предполагают единственность наследования. Другими важными особенностями, которые сближают языки программирования C# и Java, являются механизмы
От своего прямого предшественника, языка программирования C++, языком C# унаследованы следующие механизмы:
| Подобен языкам Java, C++ и VB, однако является компонентно-ориентированным и более безопасным | |
|---|---|
| Добавлен ряд новых черт (делегаты, | |
Сходство с Java |
Сходство с С++
|
К числу принципиально важных решений, которые реализованы корпорацией Microsoft в языке программирования C#, можно отнести следующие:
try );delegate – развитие indexer – операторы индекса для обращения к элементам класса-контейнера);foreach (обработка всех элементов классов-коллекций, аналог Visual Basic);boxing и unboxing для
(рис 15.1) Структура программы на языке C#.Особенности языка программирования C#, которые в большей степени отвечают целям настоящего учебного курса, будут рассмотрены в данной лекции более подробно.
Прежде всего, рассмотрим обобщенную структуру программы на языке программирования C#. Представим структуру программы на примере (см. рис.15.1).
Заметим, что программа на C# может состоять как из одного, так и из нескольких файлов, содержащих исходный текст на языке программирования C#. Каждый такой файл имеет расширение .CS (в нашем примере файлы названы FileName1.cs, FileName2.cs и FileName3.cs ).
Любой файл с исходным текстом на языке программирования C# может как содержать FileName2.cs включает три A, B и C, а FileName1.cs и FileName3.cs не содержат
Наконец, каждое B содержит три описания трех X, Y и Z ), а А и С не содержат ни одного описания
Ранее в ходе лекций уже обсуждались механизмы
| Типы-значения | Ссылочные типы | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Переменная содержит | значение | ссылку на значение | ||||||||||
| Переменная хранится | в стеке | в куче | ||||||||||
| Значение по умолчнию | 0, false, ‘\0’ |
null |
||||||||||
| Оператор присваивания | копирует значение | копирует ссылку | ||||||||||
| Пример |
|
|
Рассмотрим более подробно реализацию двух основных семейств
Местом хранения переменной, определенной как
Значением, которым переменная инициализируется по умолчанию (необходимость выполнения этого требования диктуется идеологией безопасности Microsoft .NET) в случае определения посредством 0 (для целого или вещественного false (для логического ‘\0’ (для строкового null.
При выполнении оператора присваивания в случае переменной-значения копируется значение, а в случае переменной-ссылки – ссылка.
Приведенный пример иллюстрирует различия в реализации
Перейдем к более подробному описанию основных
Для большей наглядности сопоставления сведем отображения в таблицу на табл. 15.3.
| C# | | | Диапазон |
|---|---|---|---|
| sbyte | System.SByte | --- | -128..127 |
| byte | System.Byte | byte | 0..255 |
| short | System.Int16 | int | -32768..32767 |
| ushort | System.UInt16 | word | 0..65535 |
| long | System.Int64 | --- | -263..263-1 |
| float | System.Single | real | +1.5E-45..+3.4E+38 (32 Bit) |
| double | System.Double | --- | +5E-324..+1.7E+308 (64 Bit) |
| decimal | System.Decimal | --- | +1E-28..+7.9E+28 (128 Bit) |
| bool | System.Boolean | bool | true, false |
| char | System.Char | char | Символ (в коде unicode) |
Даже из предварительного анализа таблицы видно, что
Наконец, отметим, что все без исключения System.
Кроме понятия переменной, которое уже рассматривалось ранее в связи с
Напомним, что константные объекты в К с характеристикой Kxy = x.
Рассмотрим ряд примеров описания
enum языка C# представляет собой
enum Color {red, blue, green}
enum Access {personal=1, group=2, all=4}
enum Access1 : byte {personal=1,
group=2, all=4}
Пример использования
Color c = Color.blue;
Заметим, что для перечислимых
Access a = Access.personal | Access.group;
if((Access.personal a) != 0)
Console.WriteLine("access granted");
typeof, который для любого заданного
Заметим, что o.GetType(). Рассмотрим пример, иллюстрирующий использование оператора typeof:
Type t = typeof(int); Console.WriteLine(t.Name);
При выполнении данного примера Int32, что вполне соответствует данным из сравнительной таблицы отображения
Еще одной практически важной конструкцией C#, оперирующей sizeof, который возвращает размер элемента данного
csc /unsafe xxx.cs.
Приведем пример использования оператора sizeof (заметим, что ):
unsafe {
Console.WriteLine(
sizeof(int));
Console.WriteLine(
sizeof(MyEnumType));
Console.WriteLine(
sizeof(MyStructType));
}
Рассмотрим пример описания Point, моделирующей точку на плоскости:
struct Point {
public int x, y;
public Point (int x, int y) {
this.x = x;
this.y = y;
}
public void MoveTo (int a,int b) {
x=a;
y=b;
}
}
Заметим, что координаты точки x, y (в простейшем случае целочисленные), которые используются для определения ее положения, являются
Операция Point является функцией this представляет собой ссылку на текущий объект.
Наконец, операция (или, иначе, MoveTo изменяет текущее местоположение точки на пару целочисленных координат (a,b).
Для использования объекта-структуры необходимо проинициализировать объект-значение в MoveTo:
Point p = new Point(3, 4); p.MoveTo(10, 20);
Мы познакомились с одним из основных видов объектов языка программирования C#, а именно, со
В предыдущем примере фрагмента программы на C# дважды фигурировал Point. В связи с этим уместно вспомнить о проблеме коллизий переменных и возможных путях ее преодоления (в предыдущей части курса для решения этой задачи использовался
Объекты языка программирования C# могут быть описаны:
При этом принимаются следующие контекстные соглашения.
Во-первых, недопустимо двукратное описание в пределах данной
Кроме того, принимаются следующие соглашения об
Во-первых, любой private, protected ).
В процессе изучения структуры программы на языке C# неоднократно употреблялся термин
Рассмотрим два файла X.cs и Y.cs, содержащих исходные тексты программ на языке C#.
Содержание файла X.cs:
namespace A {
class C ...
interface I...
... struct S...
... enum e ...
... delegate d ...
namespace B {
// полное имя: A.B
...
}
}
Содержание файла Y.cs:
namespace A {
...
namespace B {
...
}
namespace C {
...
}
}
Заметим, что в файле X.cs содержатся описания A и B, а в файле Y.cs – A, B и C, причем в обоих случаях последующие A. При обращении к вложенному A.B.
Необходимо отметить, что
Несмотря на то, что язык программирования C# реализует объектно-ориентированный подход к программированию, целый ряд характерных особенностей унаследован им еще от ранних процедурных прародителей, прежде всего, языка C.
; ", ограниченная фигурными скобками " { " и " } "
Аналогом оператора
В языке программирования С# выделяют различные виды
void foo (int x) {
// блок методов
... локальные переменные ...
{ // вложенный блок
... локальные
переменные ...
}
for (int i = 0; ...) {
// блок структурированных
// операторов
... локальные
переменные ...
}
}
Как видно из примера,
Рассмотрим подробнее особенности описания локальных переменных в языке программирования C# на следующем примере программы:
void foo(int a) {
int b;
if (...) {
int b;
// ошибка: переменная b уже
// описана в другом блоке
int c;
// пока описание корректно,
// однако ...
int d;
...
}
else {
int a;
// ошибка: переменная а уже
// описана во внешнем блоке
int d;
// конфликтов с переменной d
// из предыдущего блока нет
}
for (int i=0;...){
...
}
for (int i=0;...){
...
}
// фрагмент корректен: нет
// конфликтов с переменной
// i из предыдущего
// цикла
int c;
// ошибка: c уже описана в
// данном пространстве имен
}
Рассмотрим функцию foo с одним целочисленным аргументом a, которая не возвращает значения.
Как видно из данного примера, коллизии описаний переменных возникают в случаях множественного описания внутри одного и того же
Заметим попутно, что условный оператор if...else языка C# весьма схож с подобным оператором языка for является оператором цикла.
Рассмотрим более сложный пример использования
Пусть программный проект на языке программирования C# содержит три файла с описаниями
Color.cs
namespace Util {
public enum Color {
...
}
}
Figures.cs
namespace Util.Figures {
public class Rect {
...
}
public class Circle {
...
}
}
Triangle.cs
namespace Util.Figures {
public class Triangle {
...
}
}
В данном случае при использовании полного имени Util. ) возможно обойтись без конкретизации Rect ), описанных внутри этого Util.Color ):
using Util.Figures;
class Test {
Rect r;
// без указания полного
// имени т.к. используем
// (Util.Figures)
Triangle t;
Util.Color c;
// c указанием
// полного имени
}
Проанализировав основные особенности языка программирования C#, а также исследовав структуру и принципы построения программ на этом языке, обозначим наиболее очевидные преимущества изучаемого языка программирования.
Прежде всего, необходимо отметить, что язык программирования C# претендует на подлинную объектную ориентированность (а всякая языковая сущность претендует на то, чтобы быть объектом).
Кроме того, язык программирования C# призван практически реализовать
Принципиально важным отличием от предшественников является изначальная ориентация на
Унифицированная, максимально близкая по масштабу и гибкости к
Расширенная поддержка событийно-ориентированного программирования выгодно отличает язык программирования C# от целого ряда предшественников.
Язык программирования C# является "родным" для создания приложений в среде Microsoft .NET, поскольку наиболее тесно и эффективно интегрирован с ней.
Объединение лучших идей современных языков программирования (Java, C++, Visual Basic и др.) делает язык C# не просто суммой их достоинств, а языком программирования нового поколения.
Несмотря на значительное количество принципиальных преимуществ по сравнению с существующими аналогами, язык программирования C# не лишен и отдельных недостатков, которые, весьма вероятно, носят субъективный, локальный, временный характер.
Утверждение, что язык программирования C# является чисто объектным, допускает неоднозначную интерпретацию. Так, например, профессор K. Гуткнехт (K.Gutknecht) из института ETH (г. Цюрих, Швейцария) предложил альтернативную (так называемую "активную") объектную модель для разработанного им языка программирования Zonnon.
На сегодня компилятор и среда разработки программного обеспечения, поддерживающие язык C#, обладают относительно невысокой производительностью (т.е. код программы на языке C# компилируется и выполняется примерно в 100 раз медленнее, чем тот же код на языке C). Справедливости ради нужно отметить, что производительность программ на C# вполне сравнима с тем же показателем для языка Java.
Пока программы, написанные на языке C#, не могут функционировать под управлением альтернативных операционных систем (ведутся работы по обеспечению совместимости с операционными системами Linux и FreeBSD семейства UNIX).
Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [ 23, 38, 53, 63, 77].
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.