C# static关键字总结 (学习日记 2017-04-22)

本文详细介绍了C#中的静态类与静态成员的概念、特点及应用场景,包括如何使用static关键字声明静态成员,以及静态类的限制和优势。同时,通过实例展示了静态类在温度转换等实用场景中的具体应用。

static关键字

使用static修饰符能够声明属于类型本身而不属于特定对象的静态成员,static修饰符可以用于类、方法、属性、字段、运算符、事件和构造函数,但是不能用于析构函数、索引器或者类以外的类型。


静态类

静态类和非静态类的基本相同,但是和非静态类的一个显著的区别是,静态类不能够使用new关键字实例化,因为静态类是默认密封的(sealed)。在引用静态类的成员时,无法使用实例变量,必须要通过类名本身访问静态类的成员例如,如果名为UtilityClass 的静态类有一个名为 MethodA 的公共方法,则按下面的示例所示调用该方法:

 UtilityClass.MethodA();  //使用静态类的类名本身使用Method方法

静态类的运用场景

只需要输入参数或者无参数进行计算的方法集,而又不需要获取方法集任何内部字段和属性,应该考虑使用静态类作为这些方法集的容器。也就是说,只要不涉及到获取或者更改方法集内部的属性和字段,仅使用这个方法集获得一个结果或者更改一个状态,那么就可以把这些方法集放到静态类中。

例如,在 .NET Framework 类库中,静态类 System.Math 包含的方法只执行数学运算,而无需存储或检索特定 Math 类实例特有的数据。 就是说,通过指定类名称和方法名称来应用类成员,如下示例所述。

double dub = -3.14;  
Console.WriteLine(Math.Abs(dub));  
Console.WriteLine(Math.Floor(dub));  
Console.WriteLine(Math.Round(Math.Abs(dub)));   //传入一个值,获取一个结果,不涉及内部的任何字段和属性
  


和所有类类型一样,当加载引用静态类的程序时,.NET Framework 公共语言运行时 (CLR) 将加载该静态类的类型信息。程序不能指定加载静态类的确切时间。 但是,可以保证在程序中首次引用该类前加载该类,并初始化该类的字段并调用其静态构造函数。静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。


静态类的主要特性

  1. 仅仅包含静态成员(包括方法、字段、属性和事件)
  2. 静态类不能够被继承,默认是密封sealed的,因此无法实例化
  3. 静态类不能够包含实例构造函数,既是如果不重载静态类的构造函数,那么默认的构造函数也是静态的,如果重载了构造函数,必须在构造函数前加限定修饰符static


例子1:摄氏温度和华氏温度的转换

 public static class TemperatureConverter
    {
        public static double CelsiusToFahrenheit(string temperatureCelsius)
        {
            // 将string转换成double类型的数据
            double celsius = Double.Parse(temperatureCelsius);

            // 将摄氏温度转换成华氏温度
            double fahrenheit = (celsius * 9 / 5) + 32;

            return fahrenheit;  
        }

        public static double FahrenheitToCelsius(string temperatureFahrenheit)
        {
            // 将string转换成double类型的数据
            double fahrenheit = Double.Parse(temperatureFahrenheit);

            //华氏温度转换成摄氏温度
            double celsius = (fahrenheit - 32) * 5 / 9;

            return celsius;
        }
    }

    class TestTemperatureConverter
    {
        static void Main()
        {
            Console.WriteLine("请输入转换的方向");
            Console.WriteLine("1. 从摄氏温度转换成华氏温度.");
            Console.WriteLine("2. 从华氏温度转换成.");
            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;
            }

            // 保持窗口打开
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }


静态成员

非静态类可以包含静态成员,包括静态方法,字段,属性和事件,调用非静态类的静态成员,可使用非静态类名访问,而不能通过非静态类的实例名来调用。 一般认为非静态类的静态成员属于类本身,而不属于类的特定实例,无论一个类有多少个实例,它的静态成员都只有一个副本。

 静态方法和事件不能够访问所在非静态类的非静态字段和事件,并且不能访问任何对象的实例变量,只能够访问静态字段。

更常见的做法是将类中的一些成员设置成静态成员,而不是将整个类设置成为静态类,

静态字段的常见用法是:

  1. 记录已经被实例化的对象的个数。
  2. 存储必须在所有的实例中共享的值
静态方法可以被重写但是不能被重置,因为静态方法不属于任何类的实例。

虽然字段不能声明为 static const,但 const 字段的行为在本质上是静态的。 这样的字段属于类型,不属于类型的实例。 因此,可以同对待静态字段一样使用 ClassName.MemberName 表示法来访问 const 字段。 不需要对象实例。

 public class Automobile
    {
        public static int NumberOfWheels = 4;  //静态字段
        public static int SizeOfGasTank        //静态属性  在类型前加上static关键字
        {
            get
            {
                return 15;
            }
        }
        public static void Drive() { }                 //静态方法
        public static event EventType RunOutOfGas;     //静态事件

       
    }

访问非静态类的静态成员实例:

            Automobile.Drive();  //调用非静态类的静态方法,直接使用类名,而不是实例名
            int i = Automobile.NumberOfWheels;  //调用静态字段


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值