静态类与仅使用静态方法的类有什么区别?

时间:2013-07-26 14:02:57

标签: c# .net class oop

静态类与仅使用静态方法(例如私有构造函数)的类有什么区别?

we have

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;
    }
}

那么从方法/属性访问性能,代码可读性,代码可扩展性等方面来看呢?

11 个答案:

答案 0 :(得分:5)

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

  

一个类可以声明为static,表示它只包含   静态成员。无法创建静态实例   使用new关键字的类。静态类会自动加载   由.NET Framework公共语言运行时(CLR)实现的程序   或者加载了包含该类的命名空间。

您可以在此处详细了解静态类和成员 - http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

答案 1 :(得分:0)

在创建类的实例时,使用

static class将毫无意义。例如static class HelperMethods vs class HelperMethods

HelperMethods.DoSomething(); // makes sense

new HelperMethods(); // absolutely no use if only contains static methods

答案 2 :(得分:0)

好吧,如果你将类声明为static,那么编译器可以强制执行,因为你没有添加任何实例成员,并且还确保 从不创建实例(只有static成员的非static类和private构造函数仍然可以在其中一个{{1}内创建实例1}}方法!)

因此,对于非static类,这是 legal

static

但是class Foo { private Foo() { } public static Foo Create() { return new Foo(); } } 类来说是合法的。

答案 3 :(得分:0)

对于静态类,您无法创建实例;在其他情况下,即使所有成员和字段都是静态的,您也可以随时创建一个。

答案 4 :(得分:0)

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

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

从可更新性的角度来看,静态方法通常更容易阅读,但也可能不合适,例如,请采取以下措施:

DAL.SavePerson();

vs.

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

答案 5 :(得分:0)

您无法创建静态类实例。

答案 6 :(得分:0)

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

无法创建静态类的实例,编译器会强制执行此操作。

答案 7 :(得分:0)

简短回答,静态类只能包含静态方法。非静态类没有明确的限制,可以包含静态和非静态方法。

答案很长:http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.80).aspx

答案 8 :(得分:0)

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

静态类总是抽象(所以你决不能创建它的意义)和密封(你也不能创建一个派生类)。所以 static 类是抽象密封类的快捷方式。

  Type tp = typeof(Info2); // <- Info2 is static class

  if (tp.IsAbstract && tp.IsSealed) { // <- And it is...
    ... 

答案 9 :(得分:0)

访问性能:几乎没有区别。

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

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

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

答案 10 :(得分:0)

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

具有静态成员的非静态类 - 可以实例化此类。此类还可以包含可以通过classname.xyz()或classname.property访问的静态和非静态成员。当您需要创建具有某些功能(方法)的对象(类)时,您可以创建此类。在整个应用程序中使用它可能并不总是想要创建类的对象并访问它(方法)。例如,在Navigation类中重定向到home方法。

我想这解释了大部分内容。