项目工程结构说明(Internal)
注意:想要彻底把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; // 产生错误,因为不能访问内部成员
}
}
项目工程结构说明(Internal)的更多相关文章
- 使用MyEclipse新建maven项目时报An internal error occurred during: "Retrieving archetypes:". GC overhead limit
前几天在上手maven时,遇到了一个十分头疼的问题,我的myeclipse配置的是自己安装的插件 ,总是报 " An internal error occurred during: &quo ...
- 用spring tool suite插件创建spring boot项目时报An internal error occurred during: "Building UI model". com/google/common/
本文为博主原创,未经允许不得转载 在用spring tool suite创建spring boot项目时,报一下异常: 查阅很多资料之后发现是因为装的spring tool suite的版本与ecli ...
- Eclipse构建项目时"An internal error occurred during: "Building workspace". Java heap space"
出现这个错误,eclipse 会卡死,以及自动退出 解决方案 工程根目录 找到项目中.project文件 删除这两处 第一处: <buildCommand> < ...
- appium+python自动化项目实战(二):项目工程结构
废话不多说,直接上图: nose.cfg配置文件里,可以指定执行的测试用例.生成测试报告等.以后将详细介绍.
- Java进击C#——项目开发环境
本章简言 上一章我们了解一下开发环境,知道了什么去新建一个项目工程.却并没有去项目工程进行介绍.可是之后我们会常常跟项目工程打交道.所以这章笔者就对项程工程的常用的一些功能进行讲解.当然说全面那是不可 ...
- 使用maven搭建SpringMVC项目环境
Window环境下用maven新建一个项目: mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=cn-cisol -Dartif ...
- 跟着视频做的SSH项目总结
一直没做过SSH(Struts2+Spring+Hibernate)的实际项目,只是三个框架学的还熟练,但整合起来使用就不知道了.所以前段时间在网上找了一套SSH实际项目的视频来学习(确切的说是买的. ...
- Swift实现糗事百科Demo(实战项目)
在这里,你将会学习到解析JSON数据,网络请求功能,动态调整cell内容等功能!!! 最终的结果 是这样的,项目相对简单,很适合入门!下面让我们一起开始教程之旅吧! 1.先看下项目工程结构: 第一步: ...
- WEB项目(B/S系统)打包安装(总结篇)
原文:WEB项目(B/S系统)打包安装(总结篇) 打包安装程序的制作选择性还很多的,有installshield,wise installer,inno setup这几个做打包安装项目都是很强大的,要 ...
随机推荐
- 第一个Python程序(Day3)
一 Python 解释器执行Python程序的过程 eg:python3 C:\ test.py 1.启动python解释器 (内存中) 2.将C:\ test.py中的内容从硬盘读入内存 ...
- SOAPUI 压力测试的指标项说明
soapUI Pro指标项说明: Test Step Sets the startup delay for each thread (in milliseconds), setting to ...
- 求组合数的方法:转载自VincentCZW的博客
遇到了就查了下:地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/18/2508189.html 求一个组合数Cnm的值,Cnm= n! ...
- canvas 事件绑定
Canvas事件绑定 canvas事件绑定 众所周知canvas是位图,在位图里我们可以在里面画各种东西,可以是图片,可以是线条等等.那我们想给canvas里的某一张图片添加一个点击事件该怎么做到 ...
- eclipse中自动加载源码的方法
1.选中项目右键properties--java build path--Libraries--Add External class Folder 找到项目将项目添加进去 2.然后就是这样 3.OK
- 智能指针 auto_ptr、scoped_ptr、shared_ptr、weak_ptr
什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源.避免泄漏的惯用法. RAII又叫做资源分配即初始化,即:定义 ...
- Mysql数据库导出sql脚本
1. 运行环境Centos mysqldump -h localhost -u root -p etv > ./etv.sql etv 是要导出的数据库名 > 设置导出的路径和文件名
- 高并发情况下分布式全局ID
1.高并发情况下,生成分布式全局id策略2.利用全球唯一UUID生成订单号优缺点3.基于数据库自增或者序列生成订单号4.数据库集群如何考虑数据库自增唯一性5.基于Redis生成生成全局id策略6.Tw ...
- LuManager升级php5.6.27方法
LuManager自带的PHP在FastCGI模式是 5.2.17版,非FastCGI模式是 5.3.14版.由于360网盘的停服,已不敢再用那些免费的网盘,干脆自己搭个私有云.查了下相关资料准备先试 ...
- 小米智能家居接入智能家居平台homeassistant的方法
[原文] 在安装和设置完homeassistant之后,我们终于来到激动人心的一步——把智能家居产品接入homeassistant了.把智能家居产品接入homeassistant智能家居平台之后,就可 ...