TOC

This article has been localized into Russian by the community.

Классы:

Константы (ключевое слово const)

До сих пор мы много работали с переменными, и, как следует из названия, переменные всегда можно изменить. Противоположностью этому является константа, введенная в C# с ключевым словом const. При объявлении константы необходимо немедленно присвоить ей значение, после чего значение этой константы не может быть изменено. Это хорошо, когда у вас есть значение, которое никогда не меняется, и вы хотите убедиться, что оно не манипулируется вашим кодом, даже случайно.

Вы найдете много констант в самом framework, в классе Math, где определена константа для PI.

Console.WriteLine(Math.PI);

Но, конечно, самое интересное-объявить собственные константы. Константу можно определить в области видимости метода, например:

static void Main(string[] args)
{
    const int TheAnswerToLife = 42;
    Console.WriteLine("The answer to life, the universe and everything: " +  TheAnswerToLife);
}

Однако большинство констант объявляются на уровне класса, так что они могут быть доступны (но не изменены, конечно) из всех методов класса и даже вне класса, в зависимости от области видимости. Константа будет действовать как статический член класса, что означает, что вы можете получить к ней доступ без создания экземпляра класса. Имея это в виду, давайте попробуем полный пример, где определены две константы - личная и публичная константы:

using System;

namespace Constants
{
    class Program
    {
static void Main(string[] args)
{
    Console.WriteLine("The fake answer to life: " + SomeClass.TheFakeAnswerToLife);
    Console.WriteLine("The real answer to life: " +  SomeClass.GetAnswer());
}
    }

    class SomeClass
    {
private const int TheAnswerToLife = 42;
public const int TheFakeAnswerToLife = 43;

public static int GetAnswer()
{
    return TheAnswerToLife;
}
    }
}

Обратите внимание, как я определяю класс (SomeClass) с двумя константами. Первый является частным, поэтому он может быть доступен только из самого класса, но другой общедоступный. Итак, в нашем основном программном коде я обращаюсь к обеим константам по-разному - во-первых, напрямую, так как неправильный ответ общедоступен, а во-вторых, с помощью метода GetAnswer ().

Какой тип данных может быть задан как константа?

Так как константы должны быть объявлены сразу и не могут быть изменены позже, значение, которое вы назначаете константе, должно быть константным выражением, и компилятор должен быть в состоянии оценить значение уже во время компиляции. Это означает, что числа, логические значения и строки могут быть использованы для константы, в то время как, например, объект DateTime не может быть использован в качестве константы.

Поскольку компилятор должен знать значение немедленно, это также означает, что существуют некоторые ограничения на то, что можно сделать при установке значения. Например, это прекрасные примеры того, что вы можете сделать:

const int a = 10;  
const float b = a * 2.5f;

const string s1 = "Hello, world!";  
const string s2 = s1 + " How are you?";

С другой стороны, нельзя использовать результат вызова метода или непостоянный член класса, так как они не являются константными выражениями. Вот несколько примеров того, что вы не можете сделать:

// NOT possible:
const int a = Math.Cos(4) * 2;
// Possible:
const string s1 = "Hello, world!";
// NOT possible:
const string s2 = s1.Substring(0, 6) + " Universe";

Разница заключается в том, что компилятор может знать, когда он достигает ваш код, например, числа, строки и другие константы, в отличие от того, что он должен выполнить, чтобы получить значение.

Альтернатива константе: поле readonly

Если вы ищете несколько менее ограничительную версию константы класса, вы можете взглянуть на ключевое слово readonly. Он недоступен на уровне метода, но может использоваться на уровне класса для определения поля, которое может быть изменено только во время объявления или выполнения метода конструктора класса. Таким образом, как только объект будет доступен для использования, поле readonly будет иметь одно и то же значение навсегда и не может быть изменено пользователем. Давайте попробуем:

class SomeClass
{
    private readonly DateTime rightNow;
    public readonly DateTime later = DateTime.Now.AddHours(2);

    public SomeClass()
    {
this.rightNow = DateTime.Now;
    }
}

Итак, у нас есть два поля только для чтения: первое-частное, второе-публичное (обычно у нас есть свойства для этого, но немного потерпите меня). Первый объявляется без значения (это можно сделать с полями только для чтения, в отличие от констант), а второй инициализируется немедленно. Вы также заметите, что мы используем класс DateTime в качестве типа данных и присваиваем ему непостоянное значение. Другими словами, мы делаем много вещей, которые мы не можем сделать с константами, делая поля только для чтения хорошей альтернативой константам.

Обратите внимание, как я присваиваю значение полю rightNow в конструкторе класса SomeClass. Как уже упоминалось, это последний шанс присвоить значение полю только для чтения. После этого, независимо от того, находитесь ли вы в методе внутри определяющего класса или снаружи, вы получите ошибку компиляции, если попытаетесь присвоить значение полю только для чтения.

Резюме

Константа может быть определена либо внутри области действия метода, либо на уровне класса. Это позволяет вам определить значение, которое известно уже во время компиляции и которое не может быть изменено позже. Типичными типами констант являются целые числа, числа с плавающей запятой, строки и логические значения. Если вы ищете больше гибкости, попробуйте поле только для чтения, как описано выше.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!