理解C#编程中的静态类和静态成员以及密封类

2019-12-30 11:41:16刘景俊

下面是一个静态类的示例,它包含两个在摄氏温度和华氏温度之间执行来回转换的方法:


public static class TemperatureConverter
{
 public static double CelsiusToFahrenheit(string temperatureCelsius)
 {
  // Convert argument to double for calculations.
  double celsius = 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 = Double.Parse(temperatureFahrenheit);

  // Convert Fahrenheit to Celsius.
  double celsius = (fahrenheit - 32) * 5 / 9;

  return celsius;
 }
}

class TestTemperatureConverter
{
 static void Main()
 {
  Console.WriteLine("Please select the convertor direction");
  Console.WriteLine("1. From Celsius to Fahrenheit.");
  Console.WriteLine("2. From Fahrenheit to Celsius.");
  Console.Write(":");

  string selection = Console.ReadLine();
  double F, C = 0;

  switch (selection)
  {
   case "1":
    Console.Write("Please enter the Celsius temperature: ");
    F = TemperatureConverter.CelsiusToFahrenheit(Console.ReadLine());
    Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F);
    break;

   case "2":
    Console.Write("Please enter the Fahrenheit temperature: ");
    C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine());
    Console.WriteLine("Temperature in Celsius: {0:F2}", C);
    break;

   default:
    Console.WriteLine("Please select a convertor.");
    break;
  }

  // Keep the console window open in debug mode.
  Console.WriteLine("Press any key to exit.");
  Console.ReadKey();
 }
}

输出:


 Please select the convertor direction
 1. From Celsius to Fahrenheit.
 2. From Fahrenheit to Celsius.
 :2
 Please enter the Fahrenheit temperature: 20
 Temperature in Celsius: -6.67
 Press any key to exit.

 

静态成员
非静态类可以包含静态的方法、字段、属性或事件。即使没有创建类的实例,也可以调用该类中的静态成员。始终通过类名而不是实例名称访问静态成员。无论对一个类创建多少个实例,它的静态成员都只有一个副本。静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例变量(除非在方法参数中显式传递)。
更常见的做法是声明具有一些静态成员的非静态类,而不是将整个类声明为静态类。静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值。