【问题标题】:What is diference between static class vs class with only static methods? [duplicate]静态类与只有静态方法的类有什么区别? [复制]
【发布时间】:2013-07-26 20:18:36
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以创建一个Info 类的实例,该实例无用,因为他没有任何行为。

标签: c# .net class oop


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

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

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

DAL.SavePerson();

vs.

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

【讨论】:

    【解决方案3】:

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

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

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

    但是对于static是合法的。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        你不能创建静态类实例。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

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

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

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

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

                【讨论】:

                  【解决方案10】:

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

                  静态类总是 abstract (所以你决不能创建它的实例)和 sealed (你也不能创建派生类)。所以 static 类是 abstract seal 类的快捷方式。

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

                  【讨论】:

                    【解决方案11】:

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

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

                    我想这可以解释大部分。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2013-07-21
                      • 1970-01-01
                      • 2011-07-11
                      • 2012-11-02
                      • 1970-01-01
                      • 2016-08-20
                      • 2011-06-18
                      • 2011-10-30
                      相关资源
                      最近更新 更多