c#静态类和非静态有什么不同(我说的是类本身而不是字段)

语法可能有误

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

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

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

如果你看一下IL代码,静态类将是abstractsealed ,它提供了两个重要的特性:

  • 您无法从中创建实例
  • 它不能被inheritance

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

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

以下是了解静态类的官方/ MSDN热点

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

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

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

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

很多类都有实例和静态方法。 例如String有:

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

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

如果你问为什么类和方法都需要static关键字,那么它就是设计的。 我看到你在问什么,如果这个类是静态的,那么当然所有的方法都是静态的,看起来有点多余。 我不知道是否有充分的理由。

静态类仅可从C#2向上提供。 在C#1中,您必须密封您的类并通过添加私有构造函数来指定它不可实例化以获得此类行为。

将类声明为static时

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

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

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

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

在这种情况下,类不需要实例化。与文件路径相同,它将占用所有对象的类Storage的唯一值。

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

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

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

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

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

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

静态类仅包含静态成员。