簡體   English   中英

靜態類和命名空間有什么區別? (在 C# 中)

[英]What is the difference between a static class and a namespace? (in C#)

我看到的唯一區別是您不能使用“using staticClass”聲明。

因此,我想知道:

  1. 靜態類和命名空間之間有真正的區別嗎?
  2. 是否有可能避免每次調用成員函數時都必須重寫類名? 我正在考慮類似於“使用 staticClass”的東西。

是的, static類在技術上是一種類型。 它可以有成員(字段、方法、事件)。 命名空間只能保存類型(並且它本身不被視為“類型”; typeof(System)是編譯時錯誤)。

沒有直接等同於為靜態類的命名空間添加using指令。 但是,您可以聲明別名:

using ShortName = ReallyReallyLongStaticClassName;

並使用

ShortName.Member

在提及其成員時。

此外,您可以使用靜態類在其他類型上聲明擴展方法並直接使用它們,而無需顯式引用類名:

public static class IntExtensions {
   public static int Square(this int i) { return i * i; }
}

並使用它:

int i = 2;
int iSquared = i.Square(); // note that the class name is not mentioned here.

當然,如果類未在根或當前命名空間中聲明,您必須為包含該類的命名空間添加using指令以使用擴展方法。

靜態類仍然是一個類。 它可以包含方法、屬性等。命名空間只是一個命名空間。 它只是區分同名類聲明的幫手。

函數不能單獨存在於命名空間中,它屬於一個類。

如果您需要一個靜態函數而不提及類的名稱,那么擴展可能就是您正在尋找的。

public static class MathExtensions
{
 public static int Square(this int x)
 {
  return x * x;
 }
}
//...
// var hundredSquare = 100.Square();

另一個區別是命名空間可以跨越多個程序集,而類則不能。

據我了解,命名空間只是一種語言特性; 它們被編譯刪除。 換句話說,.NET 運行時不會“看到”命名空間,而只是碰巧包含點的類名。 例如, System命名空間中的String類被 .NET 運行時視為名為System.String的類,但根本沒有命名空間的概念。

然而,靜態類完全由 .NET 運行時理解和管理。 它們是成熟的類型,您可以對它們使用反射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM