静态类和只使用静态方法的类之间的区别是什么

本文关键字:之间 区别 是什么 静态方法 静态类 | 更新日期: 2023-09-27 18:25:07

静态类和只有静态方法的类(例如私有构造函数)之间有什么区别?

假设我们有:

using System;
public class Test
{
        public static void Main()
        {
                Info.SetName("nnn");
        Console.WriteLine(Info.Name);
        Info.SetName("nn2");
        Console.WriteLine(Info.Name);
        Info2.SetName("nnn");
        Console.WriteLine(Info2.Name);
        Info2.SetName("nn2");
        Console.WriteLine(Info2.Name);
        }
}
public class Info
{
    public static string Name;
    public static void SetName(string name){
        Name = name;
    }
}
public static class Info2
{
    public static string Name;
    public static void SetName(string name){
        Name = name;
    }
}

那么,从方法/属性访问性能、代码可读性和代码可扩展性的角度来看呢?

静态类和只使用静态方法的类之间的区别是什么

静态类强制所有成员都是静态的,并阻止创建任何实例。来自MSDN:

类可以声明为静态,表示它只包含静态成员。无法创建静态的实例使用new关键字初始化。静态类自动加载当程序或者加载包含该类的命名空间。

你可以在这里阅读更多关于静态类和成员的信息-http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

静态类将要求该类中的所有方法都是静态的,而具有静态方法的常规类也可以具有实例方法。

从性能的角度来看,静态方法稍微快一些,因为它们不会引入检查对象的实际实例的开销。

从可编辑性的角度来看,静态方法通常更容易阅读,但也可能不合适,例如:

DAL.SavePerson();
vs.
var myRepository = new SqlRepository();
myRepository.SavePerson();

静态类-这样的类不能实例化。此外,这个类的所有成员都需要是静态的。当您不希望一个类被一次又一次地实例化,并且希望在整个项目中使用该对象时,您将把一个类声明为静态的。例如,如果您想创建LOGGING功能。为此,您可以创建一个静态日志记录类,并将所有(静态)功能放入其中,例如write方法。

具有静态成员的非静态类-该类可以实例化。此外,这个类可以包含静态和非静态成员,这些成员可以通过classname.xyz()或classname.properties访问。当你需要创建一个具有一些功能(方法)的对象(类)时,你可以创建这个类。为此,你可能不总是想创建该类的对象并访问它(方法)。例如,Navigation类中的Redirect to home方法。

我想这解释了大部分。

如果你把类声明为static,则编译器可以强制您没有添加任何实例成员,还可以确保从不创建实例(只有static成员和private构造函数的非static类仍然可以在其中一个static方法内创建实例!)

因此,对于非static类来说,这是合法的:

class Foo {
    private Foo() { }
    public static Foo Create() { return new Foo(); }
}

但是对于static类是否合法。

对于静态类,您不能创建实例;在另一种情况下,即使所有成员和字段都是静态的,也可以始终创建一个。

您不能创建静态类实例。

可以创建一个只有静态方法的类的实例(除非隐藏构造函数)。

不可能创建静态类的实例,编译器将强制执行此操作。

简而言之,静态类只能包含静态方法。非静态类没有明确的限制,可以同时包含静态和非静态方法。

长话短说:http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

static class在创建类的实例时将毫无意义。例如static class HelperMethodsclass HelperMethods

HelperMethods.DoSomething(); // makes sense
new HelperMethods(); // absolutely no use if only contains static methods

访问性能:几乎没有差异。

代码可读性:当类不应该实例化时,使用静态修饰符更具可读性,因为这表明了类的使用方式。此外,它还添加了编译时检查,以防止错误地以错误的方式使用它。

代码可扩展性:没有区别(至少关于静态成员-当然,如果你不使用静态修饰符,你可以在没有静态成员的情况下扩展类,但有了静态修饰符,类是隐式密封的)

附加说明:扩展方法只能在静态类中声明。

从技术上讲,只能用静态方法创建非静态类的实例:即使构造函数是私有的,也可以通过反射(或在类的静态方法中)来完成。您也可以从该类创建派生类,除非它声明为密封

静态类总是抽象的(所以你决不能创建它的一个实例)和密封的态类是抽象密封类别的快捷方式。

  Type tp = typeof(Info2); // <- Info2 is static class
  if (tp.IsAbstract && tp.IsSealed) { // <- And it is...
    ...