123 lines
3.4 KiB
C#
123 lines
3.4 KiB
C#
|
using System;
|
|||
|
|
|||
|
/*
|
|||
|
* const и readonly
|
|||
|
*/
|
|||
|
class MyLogger
|
|||
|
{
|
|||
|
public void Info(string message)
|
|||
|
{
|
|||
|
Console.WriteLine($"{DateTime.Now}\t|INFO|\t{message}");
|
|||
|
}
|
|||
|
|
|||
|
public void Error(string message)
|
|||
|
{
|
|||
|
Console.WriteLine($"{DateTime.Now}\t|ERROR|\t{message}");
|
|||
|
}
|
|||
|
|
|||
|
public void Warn(string message)
|
|||
|
{
|
|||
|
Console.WriteLine($"{DateTime.Now}\t|WARN|\t{message}");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class Car
|
|||
|
{
|
|||
|
private const string ENGINE_IS_STARTED_MESSAGE = "Двигатель запущен!";
|
|||
|
private const string ATTEMPT_TO_START_ENGINE_MESSAGE = "Завожу двигатель!";
|
|||
|
private const string ENGINE_HAS_ALREADY_STARTED_MESSAGE = "Лапоть, двигатель уже запущен!";
|
|||
|
private const string ATTEMPT_TO_DRIVE_MESSAGE = "Тапку в пол!";
|
|||
|
private const string DRIVE_MESSAGE = "Поехали";
|
|||
|
private const string DRIVE_ERROR_MESSAGE = "Лапоть, сначала заведи двигатель";
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Это некий сервис который мы не будем менять
|
|||
|
/// использует класс Car под свои нужды
|
|||
|
/// </summary>
|
|||
|
private readonly MyLogger _myLogger;
|
|||
|
|
|||
|
private bool isEngineStarted;
|
|||
|
|
|||
|
public Car(MyLogger myLogger)
|
|||
|
{
|
|||
|
_myLogger = myLogger;
|
|||
|
}
|
|||
|
|
|||
|
public void StartEngine()
|
|||
|
{
|
|||
|
_myLogger.Info(ATTEMPT_TO_START_ENGINE_MESSAGE);
|
|||
|
if (isEngineStarted)
|
|||
|
{
|
|||
|
_myLogger.Warn(ENGINE_HAS_ALREADY_STARTED_MESSAGE);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
isEngineStarted = true;
|
|||
|
_myLogger.Info(ENGINE_IS_STARTED_MESSAGE);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Drive()
|
|||
|
{
|
|||
|
_myLogger.Info(ATTEMPT_TO_DRIVE_MESSAGE);
|
|||
|
if (isEngineStarted)
|
|||
|
_myLogger.Info(DRIVE_MESSAGE);
|
|||
|
else
|
|||
|
_myLogger.Error(DRIVE_ERROR_MESSAGE);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class ConstReadonly
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// const(не явно становится static)
|
|||
|
/// всегда должны помещать туда данные
|
|||
|
/// не изменяемое
|
|||
|
/// удобно для хранения сообщения об ошибках
|
|||
|
/// все константы - большими буквами
|
|||
|
/// позволяет избежать эффекта -магических чисел-
|
|||
|
/// </summary>
|
|||
|
public const double PI = 3.14;
|
|||
|
public const string MY_ERROR = "some error";
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// readonly(НЕ static)
|
|||
|
/// изменяется только в конструкторе
|
|||
|
/// </summary>
|
|||
|
public readonly int _g = 1;
|
|||
|
/// <summary>
|
|||
|
/// можно сделать явно статическим
|
|||
|
/// можно использовать и менять только в статическом конструкторе
|
|||
|
/// </summary>
|
|||
|
public static readonly int _gg = 2;
|
|||
|
|
|||
|
static ConstReadonly() => _gg = 43;
|
|||
|
|
|||
|
public ConstReadonly(int g) => _g = g;
|
|||
|
|
|||
|
public void Foo()
|
|||
|
{
|
|||
|
Console.WriteLine(PI);
|
|||
|
Console.WriteLine(MY_ERROR);
|
|||
|
Console.WriteLine(_g);
|
|||
|
Console.WriteLine(_gg);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class Program
|
|||
|
{
|
|||
|
static void Main()
|
|||
|
{
|
|||
|
Console.WriteLine(ConstReadonly._gg);
|
|||
|
Console.WriteLine(ConstReadonly.MY_ERROR);
|
|||
|
Console.WriteLine(ConstReadonly.PI);
|
|||
|
|
|||
|
Car car = new Car(new MyLogger());
|
|||
|
car.Drive();
|
|||
|
car.StartEngine();
|
|||
|
car.StartEngine();
|
|||
|
car.Drive();
|
|||
|
Console.ReadKey();
|
|||
|
}
|
|||
|
}
|