Value Types and Reference Types
简单得数据类型属于Value Types,类属于Reference Types.在许多地方两者得区别不是很大,在应用上也极其相近,但是在三种情况下,需要注意这两种类型得不同.in assignment operations, in comparison operations, and when passing parameters,也就是指定操作,比较操作,和参数得传递.
Assignment Operations
integerA = integerB;//将后者得值赋给前者,他们的值相同了,他们在内存中得存放是两个不同得内存单元.
objectA = objectB;//他们两者都指向了同一个实例,也就是说一个实例有两个名称,是一个对象但可以通过两种途径访问,通过objectA修改对象,再从objectB访问的时候,发现对象是被修改过的.
但又时候,你也许需要象integerA = integerB一样的方式来赋值对象,所以.net提供了一个clone()函数,他能心建一个对象,而不是一个对象公用两个名称.
Equality Testing
if (integerA == integerB){}//你比较的是两个的实际内容.
if(objectA == objectB){}//比较的是两个是不是都指向同一个对象,而并不是比较两者的内容.
Passing Parameters by Reference and by Value
有三种传递参数的方法.他们是pass-by-value,pass-by-reference,为了使我们更容易理解这里.例子如下:
private void ProcessNumber(ref int number)//pass-by-reference
{number * =2;}
int num = 10;
ProcessNumber(ref num);
用这种方法需要注意的是,如果函数定义的是以ref传递,那么调用的时候也必须以ref调用才行,在这里num在内存中的值被修改成20了.但如果函数的定义与调用都没有ref的时候,num的值是不会被改变的,因为,他是将10这个数传递给函数,而改变的不是num,而是ProcessNumber函数的参数number.
只有当你在使用数据类型需要以pass-by-reference形式传递参数的时候,你才需要用到ref,而类是不需要用到的,这是因为他本身就是以pass-by-reference的形式传递参数.而且只能以pass-by-reference的形式传递参数.
还有out关键字的输出,可以在英文原版书的110面找到.
Reviewing .NET Types
回顾.NET类型,又以下几种,他们是:Classes,Structures,Enumerations,Delegates,Interfaces,书中的英文很好理解,了解一下.
Understanding Namespaces and Assemblies
每一个代码片段都存在于一个.net类型中,同时,每个.NET类型都存在于一个命名空间中,图3-3指示出了这一点.
命名空间将所有不同类型都组织在了类库中,如果没有命名空间,这些类型会变得非常的散乱而且不容易记忆,而且令人厌烦的长,System是所有类的的基类.
Using Namespaces
可以自己定义命名空间,在例子中,Product类在MyCompany.MyApp的命名空间中,在此命名空间中代码可以用名字Product直接访问类,在此命名空间之外的就需要以全名MyCompany.MyApp.Product来访问.
如此一来,用户就能使用第三方提供的组件,而不用担心名字的重复或者混淆的问题,引入命名空间之后,所有的名字都是唯一的。命名空间没有任何访问的关键字(如public之类的关键子),但他是默认以public来访问,他有可嵌套定义的特性.如
namespace MyCompany.MyApp//此命名首字符必须大写,必须遵循Pascal命名规则
{
public class Product{//代码在此处}
}
Importing Namespaces
看了上面的例子,我们会发现,当有使用Product的类非用全名MyCompany.MyApp.Product来定义一个对象.有没有方法使这简单呢?答案是,YES.但,怎么使用呢?如下
需要在你的代码页面的第一行写上 using MyCompany.MyApp,这样你就可以在你的代码页直接使用Product类,而不用使用他的全名MyCompany.MyApp.Product来定义一个对象了。
Assemblies
实际上所有的.net类都包含于assemblies,assemblies应该称为程序集,assemblies是一些包含已编译代码的物理物件,
assemblies与namespaces没有严格的关系,一个assembly能够包含许多的命名空间,相反地多个assemblies文件能够包含相同命名空间中的类.实际上,assemblies是建立代码的物理包,而namespaces则是类的逻辑组织.
.NET类包含于一系列的assemblies文件中,例如,基类System就来源于mscorlib.dll assembly.许多ASP.NET类能够在System.Web.dll assembly中找到.除此之外,你也许需要使用第三方提供的assembly文件.
通常,assemblies和namespaces有着相同的名字,例如,System.Web与System.Web.dll文件,但这并不是必然的,只是为了方便.
当编译一个程序的时候,你需要告诉语言编译器,什么assemblies文件是你需要用到的,在默认情况下,会有很多的.NET assemblies文件来支持编译器的工作.如果你想使用额外的assemblies文件,你需要在configuration文件中定义他们,
今天的任务总算完成,我想越到后面会越慢,因为我发现自己越来越难以理解,一半是英文的关系,而另一半则是技术上的原因.朋友们,如果你也正在看这本书,让我们多多讨论一下吧.