我相信更多知识渊博的人会给出更好的答案,但无论如何这里有一个。我想这里static关键字被理解了,不会讨论静态属性或字段,只讨论静态方法。
当面向对象编程 (OOP) 非常流行时,C# 就诞生了。所以它被设计成(几乎)所有东西都是一个对象。这大致意味着您不能真正定义超出类范围的函数。顺便说一句,类中定义的“函数”称为方法。
如您所知,一个类(在一般意义上)应该将相关的数据和函数关联在一起。但有时,您可能没有任何有意义的数据与一个函数或一组函数相关联。您可能只对函数(或一组函数)感兴趣。
在这种情况下,您不需要实例,因为实例的目的是存储您不感兴趣的状态。因此,解决方案是通过使用静态类来摆脱实例包含静态方法。
通过这种方式,您可以更接近旧的编程范式:过程式编程,它早于 OOP。
C# Programming Guide给出的经典例子
静态类可以作为一个方便的容器来存放
只对输入参数进行操作而不必获取的方法
或设置任何内部实例字段。例如,在 .NET 类中
库,静态 System.Math 类包含执行的方法
数学运算,无需存储或检索
对 Math 类的特定实例唯一的数据。那
就是,你通过指定类名来应用类的成员
和方法名[...]。
这里是使用三个静态方法的例子,Abs、Floor和Round,定义在静态类Math中:
var number = -5.263;
var absoluteValue = Math.Abs(number); // 5.263
var floorNumber = Math.Floor(number); // -6
var roundedNumber = Math.Round(Math.Abs(number)); // 5
C#是一种多范式语言,除了面向对象编程外,还部分支持函数式编程(FP)。在 FP 中,函数是代码的基本构建块。他们没有与之相关的数据。它们可以接受输入(参数)并且可以产生输出(返回值)。它们不应该有副作用(这称为纯度)。为了帮助支持这些原则,C# 中添加了许多功能。其中之一,扩展方法,基于静态方法。
这是一个具体的例子:受函数式编程启发的 C# 中最明显的部分是 Linq。如果没有静态扩展方法,Linq 就无法存在。
请参阅the C# Programming Guide 了解扩展方法。
扩展方法使您能够将方法“添加”到现有类型
无需创建新的派生类型、重新编译或以其他方式
修改原始类型。扩展方法是静态方法,但是
它们被称为扩展类型的实例方法。
对于用 C#、F# 和 Visual Basic 编写的客户端代码,没有
调用扩展方法和调用扩展方法之间的明显区别
类型中定义的方法。最常见的扩展方法是
LINQ 标准查询运算符,将查询功能添加到
现有的 System.Collections.IEnumerable 和
System.Collections.Generic.IEnumerable 类型。
这是一个 Linq 示例:
var bestMovies = movies
.Where(m => m.Rating > 8)
.OrderByDescending(m => m.Rating);
这里Where 和OrderByDescending 是静态方法。
所以静态方法是 C# 的一个非常重要的组件,并且被大量使用。
当您只需要一个不依赖关联数据的简单辅助方法时,可以使用静态方法。它们允许简单的构造,可以快速轻松地帮助处理冗余代码。它们是在适当情况下使用的宝贵工具。
这是一对静态方法的示例(一个是扩展方法)。您可以在 Linqpad 中运行它。
void Main()
{
var hello = "Hello";
Console.WriteLine(hello.Decorate("@")); // ====== @HELLO ======
var result = Utils.MyMathFunction(6);
Console.WriteLine(result); // 42
}
// You can define other methods, fields, classes and namespaces here
public static class Utils
{
public static string Decorate(this string text, string decoration)
{
return $"====== {decoration}{text.Trim().ToUpper()} ======";
}
public static double MyMathFunction(double number)
{
return (number + 3) * number - 12;
}
}