0

Инициализация статических полей класса c

Класс – это тип, а не объект данных, и в каждом объекте класса имеется своя собственная копия данных – членов этого класса. Однако некоторые типы требуется реализовать так, что все объекты этого типа могут совместно использовать некоторые данные. Такие совместно используемые данные должны быть описаны как часть класса.

Статические данные относятся ко всем объектам класса. Такие данные используются, если

  • требуется контроль общего количества объектов класса;
  • требуется одновременный доступ ко всем объектам или части их;
  • требуется разделение объектами общих ресурсов.

В этом случае в определение класса могут быть введены статические члены.

Статические члены описываются с помощью ключевого слова static , которое может использоваться при объявлении член-данных и член-функций.

Такие члены классов называются статическими, и независимо от количества объектов данного класса, существует только одна копия статического элемента.

Обращение к статическому элементу осуществляется с помощью оператора разрешения контекста и имени класса:
ИмяКласса :: ИмяЭлемента
Если x – статическое член-данное класса cl, то к нему можно обращаться как
cl::x
При этом не имеет значения количество объектов класса cl.

Аналогично можно обращаться к статической член-функции:

Статические член-данные (или поля) класса можно рассматривать как глобальную переменную класса. Но в отличие от обычных глобальных переменных на статические члены распространяются правила видимости private и public . Поместив статическую переменную в часть private , можно ограничить ее использование.

Объявление статического члена в объявлении класса не является определением, то есть это объявление статического члена не обеспечивает распределения памяти и инициализацию.

Инициализация статических полей

Статические поля нельзя инициализировать в теле класса, а также в методах. Статические поля должны инициализироваться аналогично глобальным переменным в области видимости файла:

Статические поля могут быть использованы для хранения информации, которая будет предоставляться или использоваться в классе без создания экземпляра этого типа. При инициализации статических полей необходимо соблюдать осторожность; удостоверяться, что значения применяются правильно.

Поля могут быть объявлены статическими так же, как методы и свойства. Добавление ключевого слова static указывает на то, что доступ к полю возможен с помощью добавления имени своего класса, а не через экземпляр класса. Если статическое поле является private, это значение может быть только прочитано; манипуляция им может производиться только внутри класса некоторыми типами (экземплярами) и только одно значение сохраняется и распределяется между этими экземплярами. Если к полю имеется более широкий доступ, то для всех типов, которые имеют доступ к нему, будет «видно» одно и то же значение.

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

На первый взгляд код кажется правильным. Имеем максимальное значение 8, минимальное 3 и можем ожидать, что DifVal будет равняться пяти. Однако, если вы запустите следующий код для вывода значений, то вы увидите результаты, которые не были ожидаемы:

Как вы можете видеть в комментариях, значение DifVal подсчитано неверно.

Разгадка неожиданного получения такого значения кроется в спецификации языка C#. Дело в том, что статические поля не могут рассматриваться как неинициализированные значения. Если они доступны, прежде чем им было присвоено значение, то возвращается то значение, которое используется по умолчанию для этого типа данных. Для целочисленного значения это нуль. Также спецификация языка C # говорит нам о том, что, когда статические поля инициализируются путем применения значения в их декларации, как мы делали выше, они устанавливаются в том порядке, в котором они появляются в коде. Это значит, что, когда рассчитывается DifVal, мы используем два неинициализированных значения, каждое из которых дает результат равный нулю.

Читайте также:  Как войти в сервисное меню телевизора филипс

Исправить это можно просто изменив порядок декларирования полей:

Теперь запуск программы дает правильные результаты:

К сожалению, такой подход не создает идеального кода: читаемого и поддерживаемого. Вполне возможно, что позднее другой разработчик может изменить порядок полей, например, чтобы отсортировать их в алфавитном порядке; невольно станет причиной ошибки. Лучше исправить это, удалить из инициализации объявления поля и установить значения в пределах статического конструктора, как показано ниже:

статьи IT, си шарп, спецификация, поля, static

Статический класс в основном такой же, как и нестатический класс, но имеется одно отличие: нельзя создавать экземпляры статического класса. A static class is basically the same as a non-static class, but there is one difference: a static class cannot be instantiated. Другими словами, нельзя использовать оператор new для создания переменной типа класса. In other words, you cannot use the new operator to create a variable of the class type. Поскольку нет переменной экземпляра, доступ к членам статического класса осуществляется с использованием самого имени класса. Because there is no instance variable, you access the members of a static class by using the class name itself. Например, если есть статический класс, называемый UtilityClass , имеющий открытый статический метод с именем MethodA , вызов метода выполняется, как показано в следующем примере: For example, if you have a static class that is named UtilityClass that has a public static method named MethodA , you call the method as shown in the following example:

Статический класс может использоваться как обычный контейнер для наборов методов, работающих на входных параметрах, и не должен возвращать или устанавливать каких-либо внутренних полей экземпляра. A static class can be used as a convenient container for sets of methods that just operate on input parameters and do not have to get or set any internal instance fields. Например, в библиотеке классов .NET Framework статический класс System.Math содержит методы, выполняющие математические операции, без требования сохранять или извлекать данные, уникальные для конкретного экземпляра класса Math. For example, in the .NET Framework Class Library, the static System.Math class contains methods that perform mathematical operations, without any requirement to store or retrieve data that is unique to a particular instance of the Math class. Это значит, что члены класса применяются путем задания имени класса и имени метода, как показано в следующем примере. That is, you apply the members of the class by specifying the class name and the method name, as shown in the following example.

Как и в случае со всеми типами классов, сведения о типе для статического класса загружаются средой .NET Framework CLR, когда загружается программа, которая ссылается на класс. As is the case with all class types, the type information for a static class is loaded by the .NET Framework common language runtime (CLR) when the program that references the class is loaded. Программа не может точно указать, когда загружается класс. The program cannot specify exactly when the class is loaded. Однако гарантируется загрузка этого класса, инициализация его полей и вызов статического конструктора перед первым обращением к классу в программе. However, it is guaranteed to be loaded and to have its fields initialized and its static constructor called before the class is referenced for the first time in your program. Статический конструктор вызывается только один раз, и статический класс остается в памяти на время существования домена приложения, в котором находится программа. A static constructor is only called one time, and a static class remains in memory for the lifetime of the application domain in which your program resides.

Читайте также:  Батарейки для фонарика 18650

Создание нестатического класса, который допускает создание только одного экземпляра самого себя, см. в документе Реализация Singleton в C#. To create a non-static class that allows only one instance of itself to be created, see Implementing Singleton in C#.

Ниже приведены основные возможности статического класса. The following list provides the main features of a static class:

Содержит только статические члены. Contains only static members.

Создавать его экземпляры нельзя. Cannot be instantiated.

Является запечатанным. Is sealed.

По сути, создание статического класса аналогично созданию класса, содержащего только статические члены и закрытый конструктор. Creating a static class is therefore basically the same as creating a class that contains only static members and a private constructor. Закрытый конструктор не допускает создания экземпляров класса. A private constructor prevents the class from being instantiated. Преимущество применения статических классов заключается в том, что компилятор может проверить отсутствие случайно добавленных членов экземпляров. The advantage of using a static class is that the compiler can check to make sure that no instance members are accidentally added. Таким образом, компилятор гарантирует невозможность создания экземпляров таких классов. The compiler will guarantee that instances of this class cannot be created.

Статические классы запечатаны, поэтому их нельзя наследовать. Static classes are sealed and therefore cannot be inherited. Они не могут наследовать ни от каких классов, кроме Object. They cannot inherit from any class except Object. Статические классы не могут содержать конструктор экземпляров, но могут содержать статический конструктор. Static classes cannot contain an instance constructor; however, they can contain a static constructor. Нестатические классы также должен определять статический конструктор, если класс содержит статические члены, для которых нужна нетривиальная инициализация. Non-static classes should also define a static constructor if the class contains static members that require non-trivial initialization. Дополнительные сведения см. в разделе Статические конструкторы. For more information, see Static Constructors.

Пример Example

Ниже приведен пример статического класса, содержащего два метода, преобразующих температуру по Цельсию в температуру по Фаренгейту и наоборот. Here is an example of a static class that contains two methods that convert temperature from Celsius to Fahrenheit and from Fahrenheit to Celsius:

Статический члены Static Members

Нестатический класс может содержать статические методы, поля, свойства или события. A non-static class can contain static methods, fields, properties, or events. Статический член вызывается для класса даже в том случае, если не создан экземпляр класса. The static member is callable on a class even when no instance of the class has been created. Доступ к статическому члены всегда выполняется по имени класса, а не экземпляра. The static member is always accessed by the class name, not the instance name. Существует только одна копия статического члена, независимо от того, сколько создано экземпляров класса. Only one copy of a static member exists, regardless of how many instances of the class are created. Статические методы и свойства не могут обращаться к нестатическим полям и событиям в их содержащем типе, и они не могут обращаться к переменной экземпляра объекта, если он не передается явно в параметре метода. Static methods and properties cannot access non-static fields and events in their containing type, and they cannot access an instance variable of any object unless it is explicitly passed in a method parameter.

Более привычно объявление нестатического класса с несколькими статическими членами, чем объявление всего класса как статического. It is more typical to declare a non-static class with some static members, than to declare an entire class as static. Статические поля обычно используются для следующих двух целей: хранение счетчика числа созданных объектов или хранение значения, которое должно совместно использоваться всеми экземплярами. Two common uses of static fields are to keep a count of the number of objects that have been instantiated, or to store a value that must be shared among all instances.

Читайте также:  Как включить safe mode windows 10

Статические методы могут быть перегружены, но не переопределены, поскольку они относятся к классу, а не к экземпляру класса. Static methods can be overloaded but not overridden, because they belong to the class, and not to any instance of the class.

Несмотря на то, что поле не может быть объявлено как static const , поле const по своему поведению является статическим. Although a field cannot be declared as static const , a const field is essentially static in its behavior. Он относится к типу, а не к экземплярам типа. It belongs to the type, not to instances of the type. Поэтому к полям const можно обращаться с использованием той же нотации ClassName.MemberName , что и для статических полей. Therefore, const fields can be accessed by using the same ClassName.MemberName notation that is used for static fields. Экземпляр объекта не требуется. No object instance is required.

C# не поддерживает статические локальные переменные (переменные, объявленные в области действия метода). C# does not support static local variables (variables that are declared in method scope).

Для объявления статических методов класса используется ключевое слово static перед возвращаемым типом члена, как показано в следующем примере: You declare static class members by using the static keyword before the return type of the member, as shown in the following example:

Статические члены инициализируются перед первым доступом к статическому члену и перед вызовом статического конструктора, если таковой имеется. Static members are initialized before the static member is accessed for the first time and before the static constructor, if there is one, is called. Для доступа к члену статического класса следует использовать имя класса, а не имя переменной, указывая расположение члена, как показано в следующем примере: To access a static class member, use the name of the class instead of a variable name to specify the location of the member, as shown in the following example:

Если класс содержит статические поля, должен быть указан статический конструктор, который инициализирует эти поля при загрузке класса. If your class contains static fields, provide a static constructor that initializes them when the class is loaded.

Вызов статического метода генерирует инструкцию вызова в промежуточном языке Microsoft (MSIL), в то время как вызов метода экземпляра генерирует инструкцию callvirt , которая также проверяет наличие ссылок на пустые объекты. A call to a static method generates a call instruction in Microsoft intermediate language (MSIL), whereas a call to an instance method generates a callvirt instruction, which also checks for a null object references. Однако в большинстве случаев разница в производительности двух видов вызовов несущественна. However, most of the time the performance difference between the two is not significant.

Спецификация языка C# C# Language Specification

Дополнительные сведения см. в разделах Статические классы и Члены экземпляра и статические члены в документации Предварительная спецификация C# 6.0. For more information, see Static classes and Static and instance members in the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#. The language specification is the definitive source for C# syntax and usage.

admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *