C# 静态类的使用

静态类与非静态类基本相同,但存在一个区别:静态类不能实例化。也就是说,不能使用 new 关键字创建静态类类型的变量。因为没有实例变量,所以要使用类名本身访问静态类的成员。

static class CompanyInfo

{

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

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

    //...

}

和所有类类型一样,当加载引用静态类的程序时,.NET Framework 公共语言运行时 (CLR) 将加载该静态类的类型信息。程序不能指定加载静态类的确切时间。但是,可以保证在程序中首次引用该类前加载该类,并初始化该类的字段并调用其静态构造函数。静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。对于只对输入参数进行运算而不获取或设置任何内部实例字段的方法集,静态类可以方便地用作这些方法集的容器。例如,在 .NET Framework 类库中,静态类 System.Math 包含的一些方法只执行数学运算,而无需存储或检索特定 Math 类实例特有的数据。

静态类的主要特性:仅包含静态成员。无法实例化。是密封的。不能包含实例构造函数。创建静态类(A)与创建仅包含静态成员和私有构造函数的类(B)基本相同,私有构造函数阻止类被实例化。出现B这种情况易选用A。

使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实利。

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

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

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.

 */

静态成员

非静态类可以包含静态的方法、字段、属性或事件。即使没有创建类的实例,也可以调用该类中的静态成员。始终通过类名而不是实例名称访问静态成员。

无论对一个类创建多少个实例,它的静态成员都只有一个副本。

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

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

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

虽然字段不能声明为 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;

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

}

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

Automobile.Drive();

int i = Automobile.NumberOfWheels;

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

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

静态类在内存中是一直有位置的;

2:非静态类在实例化后是在内存中是独立的,它的变量不会重复,在使用后会及时销毁,所以不会出现未知

的错误。在C#中静态成员是比较敏感的东西,在不是十分确认的情况下不要使用

3:建议更多地使用一般类(非静态类)。

C# 静态类的使用,布布扣,bubuko.com

时间: 2024-10-18 03:08:55

C# 静态类的使用的相关文章

几种查询方法(lambda Linq Enumerable静态类方式)

1.需要一个数据源类: using System; using System.Collections.Generic; namespace Linq { public class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } public class Data { public static List<Student> studentLi

C#基础——全局静态类中的静态类变量的设置

前言 今天在设计一个系统用户管理界面的时候,出现了一个问题: 由于要在不同窗体之间传递数据,所以想到了要设置全局变量,比如一个用户有属性,ID,UserName,UserPwd和UserPower,为了简便,设定了一个Manager的类,管理这四个属性.然后设置了一个静态类,ModuleParas,有一个静态类变量manager. 结果出现了可访问性不一致的问题. 代码 1 public class Manager 2 { 3 public int ID; 4 public string Use

关于C#的静态类和静态构造函数

静态构造函数是C#的一个新特性,其实好像很少用到.不过当我们想初始化一些静态变量的时候就需要用到它了.这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次.也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用. class SimpleClass { // Static constructor static SimpleClass() { // } } 在使用静态构造函数的时候应该注意几点: 1.静态构造函数既没有访问修饰符,也没有参数.因为是.NET调用的

C# 静态类与非静态类、静态成员的区别

静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量.在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类:其次,它防止在类的内部声明任何实例字段或方法. 静态类是自C# 2.0才引入的,C# 1.0不支持静态类声明.程序员必须声明一个私有构造器.私有构造器禁止开发者在类的范围之外实例化类的实例.使用私有构造器的效果与使用静态类的效果非常相似.两者的区别在于,私有构造器方式仍然可以从类的内部对

13.C#分部类型和静态类(七章7.1-7.2)

再大的东西不去找,也就没了,再小的知识不去记,也就忘了.今天来写一写C#中的分部类型和静态工具类,这些两个概念可能在我们的日常使用过程中都使用过,可能大家对这些内容觉得这些不是应该有的东西嘛,那就来复习一下吧. 分部类型,个人理解是对同一事物在两个不同空间的描述,编译器将组织我们编写的在不同文件中代码,组合成一个完整的描述.我们不能在一个文件中编写成员的一半代码,而把另外一半代码放到另外一个文件中,每个独立的成员必须完整地位于所处的文件中.如有一个Map类,成员属性放在Map0.cs中,而成员方

静态类

namespace ConsoleApplication1 { static class A { private static int b=1; public static void f() { Console.WriteLine("{0}",b); } static A() { b = 2; } } class Program { static void Main(string[] args) { //Console.WriteLine(A.b );b私有成员 A.f();//通过公

静态类和非静态类的主要区别

如有雷同,不胜荣幸,若转载,请注明 主要区别在于静态类不能实例化,静态类编译器能够执行检查确保不是偶然的添加实例成员,C#编译器会自动把它标记为sealed,静态类中不能创建非静态的方法.即静态方法中只能创建静态方法,但在非静态类中可以调用静态方法 静态类的主要特性: 1:仅包含静态成员. 2:无法实例化. 3:是密封的. 4:不能包含实例构造函数. 5:非静态类可以包含静态的方法.字段.属性或事件: 6:静态方法和属性不能访问其包含类型中的非静态字段和事件 7:静态方法只能被重载,而不能被重写

OO 普通类与静态类的区别

普通类与静态类的区别 普通类与静态类的区别 一.普通类: 1.可以实例化,即可以new; 2.可以继承: 二.静态类:(静态类本质就是 abstract+sealed类) 1.不能被实例化:(抽象的)反编译查看 2.不能被继承:(密封的)反编译查看 3.只能有静态成员:

利用反射获取静态类的静态属性值(已知属性名称的字符串表示)

列如获取Phone属性的值 typeof(ExcelColumnName).GetProperty(“Phone”).GetValue(null, null)//ExcelColumnName是静态类 ExcelColumnName类如下: 1 /// <summary> 2 /// 要上传的excel所包含的列 3 /// </summary> 4 public static class ExcelColumnName 5 { 6 public static string Pho

静态类和非静态类

静态类与非静态类基本相同,但存在一个区别:静态类不能实例化. 也就是说,不能使用 new 关键字创建静态类类型的变量. 因为没有实例变量,所以要使用类名本身访问静态类的成员. 例如,如果名为 UtilityClass 的静态类有一个名为 MethodA 的公共方法,则按下面的示例所示调用该方法: C# UtilityClass.MethodA(); 对于只对输入参数进行运算而不获取或设置任何内部实例字段的方法集,静态类可以方便地用作这些方法集的容器. 例如,在 .NET Framework 类库