没有合适的资源?快使用搜索试试~ 我知道了~
C#-编程基础练习题与答案2.doc
2 下载量 79 浏览量
2022-12-27
17:03:25
上传
评论
收藏 325KB DOC 举报
温馨提示
试读
62页
C#-编程基础练习题与答案2.doc
资源推荐
资源详情
资源评论
.
精选文档
1.面向对象的思想主要包括什么?
答:个人认为一各程序语言要成为真正的面向对象的程序设计语言,它必须符合下列条件:
1 抽象(abstraction)—抽象能够有效地管理一个问题的复杂性,其作法是划分出与该问题相关
的一组对象.
2 封装(Encapsulation)—封装是指将一个抽象的内部实现隐藏在特定的对象之内.
3 多态(polymorphism)—多态会提供相同方法的多种操作方法的多种操作实作.例如,不同的
对象都会拥有一个 Save 方法,但是每一个 Save 方法会执行不同的操作.
4 继承(inheritance)—Visual C# 2005 最令人兴奋之处就是其继承特性.v c#2005 则提供了真
正的方法继承,因此您可以重复使用一个类的实例.
2.什么是 ASP.net 中的用户控件
自己动手作自己的控件来取代.NET 提供的控件。这种控件就是用户控件。后缀
为.ascx
3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么
是重载?什么是多态? CTS、CLS 和 CLR 分别作何解释?
应用程序域:应用程序域(通常是 AppDomain)是用于隔离应用程序的虚拟进程。在同一个
应用程序作用域中创建的所有对象(换句话说,从该应用程序的入口点开始沿着对象激活序
列的任何地方)都在同一个应用程序域中创建。多个应用程序域可以存在于一个操作系统进
程中,使它们成为隔离应用程序的简便方式。 操作系统进程通过使用各不相同的内存地址空
间来提供隔离。尽管它是有效的,但也是代价昂贵的,并且不能达到大型 Web 服务器所需
要的数量。与其相比,公共语言运行时通过管理在应用程序域中运行的代码的内存使用来强
制进行应用程序隔离。这样就确保它不会访问应用程序域以外的内存。需要注意的是,只有
类型安全的代码才能以这种方式管理(当在应用程序域中加载不安全代码时,运行时不能保
证隔离)。
理解应用程序域:
应用程序域是.NET 运行库的逻辑进程表示,操作系统进程可以包含多个应用程序域。应用程序
域具有下列优点:
1、隐藏了进程具体的操作系统信息。从而允许把.NET 放在不同的操作系统下。
2、提供了隔离。即使运行在同一个进程中的属于不同域的应用程序也不能直接共享全局数据、
静态数据或其他资源。所以,一个应用程序域失败了,也不会影响到同一个进程中的其他应用程
序域。
3、对于不需要昂贵的 IPC 机制的进程,应用程序域允许 .NET 运行库优化运行在这种进程中
的应用程序间的通信。
因为应用程序域是被隔离的,所有.NET 对象都会被界定在创建它的应用程序域内。如果跨应用
.
精选文档
程序域的边界传递对象引用,该被引用对象就被称为远程对象。
装箱和拆箱
在C#中的有两种类型的变量:值类型和引用类型。当值类型和引用类型相互转化时,会发生装箱
和拆箱的过程。这里有一点要声明:经过拆箱或装箱的对象会多出它自己一份拷贝。它和它的拷
贝不在一个存储区域。这也是值类型和引用类型的区别所在。值类型总是在栈中,而引用类型总
是在托管堆中。(目前J2SE5.0也支持了装箱和拆箱,但是我目前不知道是否和C#一样)。为了进
一步理解看下面例子:
struct Point{
public int x;
public int y;
}
static void Main(){
Point p;
p.x=10;
p.y=20;
Object o=p;//box. 将值类型从栈中拷贝到堆中。
/************************************************************************/
* 从托管堆中将对象拷贝到栈中。
/************************************************************************/
Point p2=(Point)p;
Console.WriteLine(“p2.x:="+p2.x+ “ p2.y:=“+p2.x);
p.x=16;
p.y=34;
Console.WriteLine(“p2.x:="+p2.x+ “ p2.y:=“+p2.x);
Console.WriteLine(“p.x:="+p.x+ “ p.y:=“+p.x);
}
输出结果为:
p2.x:=10;p2.y=20;
p2.x:=10;p2.y=20;
p.x:=16;p.y=34;
可知,变量经过拆箱/装箱后,得到是自己的另一份拷贝。
装箱和取消装箱的概念是 C# 的类型系统的核心。它在“值类型”和“引用类型”之间的架
起了一座桥梁,使得任何“值类型”的值都可以转换为 object 类型的值,反过来转换也可以。
装箱和取消装箱使我们能够统一地来考察类型系统,其中任何类型的值最终都可以按对象处理
多态
一.形象理解
.
精选文档
两条理解的原则:
(1)一个派生类对象可以被声明成一个基类,或者是一个基类指针可以指向一个派生类对象:
//c++ code
BaseClass *p;
DerivedClass obj;
p = &obj;
//C# code
BaseClass obj = new DerivedClass();
(2)把一个对象看做是一个独立的个体,调用对象的public成员函数实际上是给这个对象发送一
个消息,采取什么样的动作完全由对象自己决定。
Shape是基类,Circle和Line是从Shape继承出来的,Shape有draw()方法,Circle与Line分别自己定义了
自己的draw()方法,在下面的代码里:
// Java Code
static void func(Shape s)
{
s.Draw();
}
如果发生了这样的调用:
Line l = new Line();
Circle c = new Circle();
func(l);
func( c);
一个Circle和一个Line被当做Shape传到函数里去了,然后调用Draw(),会发生什么情况?因为对象
是独立的个体,在func()里,这两个对象被分别传递了Draw()消息,叫它们绘制自己吧,于是他们
分别调用了自己类里定义的Draw()动作。
通过这两条原则我们可以理解上面的多态。正是由于多态,使得我们不必要这样去做:
IF 你是一个Circle THEN 调用Circle的Draw()
ELSE IF 你是一个Line THEN 调用Line的Draw()
ELSE …
我们只要给这个被声明成为Shape的对象发送Draw消息,怎么样去Draw就由对象自己去决定了。
二.一切皆因虚函数
先看看实现多态的基本条件:
(1) 基类含有虚函数
(2) 继承类把这个虚函数重新实现了
(3) 继承类也可能没有重新实现基类的所有虚函数,因此对于这些没有被重新实现的虚
函数不能发生多态。
.
精选文档
再看一下几种语言里一些特别的规定:
1. C++:
(1)虚函数用virtual关键字声明。
(2)virtual void Func(para_list) = 0;这样的虚函数叫做纯虚函数,表示这个函数没有具体实现。包
含纯虚函数的类叫做抽象类,如果他的继承类没有对这个纯虚函数具体用代码实现,则这个继承
类也是抽象类。抽象类不能被实例话(就是说不能创建出对象)。
(3)继承类重新实现基类的虚函数时,不需要做任何特别的声明。
(4)如果不用virtual关键字修饰,并且在派生类里重新实现了这个方法,这仅仅是一个简单的覆
盖,不会发生多态,我们暂称它非多态吧。
2. Java:
(1)Java没有virtual关键字,Java把一切类的方法都认为是虚函数。
(2)继承类重新实现基类的虚函数时,不需要做任何特别的声明。因此在Java里只要重新实现了
基类的方法,并且把继承类对象声明为基类,多态就要发生。因此Java对多态的条件相对是比较
低的。
//Java Code
class BaseClass
{
public void hello(){};
}
class DerivedClass extends BaseClass
{
public void hello()
{
System.out.println(“Hello world!”);
}
public static void main(String args[])
{
BaseClass obj = new DerivedClass();
obj.hello();
}
}
输入是Hello world!。这样就实现了多态。
(3)虚函数用abstract声明,含有虚函数的类是抽象类,也要用abstract关键字修饰。
//Java Code
public abstract AbstractClass
{
.
精选文档
public abstract void hello();
//…
}
3. C#:
C#对于多态的编写是最为严格和严谨的。
(1)虚函数用virtual声明。
(2)纯虚函数用abstract声明,含纯虚函数的类是抽象类,必须用abstract关键字修饰。
(3)如果仅仅是覆盖基类的非虚方法,则需要用new关键字声明:
//C# Code
public class BaseClass
{
public void hello()
{
System.Console.WriteLine(“Hello,this come from BaseClass”);
}
}
public class DerivedClass : BaseClass
{
public new void hello()
{
System.Console.WriteLine(“Hello,this is come from DerivedClass”);
}
public static void Main()
{
BaseClass obj = new DerivedClass();
obj.hello();
}
}
输出为Hello,this come from BaseClass,也就是说这并没有实现多态(非多态)。
(4)通过virtual – override、abstract – override组合实现多态。
当派生类重新实现基类的虚函数(或纯虚函数)时,必须用override关键字进行修饰。
//C# Code
public abstract class AbsBaseClass
{
public abstract void hello();
}
剩余61页未读,继续阅读
资源评论
黑色的迷迭香
- 粉丝: 706
- 资源: 4万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功