Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Когда следует использовать статические классы

Предположим, что имеется класс CompanyInfo, содержащий следующие методы получения сведений о названии компании и ее адресе.

class CompanyInfo

{

public string GetCompanyName() { return "CompanyName"; }

public string GetCompanyAddress() { return "CompanyAddress"; }

//...

}

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

static class CompanyInfo

{

public static string GetCompanyName() { return "CompanyName"; }

public static string GetCompanyAddress() { return "CompanyAddress"; }

//...

}

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

Static Members

A static method, field, property, or event is callable on a class even when no instance of the class has been created. If any instances of the class are created, they cannot be used to access the static member. Only one copy of static fields and events exists, and static methods and properties can only access static fields and static events. Static members are often used to represent data or calculations that do not change in response to object state; for example, a math library might contain static methods for calculating sine and cosine.

Static methods can be overloaded but not overridden.

Static class members are declared by using the static keyword before the return type of the member, for example:

public class Automobile

{

public static int NumberOfWheels = 4;

public static int SizeOfGasTank

{

get

{

return 15;

}

}

public static void Drive() { }

public static event EventType RunOutOfGas;

//other non-static fields and properties...

}

Static members are initialized before the static member is accessed for the first time and before the static constructor, if any 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. For example:

Automobile.Drive();

int i = Automobile.NumberOfWheels;

Статические члены

Статический метод, поле, свойство или событие можно вызвать для класса даже в том случае, если не создано экземпляра класса. Если созданы экземпляры класса, их нельзя использовать для доступа к статическому члену. Существует только одна копия статических полей и событий; статические методы и свойства могут получить доступ только к статическим полям и событиям. Зачастую статические члены используются для представления данных или вычислений, которые не изменяются в зависимости от состояния объекта. Например, математическая библиотека может содержать статические методы для вычисления синуса и косинуса.

Статические методы могу быть перегружены, но не переопределены.

Для объявления статических методов используется ключевое слово static перед возвращаемым типом члена. Пример:

---

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

Automobile.Drive();

int i = Automobile.NumberOfWheels;

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:

public static class TemperatureConverter

{

public static double CelsiusToFahrenheit(string temperatureCelsius)

{

// Convert argument to double for calculations.

double celsius = System.Double.Parse(temperatureCelsius);

// Convert Celsius to Fahrenheit.

double fahrenheit = (celsius * 9 / 5) + 32;

return fahrenheit;

}

public static double FahrenheitToCelsius(string temperatureFahrenheit)

{

// Convert argument to double for calculations.

double fahrenheit = System.Double.Parse(temperatureFahrenheit);

// Convert Fahrenheit to Celsius.

double celsius = (fahrenheit - 32) * 5 / 9;

return celsius;

}

}

Пример

Ниже приведен пример статического класса, содержащего два метода, преобразующих температуру по Цельсию в температуру по Фаренгейту и наоборот.

-----

class TestTemperatureConverter

{

static void Main()

{

System.Console.WriteLine(

"Please select the convertor direction");

System.Console.WriteLine("1. From Celsius to Fahrenheit.");

System.Console.WriteLine("2. From Fahrenheit to Celsius.");

System.Console.Write(":");

string selection = System.Console.ReadLine();

double F, C = 0;

switch (selection)

{

case "1":

System.Console.Write(

"Please enter the Celsius temperature: ");

F =

TemperatureConverter.CelsiusToFahrenheit(System.Console.ReadLine());

System.Console.WriteLine(

"Temperature in Fahrenheit: {0:F2}", F);

break;

case "2":

System.Console.Write(

"Please enter the Fahrenheit temperature: ");

C = TemperatureConverter.FahrenheitToCelsius(System.Console.ReadLine());

System.Console.WriteLine(

"Temperature in Celsius: {0:F2}", C);

break;

default:

System.Console.WriteLine(

"Please select a convertor.");

break;

}

}

}

-----

Input

2

98.6

Sample Output:

Please select the convertor

1. From Celsius to Fahrenheit.

2. From Fahrenheit to Celsius.

:2

Please enter the Fahrenheit temperature: 98.6

Temperature in Celsius: 37.00

Additional sample output might look as follows:

Please select the convertor

1. From Celsius to Fahrenheit.

2. From Fahrenheit to Celsius.

:1

Please enter the Celsius temperature: 37.00

Temperature in Fahrenheit: 98.60