静态类和静态类成员

 的公共方法,则按下面的示例所示调用该方法:

 
UtilityClass.MethodA();

就是说,通过指定类名称和方法名称来应用类成员,如下示例所述。

 
 
double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));

// Output:
// 3.14
// -4
// 3


静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。

说明

Implementing Singleton in C#(在 C# 中实现单一实例)。

下表介绍静态类的主要特性:

  • 仅包含静态成员。

  • 无法实例化。

  • 是密封的。

  • 实例构造函数。

编译器将保证不会创建此类的实例。

静态构造函数(C# 编程指南)

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

 
    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();
        }
    }
    /* Example Output:
        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.
     */



静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例变量(除非在方法参数中显式传递)。

静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值。

静态方法可以被重载但不能被重写,因为它们属于类,不属于类的任何实例。

不需要对象实例。

C# 不支持静态局部变量(在方法范围内声明的变量)。

 关键字可以声明静态类成员,如下面的示例所示:

 
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...
}


若要访问静态类成员,应使用类名而不是变量名来指定该成员的位置,如下面的示例所示:

 
Automobile.Drive();
int i = Automobile.NumberOfWheels;


如果类包含静态字段,请提供在加载类时初始化这些字段的静态构造函数。

但是,两者之间的性能差异在大多数时候并不明显。