-2

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

假设我们有

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

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

4

11 回答 11

5

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

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

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

于 2013-07-26T14:05:04.777 回答
1

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

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

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

DAL.SavePerson();

vs.

var myRepository = new SqlRepository();
myRepository.SavePerson();
于 2013-07-26T14:06:24.683 回答
0

简短的回答,静态类只能包含静态方法。非静态类没有该显式限制,可以同时包含静态和非静态方法。

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

于 2013-07-26T14:07:16.213 回答
0

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

静态类总是抽象的(所以你绝不不能创建它的实例)和密封的(你也不能创建派生类)。所以静态类是抽象密封类的捷径。

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

  if (tp.IsAbstract && tp.IsSealed) { // <- And it is...
    ... 
于 2013-07-26T14:09:54.757 回答
0

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

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

我想这解释了大部分。

于 2013-07-26T14:22:09.343 回答
0

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

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

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

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

于 2013-07-26T14:12:49.423 回答
0

static class在创建类的实例时使用是没有意义的。例如static class HelperMethodsvsclass HelperMethods

HelperMethods.DoSomething(); // makes sense

new HelperMethods(); // absolutely no use if only contains static methods
于 2013-07-26T14:05:27.560 回答
0

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

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

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

但是对于一个班级来说是合法的。static

于 2013-07-26T14:05:42.747 回答
0

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

于 2013-07-26T14:05:43.350 回答
0

您不能创建静态类实例。

于 2013-07-26T14:06:39.663 回答
0

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

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

于 2013-07-26T14:06:44.113 回答