C# 关键字之internal详解

原文链接:https://blog.csdn.net/weixin_42565127/article/details/130927438

一、internal
我们都知道的三种类型/成员修饰符public、protected、private,也明白它们所表示的含义,internal也是一各类型/成员修饰符(被修饰的类型或者成员称为内部类型或成员),只是它所修饰的类只能在同一个程序集中被访问,而同一个程序集表示同一个dll程序集或同一个exe程序集。在vs中一个项目会生成一个dll文件,因此这个dll或这个项目也就是一个程序集。
比如有一个程序集有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace Common
{
    internal class A
    {
        public void aa()
        {
        }
    }
    public class B
    {
        public void bb()
        {
            //这样是正确的
            A a = new A();
            a.aa();
        }
    }
}

  如果另一个项目TestWeb引用了此dll,即common.dll,即

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using Common;
namespace TestWeb
{
    public class Test
    {
        public void test_1()
        {
            //这样是出错的
            A a = new A();
            a.aa();
  
            //这样是正确的
            B b = new B();
            b.bb();
        }
    }
}

  内部访问通常用于基于组件的开发,因为它使一组组件能够以私有方式进行合作,而不必向应用程序代码的其余部分公开。 例如,用于生成图形用户界面的框架可以提供 Control 和 Form 类,这两个类通过使用具有内部访问权限的成员进行合作。 由于这些成员是内部的,它们不向正在使用框架的代码公开。

二、protected internal

一般一个成员或类型只能有一个访问修饰符,但使用protected internal组合时除外,它的访问仅限于从包含类派生的当前程序集或类型。即我们可以在本程序集中访问,也可以在其他程序集中继承访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
namespace Common
{
    protected internal class C
    {
        public void cc()
        {
        }
    }
}
  
namespace TestWeb
{
    public class TestA
    {
        public void test_1()
        {
            //这样是出错的
            Common.C c = new Common.C();
            c.cc();
        }
    }
    public class TestB : Common.C
    {
        public void test_2()
        {
            //这样是正确的
            C c = new C();
            c.cc();
        }
    }
}

  

另外附上程序集的特性:

1.程序集是任何 .NET Framework 应用程序的基本构造块。例如,在生成简单的 C# 应用程序时,Visual Studio 创建一个单个可移植可执行 (PE) 文件形式的程序集,明确地说就是一个 EXE 或 DLL。
2.包含描述它们自己的内部版本号和它们包含的所有数据和对象类型的详细信息的元数据。
3.仅在需要时才加载。如果不使用程序集,则不会加载。这意味着程序集可能是在大型项目中管理资源的有效途径。
4.可以包含一个或多个模块。例如,计划较大的项目时,可以让几个各个开发人员负责单独的模块,并通过组合所有这些模块来创建单个程序集。

posted @   yinghualeihenmei  阅读(1383)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示