C#基础知识系列六(静态类和静态类成员)

简介: 静态类   静态类与非静态类基本相同,但存在一个区别:静态类不能实例化。 也就是说,不能使用 new 关键字创建静态类类型的变量。 因为没有实例变量,所以要使用类名本身访问静态类的成员。 例如,如果名为 UtilityClass 的静态类有一个名为 MethodA 的公共方法,则按下面的示例所示调...

静态类

  静态类与非静态类基本相同,但存在一个区别:静态类不能实例化。 也就是说,不能使用 new 关键字创建静态类类型的变量。 因为没有实例变量,所以要使用类名本身访问静态类的成员。 例如,如果名为 UtilityClass 的静态类有一个名为 MethodA 的公共方法,则按下面的示例所示调用该方法:

    public class UtilityClass
    {
        public static void MethodA()
        { 
            ////
        }
    }

    class TestCounter
    {
        static void Main()
        {
            UtilityClass.MethodA();
            Console.ReadKey();
        }
    }

对于只对输入参数进行运算而不获取或设置任何内部实例字段的方法集,静态类可以方便地用作这些方法集的容器。 例如,在 .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)));

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

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

若要创建仅允许创建一个自身实例的非静态类,请参见 C# 中的单例模式http://www.cnblogs.com/aehyok/archive/2013/05/08/3066127.html)。

静态类的主要特性:
1:仅包含静态成员。
2:无法实例化。
3:是密封的。
4:不能包含实例构造函数。

  因此,创建静态类与创建仅包含静态成员和私有构造函数的类基本相同。 私有构造函数阻止类被实例化。 使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。 编译器将保证不会创建此类的实例。 

  静态类是密封的,因此不可被继承。 它们不能从除 Object 外的任何类中继承。 静态类不能包含实例构造函数,但可以包含静态构造函数。 如果非静态类包含需要进行重要的初始化的静态成员,也应定义静态构造函数。

 

静态类成员

  非静态类可以包含静态的方法、字段、属性或事件。 即使没有创建类的实例,也可以调用该类中的静态成员。 始终通过类名而不是实例名称访问静态成员。 无论对一个类创建多少个实例,它的静态成员都只有一个副本。 静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例变量(除非在方法参数中显式传递)。

  更常见的做法是声明具有一些静态成员的非静态类,而不是将整个类声明为静态类。 静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值。

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

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

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

通过在成员的返回类型之前使用 static 关键字可以声明静态类成员,如下面的示例所示:

 

public class Automobile
{
    public static int NumberOfWheels = 4;
    public static int SizeOfGasTank
    {
        get
        {
            return 15;
        }
    }
    public static void Drive() { }
    public static event EventType RunOutOfGas;
}

静态成员在第一次被访问之前并且在调用静态构造函数(如有存在)之前进行初始化。 若要访问静态类成员,应使用类名而不是变量名来指定该成员的位置,如下面的示例所示:

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

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

对静态方法的调用以 Microsoft 中间语言 (MSIL) 生成调用指令,而对实例方法的调用生成 callvirt 指令,该指令还检查 null 对象引用。 但是,两者之间的性能差异在大多数时候并不明显。

 

1:静态类在内存中是一直有位置的;
2:非静态类在实例化后是在内存中是独立的,它的变量不会重复,在使用后会及时销毁,所以不会出现未知的错误。在C#中静态成员是比较敏感的东西,在不是十分确认的情况下不要使用;
3:建议更多地使用一般类(非静态类)。

4:当定义的类不需要进行实例化时,我们使用静态类;如果需要实例化对象,需要继承等特性时,应该使用非静态类,并且将统一使用的变量和方法设为静态的,那么所有实例对象都能访问。

目录
相关文章
|
2月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
3月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
86 2
|
4月前
|
C#
一文搞懂C#中类成员的可访问性
一文搞懂C#中类成员的可访问性
56 5
|
3月前
|
存储 C# 开发者
C#一分钟浅谈:静态成员与静态类介绍
在C#编程中,`static`关键字用于创建静态字段、方法、属性和构造函数等,这些成员属于类本身而非实例。本文从基本概念入手,详细探讨了静态成员与静态类的特点、应用场景及常见误区。通过示例代码展示了如何使用静态字段和方法,并讨论了静态类的定义及其在工具箱和常量集合中的应用。最后总结了正确使用这些特性的策略,以帮助开发者编写高效、可维护的代码。
80 11
|
2月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
14 0
|
3月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
28 2
|
4月前
|
C#
C#中的类和继承
C#中的类和继承
45 6
|
4月前
|
Java C# 索引
C# 面向对象编程(一)——类
C# 面向对象编程(一)——类
35 0
|
4月前
|
开发框架 .NET 编译器
C# 中的记录(record)类型和类(class)类型对比总结
C# 中的记录(record)类型和类(class)类型对比总结
|
6月前
|
开发框架 .NET 编译器
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
41 2
下一篇
DataWorks