簡體   English   中英

關於C#命名空間結構的困惑

[英]Confusion about C# Namespace Structure

我對C#中的Namespace結構感到困惑,我是C#和WPF的新手

當我創建一個WPF的新項目時,默認情況下這些命名空間包含在頂部

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

我很難理解這些結構。 我明白那個

using System;

意味着我指的是System命名空間

但其他人喜歡什么呢

using System.Text;

那意味着什么?

  • 我正在訪問一個名為“System.Text”的命名空間?
  • 或者我正在訪問嵌套在“System”命名空間內的“Text”命名空間?

此外,如果“Text”嵌套在“System”中,為什么只有“using System”包含所有命名空間? 我們是否應該明確包含我們使用的每個命名空間?

using System.Text; 意味着我正在使用一個名為“System.Text”的命名空間,或者我正在使用嵌套在“System”命名空間內的“Text”命名空間?

后者。 您正在使用嵌套在“System”命名空間內的“Text”命名空間。

請注意,當你說

namespace Foo.Bar.Blah
{
    class C 
    {
    ...

這只是一種簡短的寫作方式

namespace Foo
{
    namespace Bar 
    {
        namespace Blah
        {
            class C 
            {
            ...

命名空間只有“簡單”的名稱。

我們應該為每個使用的命名空間都有一個明確的'using'指令嗎?

通常你會這樣做,是的。 在某些情況下,您可能不想這樣做。 例如,如果您有兩個名稱空間,它們都包含同名的類型,並且您希望使用兩個名稱空間中的類型; 在這種情況下,擁有兩個名稱空間的“使用”可能會讓人感到困惑。 此外,“使用”帶來了擴展方法; 如果有,你不想綁定,不包括包含它們的命名空間擴展的方法。

如果“Text”嵌套在“System”中,為什么只有“using System”包含所有命名空間?

我不明白這個問題的措辭。 我想也許你在問:

為什么using System; 不要將簡單名稱Text解析為嵌套命名空間?

也就是說,為什么這不起作用:

namespace Foo
{
    namespace Bar
    {
         class Blah {}
    }
}

在另一個文件中:

using Foo;
class Abc : Bar.Blah {}

using Foo; 僅包含Foo內直接聲明的類型 它不會引入直接在Foo中聲明的名稱空間 C#的設計者認為將名稱空間“納入范圍”這樣過於混亂; 通常人們使用using指令將類型 “帶入范圍”。

對於計算機而言,命名空間基本上不是分層的。 System.Text下的類型(例如System.Text.StringBuilder被認為是在System - 因此如果您想要兩者中的類型,則需要單獨列出它們:

using System;
using System.Text;

就編譯器而言,它們被認為是層次結構的唯一時刻 - 無論如何,我能想到的是,當你在聲明的東西中使用它時:

namespace Foo.Bar.Baz
{
    class Test
    {
    }
}

Test ,就好像你已經導入了FooFoo.Bar Foo.Bar.Baz

當然,命名空間確實從人類理解的角度形成層次結構 - 這使得查找事物變得容易。 但是,編譯器和運行時總體上不使用事物的分層視圖。

我們是否應該明確包含我們使用的每個命名空間?

是,或完全限定類型名稱。

2命名空間使用

using System;
using System.Text;

是完全獨立的。 他們的名字暗示了一種關系,但從外部可以被認為是象征性的名稱空間。

只有第一次使用時,才能使用System.Text成員。
並且您不需要第一個才能使用第二個。

只有當您編寫屬於嵌套命名空間的代碼時,才會看到一些效果。

namesapce A
{
    namespace B
    {
        class Foo { }
    }

    namespace C
    {
        class Bar { private B.Foo f; }  // B is a 'relative' ns
    }
}

using System.Text進口的所有聲明里System.Text ,但沒有在它的文件夾中。 沒有System.Text.* 等同於Java, 就像想象中的語言一樣。

處理命名空間的一種簡單方法是正常編寫代碼和CTRL +。 在未定義的關鍵字上告訴VS.NET自動為您添加using引用。

您正在訪問嵌套在系統命名空間內的文本命名空間。 是的,您需要包含您使用的每個命名空間。

命名空間結構可能如下所示:

namespace Parent
{
    namespace Child
    {
        public class ChildClass
        {
        }
    }
}

暫無
暫無

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

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