https://blog.csdn.net/baidu_32134295/article/details/51285603

 
 
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_32134295/article/details/51285603
注意:想要彻底把Internal关键字搞清楚,就耐着性子把她读完。当然了这篇文章只是对其他文章的总结。也算是引用吧。主要还是为了把知识点搞清楚

进入主题之前先来了解一下,项目、解决方案、程序集、命名空间四个容易混淆的概念。
①项目:就是我们开发的一个软件。.NET下,项目有多种类型,如控制台、Windows应用程序、类库、Web应用程序等等。经过编译后,会生成.exe文件和.dll文件。 .exe文件有统一的主程序入口,
可以被执行,而类库只是提供一些功能给其他项目调用。
②解决方案:当我们在VS中新建任何一种类型项目时,这个项目还属于一个解决方案。当我们的业务相对简单时,解决方案所发挥的作用并不是很大。但当我们开发复杂的软件时,需要多个模块组成。
比如说开发中常用的三层架构,U层是一个简单的windows应用程序(项目的一种类型)、B、D层由多个类库(项目的另一种类型)组成。通过一个解决方案,我们就可以将其(多个项目)组合起来,完成我们的开发。
形象地说,解决方案就是一个容器,在这个容器里,分成好多层,好多格,用来存放不同的项目。换句话来说:就是《程序集就是一个项目,多个项目构成一个解决方案》
③程序集:一个项目就是一个程序集。一个程序集可以体现为一个dll文件,或者exe文件。
④命名空间:主要是为了避免一个项目中,可能会存在的相同对象名的冲突。

对于编辑来说,命名空间仅仅是在类型名称前加了一些由点号隔开的符号而已.这使得一个类型的名称更长,从而也更具惟一性.如果两个相同的类在同一个命名空间则会冲突,如果不同的命名空间有相同的类型,
也会产生二义性。

注意,C#的using指示符会指示编译器试着在类型名上添加不同的前缀,直到找到一个匹配为止,命名空间只是逻辑上,真正的类型在程序集里,当查找一个类型的定义时,编译器必须被告知到哪些程序集中进行查找,
编译器将扫描它知道的所有程序集来查找类型的定义.一旦编译器找到了正确的程序,程序集信息和类型信息会被添加到生成托管模块的元数据中。

重要提示:CLR不知道命名空间的任何事情。访问一个类型时,CLR需要知道类型的完整名称(这可能是一个相当长、包含句点符号的名称)以及该类型的定义具体在哪一个程序集中。
这样一样,“运行时”才能加载正确的程序集,找到目标类型,并对其进行操作。

二、联系与区别

1、命名空间是类库的逻辑组织形式,程序集就是类库的物理组织形式。
2、一个程序集内可能有多个命名空间,一个命名空间可能存在于不同的程序集中
3、程序集是实现类型的文件,编译之后生成的。 
  命名空间是对类型的逻辑分组。 
4、c#编译器可能比较关心命名空间,应为它需要确定类的完整名称,然后交给CLR。 
 CLR只关心程序集,会通过类的完整名称加载对应的程序集。

三、总结

通过在项目中使用分部类,发现可以通过分部类实现对这个类的扩充和完善。而使用分部类时我们会对命名空间进行修改,近而将类进行扩展;这就是我们说的一个命名空间可以存在于不同的程序集。
通过项目去不断成长,努力去做,《关于分部类的介绍可以访问下面地址:https://msdn.microsoft.com/zh-cn/library/wa80x488.aspx 》

1. internal(内部):限定的是只有在同一程序集中可访问,可以跨类
    protected(受保护):限定的是只有在继承的子类中可访问,可以跨程序集
    protected internal:受保护“或”内部修饰符修饰成员,当父类与子类在同一个程序集中,internal成员可见。当父类与子类不在同一个程序集中,子类不能访问父类internal成员,而子类可以访问父类的ptotected internal成员,
    即从当前程序集或从包含类派生的类型,可以访问具有访问修饰符 protected internal 的类型或成员。

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

3. 从定义具有内部访问能力的类型或成员的程序集外部引用该类型或成员是错误的。
此示例包含两个文件(表示两个文件不在同一个程序集中):Assembly1.cs 和 Assembly1_a.cs。第一个文件包含内部基类 BaseClass。在第二个文件中,实例化 BaseClass 的尝试将产生错误。
// Assembly1.cs
// Compile with: /target:library
internal class BaseClass 
{
   public static int intM = 0;
}
// Assembly1_a.cs
// Compile with: /reference:Assembly1.dll
class TestAccess 
{
   static void Main() 
   {
      BaseClass myBase = new BaseClass();   // 错误,没法实例化
   }
}

在此示例中,使用与示例 1 中所用的文件相同的文件,并将 BaseClass 的可访问性级别更改为 public。还将成员 IntM 的可访问性级别更改为 internal。在此例中,你可以实例化类,但不能访问内部成员。
// Assembly2.cs
// Compile with: /target:library
public class BaseClass 
{
   internal static int intM = 0;
}
// Assembly2_a.cs
// Compile with: /reference:Assembly1.dll
public class TestAccess 
{
   static void Main() 
   {
      BaseClass myBase = new BaseClass();   // Ok.可以实例化类
      BaseClass.intM = 444;    // 产生错误,因为不能访问内部成员
   }
}

C#中Internal关键字的总结的更多相关文章

  1. 在C#中internal关键字是什么意思?和protected internal区别

    我来补充一下,对于一些大型的项目,通常由很多个DLL文件组成,引用了这些DLL,就能访问DLL里面的类和类里面的方法.比如,你写了一个记录日志的DLL,任何项目只要引用此DLL就能实现记录日志的功能, ...

  2. 在C#中internal关键字是什么意思?

    这个回答的很不错 :http://zhidao.baidu.com/link?url=BGmYomZnf_-94L4uPXa-gzYMssL5HGmZyk_fFG7x4i4z_vL8qN3o7CrJg ...

  3. C#中internal关键字

    对于一些大型的项目,通常由很多个DLL文件组成,引用了这些DLL,就能访问DLL里面的类和类里面的方法.比如,你写了一个记录日志的DLL,任何项目只要引用此DLL就能实现记录日志的功能,这个DLL文件 ...

  4. Java中的关键字 transient

    先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息 ...

  5. 【C#学习笔记之一】C#中的关键字

    C#中的关键字 关键字是对编译器具有特殊意义的预定义保留标识符.它们不能在程序中用作标识符,除非它们有一个 @ 前缀.例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字. 下面是列出的 ...

  6. c#多线程中Lock()关键字的用法小结

    本篇文章主要是对c#多线程中Lock()关键字的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助     本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段 ...

  7. public类型中internal成员

    今天遇到一问题,找到下面的两篇文章,研究比较深入,特转了一下, 最近除了搞ASP.NET MVC之外,我也在思考一些编程实践方面的问题.昨天在回家路上,我忽然对一个问题产生了较为清晰的认识.或者说,原 ...

  8. 【转】Java中的关键字 transient

    阅读目录 先解释下Java中的对象序列化 关于transient关键字 举个例子 参考资料 先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Jav ...

  9. js中this关键字测试集锦

    参考:阮一峰<javascript的this用法>及<JS中this关键字详解> this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在 ...

随机推荐

  1. 高并发压力测试工具Locust(蝗虫)

    What is Locust? Locust is an easy-to-use, distributed, user load testing tool. It is intended for lo ...

  2. mt_rand()函数、str_shuffle() 函数、join() 函数

    mt_rand() 使用 Mersenne Twister 算法返回随机整数. 语法 mt_rand(min,max) 定义和用法 str_shuffle() 函数随机地打乱字符串中的所有字符. 语法 ...

  3. Tensorflow递归神经网络学习练习

    import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data #载入数据集mnist = inpu ...

  4. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...

  5. VMware Workstation 软件 创建 Ubuntu 14.04虚拟机

    VMware Workstation 软件 创建 Ubuntu 14.04虚拟机 1. 安装VMare Workstation 软件 下载VMware 11 软件 http://www.dntk.or ...

  6. Entity Framework Code-First(17):Database Initialization Strategy

    Database Initialization Strategies in Code-First: You already created a database after running your ...

  7. 函数的返回值是如何带出和接收的以及内存中的活动情况.RP

    函数返回值时,要生成一个值的副本. 而用引用返回值时,不生成值的副本. 例如,下面的程序是有关引用返回的4种形式: //********************* //** ch9_6.cpp ** ...

  8. React 和 Redux理解

    学习React有一段时间了,但对于Redux却不是那么理解.网上看了一些文章,现在把对Redux的理解总结如下 从需求出发,看看使用React需要什么 1. React有props和state pro ...

  9. c# 使用protobuf格式操作 Redis

    protobuf格式介绍 1.protobuf为goole定义的类似于json的数据格式.2.最终都需要序列化为二进制形式进行传输存储.3.相对于xml,json格式来说,序列化为二进制后占用空间更小 ...

  10. undefined reference to `clock_gettime

    下面这个错误通常是因为链接选项里漏了-lrt,但有时发现即使加了-lrt仍出现这个问题,使用nm命令一直,会发现-lrt最终指向的文件没有包含任何symbol,这个时候,可以找相应的静态库版本libr ...