Быстрый обучение C# для начинающих

1- Введение

Данная статья является руководством  C# для начинающих. Для программирования  C# вам нужно установить инструмент программирования  Visual Studio. Можете посмотреть руководство скачивания и установки по ссылке: 
Если вы новичок в  C#, вам стоит прочитать эту статью от начала до конца, она поможет вам обрести общее знание перед тем как узнать другие углубленные статьи.

2- Создать ваш первый Project C#

Это первый вид при открытии  Visual Studio.
Создать новый Project:
Мы создали простой Project (Приложение  Console, это приложение не имеющее интерфейс).  Ввод:
  • Name: HelloCSharp
  • Solution: Create new solution
  • Solution Name: MySolution
Это иллюсттрация созданного вами Project. Вам нужно нажать на  Solution Explorer чтобы посмотреть структуру созданного Project.
Visual Studio создает  Solution (Решение) с названием  MySolution и содержит  Project с названием  HelloCSharp. И по умолчанию создает класс с названием  Program (Соответствующий файлу  Program.cs).
Заметка: Solution (Решение) может имет один или несколько  Project.
Изменить код класса  Program, чтобы при запуске на экране  Console появилось предложение  "Hello CSharp", и ждало, чтобы пользователь ввел текст перед завершением. 
Нажмите на  Start для запуска класса  Program.

3- Объяснение структуры класса 

Иллюстрация ниже является структурой класса  Program, находится в пространстве имет (namespace) HelloCSharp. Пространство имет может содержать один или несколько классов. 
Если вы хотите использовать определенный класс, вам нужно объявить использование того класса, или объявить использование пространства имет (namespace) содержащий тот класс.
// Объявить использование пространства имен (namespace) System.
// (Значит можно использовать все классы,.. имеющиеся в данном namespacе).
using System;
При запуске программы, вызывает метод  Main(string[]) для выполнения.
  1. static это ключевое слово оповещающий, что это статический метод.
  2. void это ключевое слово оповещающий, что этот метод ничего не возвращает. 
  3. args это параметр метода, массив string (строк) - string[].
static void Main(string[] args)
{
    // Записать на экране Console одну строку.
    Console.WriteLine("Hello CSharp");

    // Подождать когда пользователь введет что-либо 
    // и нажать Enter перед завершением программы.    
    Console.ReadLine();
}
После объявления использования пространства имен (namespace) System, вы можете использовать класс Console находящийся в этом  namespace. WriteLine(string) это статический метод класса  Console, он записывает на экране строку.
// Объявить для использования пространства имет System (System namespace).
// (Содержит класс Console).
using System;

// И вы можете использовать класс Console:
Console.WriteLine("Hello CSharp");

// Если вы не хотите объявлять использование пространства имен System.
// Но хотите использовать класс Console, вам нужно написать класс длиннее:
System.Console.WriteLine("Hello CSharp");

4- Объяснение cтруктуры Project

Решение ( Solution) может содержать в себе много  Project. В Project содержатся классы (class).
При просмотре  "Class view" вы можете увидеть к какому пространству имет (namespace) принадлежат ваши классы.
В CSharp вы создаете класс  Animal пространство имен которого называется  HelloCSharp, данный класс по умолчанию будет находиться в коренной папке project. Вы создаете другой класс  MyClass с пространством имен который называется  O7planning.CSharp, данный класс тоже находится в коренной папке project. С большим project и имеющим много классов, такая отганизация файла затруднит вас.Вы можете создать разные папки чтобы содержать классы, вам решать какие правила, но лучше всего создайте папку с названием  namespace. Научитесь как организовавать в  Java.

5- Важное примечание с программой C#

В приложении  C# вам нужно четко объявить класс с методом  Main(string[]) как начальный пункт чтобы запустить ваше приложение, это необязательно если ваше приложение имеет единственный класс с методом Main(string[]), но в случае когда имеется 2 класса с методом Main если вы не укажете четко, появится сообщение ошибки в процессе компиляции.

Поэтому, лучше всего объявите точно классы с методом Main(string[]), вы можете объявить снова для другого класса если хотите. 
Нажмите на правую мышь на  HelloCSharp project, выберите  Properties:
Выберите  "Startup object" это класс с методом Main(string[]) и  Save .

6- Добавить новый class

Теперь я добавлю класс с названием MyClass с пространсвом имен  O7planning.CSharp.
В "Solution Explorer" нажмите на правую мышь на project, выберите:
  • Add/New Folder
Назовите папку  O7planning.
Продолжаем, создаем папку "CSharp" это подпапка папки  "O7planning".
Нажмите на правую мышь на папку  "CSharp" выберите:
  • Add/Class
Выберите item вида  Class, и введите имена классов.
Класс создан, находится в пространстве имен  "HelloCSharp.O7planning.CSharp". Вы можете переименовать название пространствв имен в  "O7planning.CSharp".
Переименовать  namespace в "O7planning.CSharp".
Вы можете поменять содержание класса:
MyClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace O7planning.CSharp
{
   class MyClass
   {
       static void Main(string[] args)
       {
           Console.WriteLine("Hello from MyClass");
           Console.ReadLine();
       }
   }
}
Объявить класс  MyClass как начаольный пункт для запуска. Нажмите на правую мышь на Project выберите  Properties
Запуск примера:

7- Виды данных в C#

Type Represents Range Default Value
bool Boolean value True or False False
byte 8-bit unsigned integer 0 to 255 0
char 16-bit Unicode character U +0000 to U +ffff '\0'
decimal 128-bit precise decimal values with 28-29 significant digits (-7.9 x 1028 to 7.9 x 1028) / 100 to 28 0.0M
double 64-bit double-precision floating point type (+/-)5.0 x 10-324 to (+/-)1.7 x 10308 0.0D
float 32-bit single-precision floating point type -3.4 x 1038 to + 3.4 x 1038 0.0F
int 32-bit signed integer type -2,147,483,648 to 2,147,483,647 0
long 64-bit signed integer type -923,372,036,854,775,808 to 9,223,372,036,854,775,807 0L
sbyte 8-bit signed integer type -128 to 127 0
short 16-bit signed integer type -32,768 to 32,767 0
uint 32-bit unsigned integer type 0 to 4,294,967,295 0
ulong 64-bit unsigned integer type 0 to 18,446,744,073,709,551,615 0
ushort 16-bit unsigned integer type 0 to 65,535 0

8- Переменная и объявление

Переменная определяется названием места хранения данных, которым ваша программа может манипулировать. Каждая переменная в  C# имеет определенные данные, которые определяют размер и макет значений которые могут быть сохранены в памяти, и набор операторов применяющихся для переменной. 
Переменная может поменять значение в процессе существования в программе. Переменные с фиксированным значением называются константами. Используя ключевое слово const объявите переменную константу. 
Объявить переменную:
// Объявить переменную
// Data Type: Вид данных.
// Variable Name: Название переменной.
<Data Type> <Variable name>;

// Объявить переменную и прикрепить к ней значение.
<Data Type> <Variable name> = <value>;

// Объявить константу (constants)
const <Data Type> <Variable name> = <value>;
VariableExample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class VariableExample
    {   
        static void Main(string[] args)  
        {
            // Объявить константу с видом int.
            // Вы не можете дать новые значения константе.
            const int MAX_SCORE = 100;

            // Объявить переменную с видом int.
            int score = 0;

            // Прикрепить новое значение для переменной score.
            score = 90;

            // Объявить строку (string).
            string studentName = "Tom";

            // Распечатать значение переменной на экран Console.
            Console.WriteLine("Hi {0}", studentName);
            Console.WriteLine("Your score: {0}/{1}", score, MAX_SCORE);

            // Подождать когда пользователь введет что-то 
            // и нажмет Enter перед тем как завершится программа.
            Console.ReadLine();
        }
       

    }
}
Запуск примера:

9- Команда разветвления

9.1- Команда If-else

if это команда проверки определенного условия в C#. Например: Если  a > b то сделать что-то ....
Стандартные операторы сравнения: 
Оператор Значение Пример
> Больше 5 > 4 это правда (true)
< Меньше 4 < 5 это правда (true)
>= Больше или равно 4 >= 4 это правда (true)
<= Меньше или равно 3 <= 4 это правда (true)
== Равно 1 == 1 это правда (true)
!= Неравно  1 != 2 это правда (true)
&& И  a > 4 && a < 10
|| Или  a == 1 || a == 4
// Синтаксис
// condition: Условие проверки.
if ( condition )  
{
	// Сделать что-то здесь.
}
Например:
// Пример 1:
if ( 5 < 10 )
{
  Console.WriteLine( "Five is now less than ten");
}

// Пример 2:
if ( true )
{
  Console.WriteLine( "Do something here");
}
Полная структура  if - else if - else:
// Заметьте, будет выполнен максимум только один блок команды.
// Программа проверит условия сверху вниз.
// При встрече правильного условия, то этот блок команды тоже будет выполнен.
// Остальные условия будут пропущены.
...

// Если condition1 правильное то ..
if (condition1 )  
{
	 // Сделать что-то если condition1 является верным (true).
}
// Наоборот, если condition2 верное то ...
else if(condition2 )  
{
	// Сделать что-то если condition2 является верным (condition1 неверное).
}
// Наоборот если conditonN верное то ...
else if(conditionN )  
{
	 // Сделать что-то если conditionN является верным
	 // (Все условия выше являются неверными).
}
// Наоборот (Когда все условия выше являются неверными).
else  {
	 // Сделать что-то.
}
IfElseExample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class IfElseExample
    {
        static void Main(string[] args)
        {
            // Объявить переменную вида int, описывающую ваш возвраст.
            int age;

            Console.WriteLine("Please enter your age: \n");

            // Объявить переменную, для сохранения текста введенного пользователем с клавиш.
            string inputStr = Console.ReadLine();

            // Int32 является классом, находящимся в namespace System.
            // Использовать статический метод Parse класса Int32 для конвертирования строки в число
            // И прикрепить в переменную age.
            // (Примечание: Если 'inputStr' не является числами, может создать ошибку программы здесь).
            age = Int32.Parse(inputStr);

            Console.WriteLine("Your age: {0}", age);

            // Проверить если age (возраст) меньше 80 то...
            if (age < 80)
            {
                Console.WriteLine("You are pretty young");
            }

            // Наоборот если возраст в рамках 80, 100 то
            else if (age >= 80 && age <= 100)
            {
                Console.WriteLine("You are old");
            }
            // Наоборот (Остальные случаи)
            else
            {
                Console.WriteLine("You are verry old");
            }

            Console.ReadLine();
        }
    }
}
Запуск примера, и введите 81, и смотрите результат: 

9.2- Команда Switch-Case

Синтаксис  switch:
// Использовать ключевое слово 'switch' для прикрепления значения переменной.
switch ( <variable> )
{
  case value1:
      // Сделать что-то здесь, если значение переменной равно value1.
      break;
  case value2:
      // Сделать что-то здесь, если значение переменной равно value2.
      break;

  ...
	
  default:
     // Остальные случаи.
     break;
}
BreakExample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class BreakExample       
    {
        static void Main(string[] args)
        {
            // Предложить пользователю выбрать 1 вариант.
            Console.WriteLine("Please select one option:\n");

            Console.WriteLine("1 - Play a game \n");
            Console.WriteLine("2 - Play music \n");
            Console.WriteLine("3 - Shutdown computer \n");

             
            // Объявить переменную option
            int option;

            // Строка введенная пользователем через клавиатуру
            string inputStr = Console.ReadLine();

            // Строка конвертируется в целое число.
            option = Int32.Parse(inputStr);

            // Проверить значение 'option'.
            switch (option)
            {

                case 1:
                    Console.WriteLine("You choose to play the game");
                    break;
                case 2:
                    Console.WriteLine("You choose to play the music");
                    break;
                case 3:
                    Console.WriteLine("You choose to shutdown the computer");
                    break;
                default:
                    Console.WriteLine("Nothing to do...");
                    break;
            }

            Console.ReadLine();
        }
    }
}
Запуск примера и введите 2:

Примечание:

Команда  break в даннойм случае, говорит программе выйти из switch.
Вы можете включить много случаев ( case) чтобы выполнить один блок команды.
BreakExample2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class BreakExample2
    {
        static void Main(string[] args)
        {
            // Объявить переменную option и прикрепить к ней значение 3.
            int option = 3;

            Console.WriteLine("Option = {0}", option);

            // Проверить значение 'option'.
            switch (option)
            {

                case 1:
                    Console.WriteLine("Case 1");
                    break;

                // Если option = 2,3,4,5 обработать одинаково.  
                case 2: 
                case 3: 
                case 4: 
                case 5:
                    Console.WriteLine("Case 2,3,4,5!!!");
                    break;
                default:
                    Console.WriteLine("Nothing to do...");
                    break;
            } 

            Console.ReadLine();
        }
    }
}
Результаты запуска примера:

10- Цикл в C#

Цикл (loop) используется для запуска повторяющегося блока команды. Он заставляет вашу программу выполнять повторно блок команды много раз, это один из стандартных заданий программирования. 
C# поддерживает 3 разных вида циклов:
  • FOR
  • WHILE
  • DO WHILE

10.1- Цикл for

Синтаксис цикла  for:
// initialize variable: Инициализировать переменную.
// condition: Условие.
// updates new value for variable: Обновить новое значение для переменной.
for (initialize variable ; condition ; updates new value for variable )
{
	// Выполнить блок команды если условие верно (true).
}
Например:
// Пример 1:
// Создать переменную x и прикрепить к ней значение 0.
// Условие проверки x < 5
// Если x < 5 верно, то блок команды выполняется.
// После каждого повтора (iteration), значение x увеличивается на 1.
for (int  x = 0;  x < 5 ; x = x + 1)
{
	// Сделать что-то здесь если x < 5 верно (true).
}


// Пример 2:
// Создать переменную x и прикрепить к ней начальное значение 2
// Условие проверки  x < 15
// Если x < 15  верно, то блок команды выполняется.
// После каждого повтора (iteration), значение x увеличивается на 3.
for (int  x = 2;  x < 15 ; x = x + 3)
{
	// Сделать что-то здесь если x < 15 верно (true).
}
ForLoopExample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class ForLoopExample
    {
        static void Main(string[] args)
        {
            Console.WriteLine("For loop example"); 

            // Создать переменную x и прикрепить к ней значение 2
            // Условие проверки x < 15
            // Если x < 15 верно, то блок команды выполняется.
            // После каждого повтора (iteration), значение x увеличивается на 3.
            for (int x = 2; x < 15; x = x + 3)
            {
                Console.WriteLine( );
                Console.WriteLine("Value of x = {0}", x); 
            } 

            Console.ReadLine();
        }
    }
}
Результаты запуска примера:

10.2- Цикл while

Синтаксис цикла  while:
// condition: Условие
while (condition)  
{
	 // Если 'condition' верно, то выполнить блок команды.
}
Например:
// Объявить переменную x.
int x = 2;

while ( x < 10)
{
    // Сделать что-то здесь если x < 10 верно.
    ...
    	
    // Обновить значение переменной x.
    x = x + 3;
}
WhileLoopExample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class WhileLoopExample
    {
        static void Main(string[] args)
        {
           
            Console.WriteLine("While loop example");
 
            // Создать переменную x и прикрепить к ней значение 2.
            int x = 2;

            // Условие x < 10.
            // Если x < 10 верно, то блок команды выполняется.
            while (x < 10)
            {
                Console.WriteLine("Value of x = {0}", x);

                x = x + 3; 
            } 

            Console.ReadLine();
        }
    }
}
Результаты запуска примера:

10.3- Цикл do-while

Синтаксис цикла  do-while
// Характеристикой цикла 'do-while' является выполнение блока команды минимум 1 раз.
// После каждого повтора (iteration), он перепроверяет условие,
// Если условие верно, блок команды выполняется дальше.
do {
    // Сделать что-то здесь.
} while (condition); 
// Примечание: Нужно поставить точку с запятой (;) здесь.
DoWhileLoopExample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class DoWhileLoopExample
    {
        static void Main(string[] args)
        { 

            Console.WriteLine("Do-While loop example"); 

            // Создать переменную x и прикрепить к ней значение 2.
            int x = 2;

            // Выполнить блок команды минимум 1 раз.
            // После каждого повтора (iteration), он перепроверяет условие,
            // Если условие верное, блок команды выполняется дальше.
            do
            {
                Console.WriteLine("Value of x = {0}", x);

                x = x + 3; 

            } while (x < 10);
            // Примечание: Нужна точка с запятой здесь.
            Console.ReadLine();
        }
    }
}
Результаты запуска примера:

10.4- Команда break в цикле

break это команда которая может находиться в блоке цикла. Это команда заканчивает цикл безусловно.
LoopBreakExample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class LoopBreakExample
    {
        static void Main(string[] args)
        { 
            Console.WriteLine("Break example");

            // Создать переменную x и прикрепить к ней значение 2.
            int x = 2;

            while (x < 15)
            {

                Console.WriteLine("----------------------\n");
                Console.WriteLine("x = {0}", x);

                // Проверить если x = 5 то выйти из цикла.
                if (x == 5)
                {
                    break;
                }
                // Увеличить значение x на 1 (Написать кратко для x = x + 1;).
                x++;
                Console.WriteLine("x after ++ = {0}", x);

            }

            Console.ReadLine();
        }
    }
}
Результаты запуска примера:

10.5- Команда continue в цикле

continue это команда, которая находится в цикле, при столкновении с командой continue программа пропустит строки команд в нижних блоках continue и начнет новый цикл.
LoopContinueExample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class LoopContinueExample
    {
        static void Main(string[] args)
        { 

            Console.WriteLine("Continue example");

            // Создать переменную x и прикрепить к ней значение 2.
            int x = 2;

            while (x < 7)
            {

                Console.WriteLine("----------------------\n");
                Console.WriteLine("x = {0}", x);

                // Оператор % является делением с остатком.
                // Если х четное, то пропустить командные строки внизу 'continue',
                // и продолжить новый повтор (iteration) (если условие все еще верно).
                if (x % 2 == 0)
                {
                    // Увеличить значение x на 1 (Написать кратко для x = x + 1;).
                    x++;
                    continue;
                }
                else
                {
                    // Увеличить значение x на 1 (Написать кратко для x = x + 1;).
                    x++;
                }
                Console.WriteLine("x after ++ = {0}", x);

            }

            Console.ReadLine();
        }
    }
}
Результаты запуска примера:

11- Массив в C#

11.1- Одномерный массив

Это иллюстрация одномерного массива с 5 элементами, элементы индексированы от 0 до 4. 
Синтаксис объявления одномерного массива:
// Способ 1:
// Объявить массив чисел int, определить значение для элементов.
int[] years = { 2001, 2003, 2005, 1980, 2003 };

// Способ  2:
// Объявить массив чисел float, определить количество элементов.
// (3 элемента).
float[] salaries = new float[3];
ArrayExample1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class ArrayExample1
    {
        static void Main(string[] args)
        {
            // Способ 1:
            // Объявить массив, определить значение для элементов.
            int[] years = { 2001, 2003, 2005, 1980, 2003 };

            // Length является Property массива, который возвращает количество элементов массива.
            Console.WriteLine("Element count of array years = {0} \n", years.Length);

            // Использовать цикл для распечатки элементов массива.
            for (int i = 0; i < years.Length; i++) {
                Console.WriteLine("Element at {0} = {1}", i, years[i]);
            }

            // Способ 2:
            // Объявить массив с 3-мя элементами.
            float[] salaries = new float[3];

            // Прикрепить значение элементам.
            salaries[0] = 1000;
            salaries[1] = 1200;
            salaries[2] = 1100;

            Console.ReadLine();
        }
    }
}
Результаты запуска примера:

11.2- Двумерный массив

Это иллюстрация двухмерного массива
Синтаксис объявления двухмерного массива:
// Объявить 2-мерный массив, 3 строки & 5 столбцов.
// Определить значение элементов.
int[,] a =   new int[,]  {
    {1 , 2 , 3,  4,   5} ,
    {0,  3,  4,  5,   7},
    {0,  3,  4,  0,   0}
};

// Объявить 2-мерный массив, 3 строки & 5 столбцов.
// Не определять значение элементов.
int[,] a = new int[3,5];
ArrayExample2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class ArrayExample2
    {
        static void Main(string[] args)
        {
            // Объявить 2-мерный массив, 3 строки & 5 столбцов.
            // Определить значение элементов.
            int[,] a =   { 
                          { 1, 2, 3, 4, 5 },
                          { 0, 3, 4, 5, 7 },
                          { 0, 3, 4, 0, 0 } 
                          };

            // Использовать цикл for для распечатки элементов массива.
            for (int row = 0; row < 3; row++) {
                for (int col = 0; col < 5; col++) {
                    Console.WriteLine("Element at [{0},{1}] = {2}", row, col, a[row,col]);
                }
                Console.WriteLine("-------------");
            }

            // Объявить 2-мерный массив с 3 строками, 5 столбцами
            // Элементам не прикреплено значение.
            int[,] b = new int[3, 5];

            Console.ReadLine();
        }
    }
}
Результаты запуска примера:

11.3- Массив массива

ArrayOfArrayExample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class ArrayOfArrayExample
    {
        static void Main(string[] args)
        {
            // Объявить массив с 3 элементами.
            // Каждый элемент это отдельный массив.
            string[][] teams = new string[3][];

            string[] mu = { "Beckham","Giggs"};
            string[] asenal = { "Oezil", "Szczęsny", "Walcott" };
            string[] chelsea = {"Oscar","Hazard","Drogba" };

            teams[0] = mu;
            teams[1] = asenal;
            teams[2] = chelsea;

            // Использовать цикл for для распечатки элементов массива.
            for (int row = 0; row < teams.Length; row++)
            {
                for (int col = 0; col < teams[row].Length ; col++)
                {
                    Console.WriteLine("Element at [{0}],[{1}] = {2}", row, col, teams[row][col]);
                }
                Console.WriteLine("-------------");
            }
 

            Console.ReadLine();
        }
    }
}
Результаты запуска примера:

12- Class, Constructor и объект

You need to have a distinction between three concepts:
  • Class
  • Constructor
  • Instance
When we talk about the tree, it is something abstract, it is a class. But when we pointed to a specific tree, it was clear, and that is the instance
Or when we talk about the Person, that's abstract, it is a class. But when pointed at you or me, it is two different instances, the same class of People.
Person.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class Person
    { 
        // Это поле (field) .
        // Хранящее имена людей.
        public string Name;

        // Это Constructor.
        // Используется для создания объекта.
        // Ланный Constructor имеет один параметр.
        // Constructr всегда имеет название одинаковое с названием класса.
        public Person(string persionName)
        {
            // Прикрепить значение параметра полю name.
            this.Name = persionName;
        }

        // Это метод возвращающий вид string.
        public string GetName()
        {
            return this.Name; 
        }
    }
}
Person class without Main method. Next in PersonTest, we create Person instance from its Constructor
PersonTest.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace HelloCSharp
{
    class PersonTest
    {
        static void Main(string[] args)
        {
            // Создать объект класса Person.
            // Инициализировать этот объект из Constructor класса Person.
            Person edison = new Person("Edison");

            // Класс Person имеет метод GetName().
            // Использовать объект для вызова метода GetName():
            String name = edison.GetName();
            Console.WriteLine("Person 1: " + name);

            // Создать объект класса Person.
            // Инициализировать этот объект из Constructor класса Person.
            Person billGate = new Person("Bill Gates");

            // Класс Person имеет поле 'name' которое является публичным (public).
            // Вы можете использовать объект для доступа в поле 'name'.
            String name2 = billGate.Name;
            Console.WriteLine("Person 2: " + name2);

            Console.ReadLine();
        } 
    }
}
Running the example:

13- Поле (Field)

In this section we will discuss some of the concepts:
  • Field
    • Normal field
    • static Field
    • const Field
    • readonly Field
FieldSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class FieldSample
    {
        // Это статическое поле (static field).
        public static int MY_STATIC_FIELD = 100;

        // Это обычное поле.
        public string MyValue;

        // Это Constructor класса FieldSample.
        public FieldSample(string value)
        {
            this.MyValue = value;
        }
    }
}
FieldSampleTest.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class FieldSampleTest
    {
        static void Main(string[] args)
        {   
            // Распечатать значения статического поля (static field).
            // Со статическими полями, вам нужно получить к ним доступ через название класса.
            Console.WriteLine("FieldSample.MY_STATIC_FIELD= {0}", FieldSample.MY_STATIC_FIELD);

            // Вы можете поменять значение статического поля.
            FieldSample.MY_STATIC_FIELD = 200;

            Console.WriteLine(" ------------- "); 

            // Создать первый объект.
            FieldSample obj1 = new FieldSample("Value1");

            // Для нестатических полей вам нужно получить доступ через объект.
            Console.WriteLine("obj1.MyValue= {0}",  obj1.MyValue);  

            // Создать 2-ой объект:
            FieldSample obj2 = new FieldSample("Value2");

           
            Console.WriteLine("obj2.MyValue= {0}" , obj2.MyValue);

            // Вы можете поменять значение поля.
            obj2.MyValue = "Value2-2";

            Console.ReadLine();
        }
     
    }
}
Running the example:

Example readonly & static readonly.

ConstFieldExample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace HelloCSharp
{
    class ConstFieldExample
    {
        // Поле константы, его значение определяется во время компиляции.
        // Вы не можете прикрепить новое значение для полей const.
        // Примечание: Поле const всегда является static (Статическим).
        public const int MY_VALUE = 100;
 
        // Статическое поле (static field) и readonly.
        // Его значение может быть заранее прикреплено, или прикрепляется только 1 раз в Constructor.
        public static readonly DateTime INIT_DATE_TIME1 = DateTime.Now;

        // Поле readonly и нестатическое (none-static)
        // Его значение может быть заранее прикреплено, или прикрепляется только 1 раз в Constructor.
        public readonly DateTime INIT_DATE_TIME2 ;

        public ConstFieldExample()
        {
            // Его значение прикрепляется 1 раз, во время первого запуска.
            INIT_DATE_TIME2 = DateTime.Now;
        }
    }
}

14- Метод (Method)

Method
  • Method.
  • static Method
  • sealed Method. (Will be mentioned in the inheritance of the class).
MethodSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class MethodSample
    {
        public string text = "Some text";

        // Constructor по умолчанию.
        // Значит Constructor не имеет параметра.
        public MethodSample()
        {

        }

        // Это метод возвращающий вид String.
        // Данный метод не имеет параметров.
        public string GetText()
        {
            return this.text;
        }

        // Это метод с 1 параметром String.
        // Этот метод возвращает void (То есть ничего не возвращает)
        public void SetText(string text)
        {
            // this.text: ссылается к полю text.
            // Чтобы отличить с параметром text.
            this.text = text;
        }

        // Это статический метод.
        // Возвращает вид int, и имеет 3 параметра.
        public static int Sum(int a, int b, int c)
        {
            int d = a + b + c;
            return d;
        }
    }
}
MethodSampleTest.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class MethodSampleTest
    {
        static void Main(string[] args) 
        { 
            // Создать объект MethodSample
            MethodSample obj = new MethodSample();

            // Вызвать метод GetText().
            // Нестатические методы должны быть вызваны через объект.
            String text = obj.GetText();
 
            Console.WriteLine("Text = " + text);

            // Вызвать метод SetText(string)
            // Нестатические методы должны быть вызваны через объект.
            obj.SetText("New Text");
 
            Console.WriteLine("Text = " + obj.GetText());

            // Статические методы должны быть вызваны через название класса.
            int sum = MethodSample.Sum(10, 20, 30);
 
            Console.WriteLine("Sum  10,20,30= " + sum);

            Console.ReadLine();
       }
    }
}
Running the example:

15- Наследственность в C#

Java allows classes which extend from other class. Class extends another class called subclasses. Subclasses have the ability to inherit the fields attributes, methods from the parent class.
See an example of inheritance in CSharp:
Animal.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    // Симуляция класса животных.
    class Animal
    {
        public Animal()
        {

        }

        public void Move()
        {
            Console.WriteLine("Move ...!");
        }
      
    }
}
Cat.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class Cat : Animal
    {
      
        public   void Say()
        {
            Console.WriteLine("Meo");
        } 

        // Метод класса Cat.
        public void Catch()
        {
            Console.WriteLine("Catch Mouse");
        }
    }
}
Ant.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    // Муравей
    class Ant : Animal
    {
    }
}
AnimalTest.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelloCSharp
{
    class AnimalTest
    {

        static void Main(string[] args)
        {
            // Создать объект Cat.
            Cat tom = new Cat();

            // Проверить является ли 'tom' объектом Animal или нет.
            // Результат является true.
            bool isAnimal = tom is Animal;

            // ==> true
            Console.WriteLine("tom is Animal? " + isAnimal);

            // Вызвать метод Catch
            tom.Catch();

            // Вызвать в методе Say() у Cat.
            // ==> Meo
            tom.Say();

            Console.WriteLine("--------------------");

            // Объявить объект Animal
            // Создать объект через конструктор Cat.
            Animal tom2 = new Cat();

            // Вызвать метод Move()
            tom2.Move();

            Console.WriteLine("--------------------");

            // Создать объект Ant.
            Ant ant = new Ant();

            // Вызвать метод Move() унаследованный от Animal.
            ant.Move();

            Console.ReadLine();
        }
    }
}
Результат запуска примера  AnimalTest:

16- Наследование и полиморфизм в C #

You can read more "Inheritance and polymorphism in CSharp" at: