C#中的静态类和静态类成员介绍

使用C#编程语言中的static关键字,您可以定义静态类和静态成员。

静态类类似于抽象类和密封类。 静态类和非静态类之间的区别在于,静态类无法实例化或继承,并且该类的所有成员本质上都是静态的。 要将类声明为静态,应在类声明中使用static关键字将其标记。

[.Net路线图: .Net Standard 2.1中可以期待新功能 | .Net Framework或.Net Core? 了解何时使用哪个 | 通过InfoWorld的App Dev Report新闻通讯了解编程方面的热门话题。 ]

静态类或成员中没有任何行为,因此也不允许继承静态类。 静态类只能具有静态成员-您不能在静态类中声明实例成员(方法,变量,属性等)。 您可以在静态类中具有静态构造函数,但不能在静态类中具有实例构造函数。

何时在C#中使用静态类

您什么时候应该去上静态课程? 通常,您可以将帮助程序或实用程序类实现为静态类,因为它们无需实例化或继承,并且通常包含一些可重用的方法和属性的集合。 以下代码清单说明了C#中的静态类的外观。

public static class FileLogger
    {
        public static void Log(string message)
        {
            //Method to log data in a text file
        }
    }

何时在C#中使用静态方法

静态方法是不需要调用类实例的方法,可以在类本身上调用它们。 请注意,静态方法只能访问静态类成员。 您可以在静态类或非静态类中使用静态方法。 另外,您可以在静态类或非静态类中具有静态构造函数。 静态构造函数用于初始化类的静态成员。 第一次访问该类的静态成员时,将调用该类的静态构造函数。

为什么要使用静态方法? 它们的执行速度比非静态方法(即实例方法)快。 原因是运行时将this指针作为隐式参数传递给非静态或实例方法。 请注意,对于非静态方法,即使该方法是非虚拟方法,编译器也会发出callvirt指令。 如果将方法设为静态,则编译器将发出非虚拟call站点,从而省去了检查实例是否为空的额外检查。 这可能会给您带来一些性能上的好处。

因此,如果要构建的应用程序是性能至关重要的应用程序,那么在代码中使用静态类型和方法可能是值得的。 如果您的代码对此类类型和成员进行大量调用,则性能提升可能是可观的。

以下代码段说明了静态方法的外观。

public static void Log(string message)
        {
             string filePath = @"F:\IDGLog.txt";
            using (StreamWriter streamWriter = new StreamWriter(filePath, true))
            {
                streamWriter.WriteLine(message);
                streamWriter.Close();
            }
        }

如何在C#中使用类的静态成员

CLR将系统内存划分为三个不同的区域:堆栈,堆和高频堆。 由于可以直接访问静态对象而无需创建类的实例,因此静态对象必须在应用程序的整个生命周期中都存在于内存中。 他们不需要被垃圾收集。 因此,静态对象存储在高频堆中。 通常,每个应用程序域都有一个高频堆。

现在,让我们看一下类的静态成员。 同样,静态对象是在整个应用程序执行过程中始终保留在内存中的对象。 扩展上面的日志记录示例,以下代码清单说明了具有静态成员的FileLogger类的外观。

public static class FileLogger
    {
        private static readonly object lockObject = new object();
        public static string FilePath
        {
            get; set;
        }
        public static void Log(string message)
        {
            lock (lockObject)
            {
                if(!string.IsNullOrEmpty(FilePath))
                using (StreamWriter streamWriter = new StreamWriter(FilePath, true))
                {
                    streamWriter.WriteLine(message);
                    streamWriter.Close();
                }
            }
        }
    }

注意名为FilePath的静态属性的用法。 为了确保线程安全,已使用lock关键字。 已经在Log()方法内部进行了检查,以验证FilePath属性的值是否为非null且不为空。

请记住,当应用程序速度至关重要时,可能需要使用静态方法。 您可以在静态类和非静态类中使用它们。

From: https://www.infoworld.com/article/3045882/static-classes-and-static-class-members-in-c-explained.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值