【问题标题】:c# What is the different between static class and non-static (I am talking about the class itself not the field) [duplicate]c#静态类和非静态有什么区别(我说的是类本身而不是字段)[重复]
【发布时间】:2009-08-14 06:31:36
【问题描述】:

语法可能错误

public static class Storage
{
    public static string filePath { get; set; }
}

public class Storage
{
    private void Storage () {};
    public static string filePath { get; set; }
}

我是从互联网上的一个例子中得到的。 第二个有什么用?

【问题讨论】:

  • @Tuzo - 相关不重复.. 这个问题是一个比较
  • @OP - 我认为你的第二个代码 sn-p 应该是 private void Storage() {}; ...就像在私人演员中一样
  • @Gishu 对不起。你是对的 :) 但仍然每个人都知道,编辑它。

标签: c# class static


【解决方案1】:

如果您查看 IL 代码,静态类将是 abstractsealed,这提供了两个重要特性:

  • 您不能从中创建实例
  • 不能继承

第一点的结果是静态类不能包含非静态成员。在非静态类中,静态成员可能有很多用途。一种常见的用途是拥有一个类工厂:

public class SomeClass
{
    public int SomeInt { get; set; }

    public static SomeClass Create(int defaultValue)
    {
        SomeClass result = new SomeClass();
        result.SomeInt = defaultValue;
        return result;
    }
}

【讨论】:

  • 嗯?你的例子不是静态类?
  • 那不是静态类吗?
  • @Thorarin 和@Svish:这是正确的。它用于回答在非静态类型中使用静态成员的最后一个问题(正如我在原帖中解释过去的问题)
【解决方案2】:

这里是官方/MSDN热点了解static classes

静态类的主要特点 是:
* 它们只包含静态成员。
* 它们不能被实例化。
* 它们是密封的。
* 它们不能包含实例构造函数

基本上,静态类与“普通”/非静态类相同,后者只有静态方法和私有 ctor。将其标记为静态有助于澄清意图并帮助编译器进行一些编译时检查以禁止某些事情,例如禁止实例化。

我能想到的实际用途:用它来容纳或作为一种组织方式

  • 实用方法(不与任何类型实例关联的方法),例如最小值和最大值方法的数学运算
  • 扩展方法,例如StopWatchExtensions 用于 StopWatch 上的 Reset 方法

【讨论】:

    【解决方案3】:

    很多类都有实例方法和静态方法。字符串例如有:

    String.Format(string, arg0, arg1, arg2) // static method
    

    String myString = "    Hello world!";
    myString = myString.Substring(4);       // instance method
    

    如果您要问为什么类和方法都需要 static 关键字,那只是设计使然。我明白你在问什么,如果类是静态的,那么当然所有的方法也是静态的,把它放在那里两次似乎有点多余。我不知道这样做是否有充分的理由。

    【讨论】:

      【解决方案4】:

      静态类只能从 C#2 开始使用。在 C#1 中,您必须密封您的类并通过添加私有构造函数来指定它不可实例化以获得这种行为。

      【讨论】:

        【解决方案5】:

        当你将一个类声明为static时:

        • 允许只有静态成员
        • 无法实例化(它没有公共构造函数),并且
        • 不能被继承(它是密封的)。

        任何未声明为静态的类都可以被实例化、继承,并且可以具有非静态成员。

        【讨论】:

          【解决方案6】:

          静态类与非静态类基本相同,但有一个区别:静态类不能被实例化。换句话说,您不能使用 new 关键字来创建类类型的变量。因为没有实例变量,所以您可以使用类名本身来访问静态类的成员。

          public static class Storage
          {
             public static string filePath { get; set; }
          }
          

          在此,类不需要实例化。所以与文件路径相同,它将为所有对象占用类Storage的唯一值。

          public class Storage
          {
              private void Storage {};
              public static string filePath { get; set; }
          }  
          

          在此,类是非静态的,需要实例化

          【讨论】:

            【解决方案7】:

            我们知道变量和函数有两种类型——实例和类。

            一个静态类——只有类变量没有实例变量。

            因此无法实例化,只能通过 Classname.method() 访问。

            它只包含私有构造函数,没有公共构造函数。

            静态类只包含静态成员。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-07-16
              • 2016-08-20
              • 2011-07-11
              • 2014-06-27
              • 2013-07-21
              • 2012-05-26
              • 2016-08-31
              • 1970-01-01
              相关资源
              最近更新 更多