none
請問 internal 正確用法 RRS feed

  • 問題

  • 請教各位前輩, 關於 internal 修飾詞。

    我照著 http://msdn.microsoft.com/zh-tw/library/7c5ka91b.aspx,msdn 寫說會有錯誤 ?? 但我卻沒遇到??

    Assembly1.cs 和 Assembly1_a.cs</sentencetext> BaseClass</sentencetext> BaseClass,將會產生錯誤。</sentencetext>

    assembly1.cs 檔:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
        class BaseClass
        {
            public static int intM = 0;
        }
    }

    assembly1_a.cs 檔:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
        class assembly1_a
        {
            static void Main(string[] args)
            {
                BaseClass myBase = new BaseClass();
            }
        }
    }

    2013年4月15日 上午 08:52

解答

  • 不好意思 這邊要更正一下

    internal 是限定在相同組件(assembly)  而不是相同命名空間(namespace)
    這兩者還是有別的

    你可以嘗試建立 一個Console 專案 另外增加一個類別

    並修改該類別的命名空間 例如:

    using System;
    namespace AnotherNamespace
    {
        internal class Class1
        {
            internal string Name { get; set; }
            internal Class1()
            {
                Name = Guid.NewGuid().ToString();
            }
        }
    }

    然後修改program.cs 的 Main function 如下:

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                AnotherNamespace.Class1 class1 = new AnotherNamespace.Class1();
                Console.WriteLine(class1.Name);
                Console.WriteLine("If you can see this, means internal class can be referred in the smae aeembly with different namespace");
                Console.Read();
            }
        }
    }

    以上例來說  program.cs 跟 class1.cs 是在相同組件(ConsoleApplication1.exe) 而不在同一命名空間

    可以發現 這個專案是可以執行的


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    微軟實戰課程日

    • 已標示為解答 weipxf 2013年4月16日 上午 04:58
    2013年4月15日 下午 07:20
  • 如同ProgrammingVolunteer 所說的,例如說建立一個類別庫專案,內容像是下面這樣

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace BaseClass
    {
        internal class internalClass
        {
            public int tmpint = 1;
        }
    
        public class PublicClass
        {
            public int tmpint = 1;
        }
    }

    之後建立另外一個專案,把剛剛的類別庫專案加入參考,那麼其實你在IDE裡面就會看到差別了,像是下圖,只會看到public的,看不到『內部』的


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守

    • 已提議為解答 ThankfulHeart 2013年4月15日 上午 09:32
    • 已標示為解答 weipxf 2013年4月15日 上午 09:48
    2013年4月15日 上午 09:27

所有回覆

  • Hi,

    沒有看到你加上Internal的修飾詞哩;依照文件說名看起來是,當你建立一個Class,並且在class前面加上Internal的修飾詞之後,它就變成是一個『內部基底類別』,而其他參考到這個組件的程式碼裡面,是不能嘗試去建立這個『內部基底類別』的實體的。

    而文件的第二個例子是一個public的類別,建立了一個內部成員,而在外面的程式碼中去使用這個組件時,可以建立這個類別的實體,但是是不能夠去存取『內部成員』的。


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守


    • 已編輯 bauann 2013年4月15日 上午 09:08 修改錯別字
    2013年4月15日 上午 09:08
  • 抱歉,我漏了 internal 修飾詞,我已補上...仍沒有 msdn 所說的會發生錯誤?

    仍不理解...我沒用過 internal 修飾詞,所以想了解。

    謝謝。

    2013年4月15日 上午 09:16
  • internal按照字面解釋是”內部“的,你首先應當有一個概念:

    NET是通過程序集組合的,程序集包含命名空間。命名空間是類的容器——每一個命名空間可以包含兩種類——公共類和內部類。

    假定有一個命名空間是“MyNameSpace”,那麼裡邊有一個internal類叫“A”,那麼你把這個檔案轉化成dll(類庫),然後再其它地方引用,你無法引用到這個A(這個A只能在MyNameSpace中引用到)。

    否則是公共類,可以在MyNameSpace引用之後引用到。


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年4月15日 上午 09:21
  • 如同ProgrammingVolunteer 所說的,例如說建立一個類別庫專案,內容像是下面這樣

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace BaseClass
    {
        internal class internalClass
        {
            public int tmpint = 1;
        }
    
        public class PublicClass
        {
            public int tmpint = 1;
        }
    }

    之後建立另外一個專案,把剛剛的類別庫專案加入參考,那麼其實你在IDE裡面就會看到差別了,像是下圖,只會看到public的,看不到『內部』的


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守

    • 已提議為解答 ThankfulHeart 2013年4月15日 上午 09:32
    • 已標示為解答 weipxf 2013年4月15日 上午 09:48
    2013年4月15日 上午 09:27
  • 前輩是指,在同一個 MyNameSpace 可以存取 internal class A,那我底下這樣的想法是對的嗎?

    在內部類,我直接用 Class B 的方法存取 internal Class A,非內部類,我也可用 Class B 去存取 internal Class A 的方法?

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace MyNameSpace
    {
        public class B
        {
            public void B_TEST()
            {
                A  a=new A();

       a.TEST_A();

            }
        }

        internal class A
        {
            public void TEST_A()
            {
       //....
            }
        }
    }

             
    2013年4月15日 上午 09:40
  • 只能在同一個命名空間下使用internal,不同命名空間無法引用到internal的東西。

    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    • 已標示為解答 weipxf 2013年4月15日 上午 09:48
    • 已取消標示為解答 weipxf 2013年4月16日 上午 08:34
    2013年4月15日 上午 09:42
  • 不好意思 這邊要更正一下

    internal 是限定在相同組件(assembly)  而不是相同命名空間(namespace)
    這兩者還是有別的

    你可以嘗試建立 一個Console 專案 另外增加一個類別

    並修改該類別的命名空間 例如:

    using System;
    namespace AnotherNamespace
    {
        internal class Class1
        {
            internal string Name { get; set; }
            internal Class1()
            {
                Name = Guid.NewGuid().ToString();
            }
        }
    }

    然後修改program.cs 的 Main function 如下:

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                AnotherNamespace.Class1 class1 = new AnotherNamespace.Class1();
                Console.WriteLine(class1.Name);
                Console.WriteLine("If you can see this, means internal class can be referred in the smae aeembly with different namespace");
                Console.Read();
            }
        }
    }

    以上例來說  program.cs 跟 class1.cs 是在相同組件(ConsoleApplication1.exe) 而不在同一命名空間

    可以發現 這個專案是可以執行的


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    微軟實戰課程日

    • 已標示為解答 weipxf 2013年4月16日 上午 04:58
    2013年4月15日 下午 07:20
  • 你好,請問這段程式碼...是 internal Class1() 建構子嗎?

     internal Class1()
            {
                Name = Guid.NewGuid().ToString();
            }

    2013年4月16日 上午 02:20
  • 對,那是建構子

    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度
    微軟實戰課程日

    2013年4月16日 上午 04:01
  • weipxf

    Sorry,请取消我的答案为正确答案;)


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年4月16日 上午 06:59
  • 還有一個疑問,如果我將這個寫成 類別庫的 DLL 檔。

    using System;
    namespace AnotherNamespace
    {
        internal class Class1
        {
            internal string Name { get; set; }
            internal Class1()
            {
                Name = Guid.NewGuid().ToString();
            }
        }
    }

    然後在  program.cs 引用 上面的 DLL 檔,這樣不算相同組件嗎?

    我試著這樣寫是不能存取...

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                AnotherNamespace.Class1 class1 = new AnotherNamespace.Class1();
                Console.WriteLine(class1.Name);
                Console.WriteLine("If you can see this, means internal class can be referred in the smae aeembly with different namespace");
                Console.Read();
            }
        }
    }

    2013年4月16日 下午 01:13
  • Hi,

    不算吧~

    一個dll或是一個exe就是一個組件了

    你如果要這麼做

    可能要參閱

    Friend Assemblies (C# Programming Guide)

    http://msdn.microsoft.com/en-us/library/0tke9fxk(v=vs.80).aspx


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/

    2013年4月16日 下午 01:25
  •  ,謝謝。


    • 已編輯 weipxf 2013年4月16日 下午 01:30
    2013年4月16日 下午 01:30