引言
在《C#高阶编程》(中文第10版)的2.2.4节中,有这样一段描述:
看到这段话,我简单的理解为,只要在程序开始用using语句声明名称空间,就可以在当前名称空间使用声明的这个名称空间中的类和方法,但实践证明我的理解是有些错误的T0T
问题与解决
首先,创建两个项目,分别是RectangleApplication和HelloWordApplication
源码如下:
- RectangleApplication—Program.cs,这里定义了名为“RectangleApplication”的名称空间,并创建 Rectangle类和 Area类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RectangleApplication
{
class Rectangle
{
double width;
double length;
double area;//成员变量
public void getDetails()
{
width = 2.8;
length = 3.1;
}//成员方法
public double getArea()
{
area = width * length;
return area;
}//成员方法
public void show()
{
Console.WriteLine("Witdh:{0}", width);
Console.WriteLine("Length:{0}", length);
Console.WriteLine("Area:{0}", getArea());
}//成员方法
}
class Area
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.getDetails();
r.show();
Console.ReadKey();
}
}
}
可以正常编译运行,结果是:
- HelloWordApplication—Program.cs,在这里,使用using语句声明“RectangleApplication”这个名称空间,并且在main()方法中调用“RectangleApplication”名称空间中的类与方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using RectangleApplication;
namespace HelloWordApplication
{
class Program
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.getDetails();
r.show();
Console.WriteLine("成功运行了!");
Console.ReadKey();
}
}
}
执行报错,如图:
在using语句中声明了名称空间,但却没有成功引用该名称空间的类,在网上找到解决方法如下:
在项目的展开目录下,有一个“引用”目录,右键点击,选择“添加引用”,进入【引用管理器】,因为这里是引用同一解决方案中的另一项目的命名空间,所以选择相应的项目(RectangleApplication)就好,点击“确定”。
此时,using已经不再报错,但是又出现了新的错误,如图:
原因是,在namespace中的类、接口默认是internal访问类型的,只允许同一程序集文件中的成员访问,如果要让另一程序集访问,须显示的将该类访问类型定义为public。如下:
至此,不再报错,HelloWordApplication项目可以正常运行,运行结果如下:
问题积累
-
项目目录中的“引用”和代码中的using有什么区别?
在项目目录中的“引用”中添加某一程序集(库文件)或者项目后,该项目就可以使用这一程序集中的内容了,包括访问权限许可的类、方法等。
而using则方便我们使用引用了的程序集,因为一个程序集下有一个或者多个名称空间,使用using可以对其中某一名称空间进行引入,与此同时,也简化了我们的代码,当在代码中需要用到引用的程序集中的某一方法时,如果使用using语句引入了方法所在的名称空间,我们在使用方法时只需写类.方法即可,否则就还需要在这前面加上冗长的名称空间,非常不方便。
总之using引入名称空间成功的前提是在项目的“引用”中添加了该名称空间所在的程序集。
-
C#默认访问权限(部分)
1.在namespace中的类、接口默认是internal类型的,可以显示的定义为public类型,但不允许是其他访问类型。
2.在一个类里面,变量和方法默认是private的,可以显示的定义为public、private、protected、internal或protected internal等访问类型。
3.接口中不能定义成员变量,接口中的方法访问权限默认且只能为public,不能显示的定义任何访问类型。
4.抽象类中抽象方法可以是public、internal、protected,不能是private的访问类型。
5.类中所有的成员,默认均为private。
C#中的访问修饰符:
下表引用自《C#高级编程(中文第10版)4.4.1 访问修饰符
补充:微软官方C#指南 中,新增一种访问修饰符如下:
private protected 访问限于同一程序集中的包含类或派生自包含类的类