C#中的Internal关键字小结

首先,理清几个概念:项目(project)、解决方案(solution)、程序集(assembly)、命名空间(namespace)。

项目(project)  就是我们开发的一个软件。.NET下,项目有多种类型,如控制台、Windows应用程序、类库、Web应用程序等等。经过编译后,会生成.exe文件和.dll文件。 .exe文件有统一的主程序入口,可以被执行,而类库只是提供一些功能给其他项目调用。

解决方案(solution)  当我们在VS中新建任何一种类型的项目时,这个项目还属于一个解决方案。当我们的业务相对简单时,解决方案所发挥的作用并不是很大。但当我们开发复杂的软件时,需要多个模块组成。比如说开发中常用的三层架构,U层是一个简单的windows应用程序(项目的一种类型),B、D层由多个类库(项目的另一种类型)组成。通过一个解决方案,我们就可以将其多个项目组合起来,完成我们的开发。形象地说,解决方案就是一个容器,在这个容器里,分成好多层,好多格,用来存放不同的项目。换句话来说就是:程序集就是一个项目,多个项目构成一个解决方案。
程序集(assembly)  一个项目就是一个程序集。一个程序集可以体现为一个dll文件,或者exe文件。

命名空间(namespace)  主要是为了避免一个项目中,可能会存在的相同对象名的冲突。

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

注意,C#的using指示符会指示编译器试着在类型名上添加不同的前缀,直到找到一个匹配为止。命名空间只是逻辑上,真正的类型在程序集里。当查找一个类型的定义时,编译器必须被告知到哪些程序集中进行查找,编译器将扫描它知道的所有程序集来查找类型的定义。一旦编译器找到了正确的程序,程序集信息和类型信息会被添加到生成托管模块的元数据中。
重要提示:CLR不知道命名空间的任何事情。访问一个类型时,CLR需要知道类型的完整名称(这可能是一个相当长、包含句点符号的名称)以及该类型的定义具体在哪一个程序集中。这样一来,“运行时”才能加载正确的程序集,找到目标类型,并对其进行操作。

联系与区别:

命名空间是类库的逻辑组织形式,程序集就是类库的物理组织形式

一个程序集内可能有多个命名空间,一个命名空间可能存在于不同的程序集中

程序集是实现类型的文件,编译之后生成的。命名空间是对类型的逻辑分组。

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、从定义具有内部访问能力的类型或成员的程序集外部引用该类型或成员是错误的。示例1包含两个文件(表示两个文件不在同一个程序集中):Assembly1.cs 和 Assembly2.cs。第一个文件包含内部基类BaseClass,在第二个文件中,实例化BaseClass的尝试将产生错误:

示例1:

 // Assembly1.cs
 internal class BaseClass
 {
   public static int intM = 0;
 }
 // Assembly2.cs
 // Compile with:Assembly1.dll
 class TestAccess
 {
   static void Main()
   {
     BaseClass myBase = new BaseClass();  // 错误,无法实例化
   }
 }

  在示例2中,使用与示例1中所用相同的文件,并将BaseClass的可访问性级别更改为public,还将成员IntM的可访问性级别更改为internal。在此例中,可以实例化类,但不能访问其内部成员:

示例2:

 // Assembly1.cs
 public class BaseClass
 {
   internal static int intM = 0;
 }
 // Assembly2.cs
 // Compile with:Assembly1.dll
 public class TestAccess
 {
   static void Main()
   {
     BaseClass myBase = new BaseClass();  // Ok,可以实例化类
     BaseClass.intM = 444;  // 错误,因为不能访问内部成员
  }
 }

以上所述是小编给大家介绍的C#中的Internal关键字小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Mysql错误Cannot find or open table x/x from the internal问题解决方法

    网站事件日志出现了这个错误: 事件类型: 错误事件来源: MySQL事件种类: 无事件 ID: 100日期:  2012-8-14事件:  8:07:59用户:  N/A计算机: abcserver描述: 复制代码 代码如下: Cannot find or open table phpwind/pw_zhuanti from the internal data dictionary of InnoDB though the .frm file for the table exists. Mayb

  • Fckeditor XML Request error:internal server error (500) 解决方法小结

    原来一直能用的ecshop后台信息发布里面的fckeditor上传功能,换了个机器后不能用了.以为是文件损坏,上传一边不行. 什么xml错误,还弹出一个大的JavaScript alert警告框,内容就是服务器端错误的500内容 网上搜,又说是配置问题,主题问题,想想都不应该,直接请求 复制代码 代码如下: filemanager/connectors/php/connector.php 出了服务器的500错误,html文件能访问,txt也行. 后来从根目录开始查,发现到fckeditor目录里

  • asp.net 修饰符介绍(关于public、private、protected、internal)

    1.private修饰符 private修饰符用于设置类或类成员的访问权限仅为所属类的内部, private也被称为私有修饰符.某些时候需要访问私有类成员时,可通过get和set访问器读取或修改. 2.protected修饰符 protected修饰符用于设置类或类成员的访问权限仅为所属类及子类的内部. 3.internal修饰符 internal修饰符修饰的类或类成员的访问权限为同一程序集内部,C#默认的类访问修饰符即为internal. 4.public修饰符 public修饰符则为公共访问

  • C#中的Internal关键字小结

    首先,理清几个概念:项目(project).解决方案(solution).程序集(assembly).命名空间(namespace). 项目(project)  就是我们开发的一个软件..NET下,项目有多种类型,如控制台.Windows应用程序.类库.Web应用程序等等.经过编译后,会生成.exe文件和.dll文件. .exe文件有统一的主程序入口,可以被执行,而类库只是提供一些功能给其他项目调用. 解决方案(solution)  当我们在VS中新建任何一种类型的项目时,这个项目还属于一个解决

  • 深入理解java中的synchronized关键字

    synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized 方法和 synchronized 块. 1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法.如: 复制代码 代码如下: publ

  • C# 中的partial 关键字详解

    目录 引言 分部类 partial 分部限制 分部接口和结构 分部方法 this 和 partial 的区别 引言 partial 关键字用于拆分一个类.一个结构.一个接口或一个方法的定义到两个或更多的文件中. 每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来.在设计 Framework 时,可以充分利用 partial 这个特性. 分部类 什么情况下需要拆分类定义呢? 处理大型项目时,使一个类分布于多个独立文件中可以让多位程序员同时对该类进行处理. 当使用自动生成的源文

  • 在 Angular 中实现搜索关键字高亮示例

    在 Angular 中,我们不应该试图直接修改 DOM 的内容,当需要更新 DOM 内容的时候,应该修改的其实是我们的数据模型,也就是 $scope 中的数据,Angular 会帮助我们将修改之后的数据展示在页面中. 但是,在有些情况下,比如我们有一个搜索框,希望将搜索的关键字在正文中高亮出来,这时候就会感觉比较吃力了,filter 可以帮助我们处理这种情况. 实际上,很多时候,我们的数据是不能直接输出到 DOM 中的,典型的比如日期,或者货币等等,通常需要将我们内部的数据格式化之后,再输出到页

  • 如何在C语言的宏中使用类型关键字

    如下所示: 复制代码 代码如下: // 在C语言的宏中使用类型关键字#include <stdio.h> #define PRINT_AS_TYPE(i,TYPE) printf("%d ", (TYPE)i) int main(int argc, char *argv[]){ float x= 9; PRINT_AS_TYPE(x, int); return 0;}

  • 深入理解Java中的final关键字_动力节点Java学院整理

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使用final关键字的实例.final经常和static一起使用来声明常量,你也会看到final是如何改善应用性能的. final关键字的含义? final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如

  • JAVA中的final关键字用法实例详解

    本文实例讲述了JAVA中的final关键字用法.分享给大家供大家参考,具体如下: 根据上下文环境,java的关键字final也存在着细微的区别,但通常指的是"这是无法改变的."不想改变的理由有两种:一种是效率,另一种是设计.由于两个原因相差很远,所以关键子final可能被误用. 接下来介绍一下使用到final的三中情况:数据,方法,类 final数据 许多编程语言都有某种方法,来向编译器告知一块数据是恒定不变的.有时数据的恒定不变是很有用的,例如: 1. 一个编译时恒定不变的常量 2.

  • 深入浅析ES6 Class 中的 super 关键字

    以下只是个人的学习笔记: super这个关键字,既可以当作函数使用,也可以当作对象使用.在这两种情况下,它的用法完全不同. 1.当作函数使用 class A {} class B extends A { constructor() { super(); //ES6 要求,子类的构造函数必须执行一次super函数. } } 注意,super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this指的是B,因此super()在这里相当于A.prototype.construc

  • 关于javascript中dataset的问题小结

    DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合.所谓独立,就是说,即使断开数据链路,或者关闭数据库,DataSet依然是可用的,DataSet在内部是用XML来描述数据的,由于XML是一种与平台无关.与语言无关的数据描述语言,而且可以描述复杂关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路. 一.关于dataset 1.html5自定义属性及基础 html5

  • 老生常谈JavaScript中的this关键字

    相对于很多其他的面向对象语言来说,this代表的就是当前对象.例如Java中的this就是编译期间确定的.而在 JavaScript 中,this 是动态绑定,或称为运行期绑定的 Java中的this 在以下代码中.this代表的就是p对象. public class Test { public static void main(String[] args) { Person p = new Person("zmt",30); System.out.println(p.name); }

随机推荐