.NET c#高级编程测试题

一.简答题

1.简述c#中的所有访问修饰符及访问权限
答:public(公开):给类,及所有类成员使用;范围:当前类自身/所有的子类/同一程序集其他类通过实例化也可以访问/其他程序集中的类也可以实例化访问.
private(私有):给类,及所有类成员使用;范围:当前类自身/所有类成员的默认访问修饰符.
protected(受保护的):类,内嵌类的所有成员;范围:当前类自身/所有的子类可以访问/同一程序集其他类不可以访问/其他程序集中可以通过继承也可以访问.
internal:类,内嵌类的所有成员;范围:当前类自身/同一程序集的其他类可以通过实例化访问/同一程序集中的子类也可以访问/其他程序集中不管是不是子类都无法访问.
internal protected:类,及内嵌类的所有成员;范围:当前类自身/同一程序集的其他类可以通过实例化进行访问/所有子类可以访问/其他程序集中可以通过继承进行访问,但实例化不行.
2.简单介绍方法的重载和重写
答:重载:重载是方法的名称相同。参数或参数类型不同(不同的参数类型,不同的参数个数,不同的参数顺序),进行多次重载以适应不同的需要.
重写:Override它表示重写基类的方法,而且方法的名称,返回类型,参数类型,参数个数要与基类相同;
不同点:重载方法无返回值可以,重写方法的返回值必须一致;所处的位置不同,重载的位置是在同类里,重写的位置时父子类 ;重载编译时多态,重写运行时多态;重载不需继承,重写必须继承.
3.方法中的ref参数和out参数的用法是什么?
答:out参数:方法的out参数在方法结束时,需要准备一个相同类型的变量接受out的结果,并且必须带out关键字;遇到方法中的形参是out类型,则在调用方法的时候同样实参也必须带有out关键字.
ref参数:引用传参;传进方法中的参数,如果在方法内发生改变,那么这个参数变量将永久性发生改变.
4.简单介绍数组和集合的区别
答:数组用于保存固定数量的数据,定长,占用内存少,遍历熟读快;
集合保存的数据数量,在以在程序的执行过程中,不断发生改变,不定长,占用内存多,遍历熟读慢;
在功能上,数组能实现的所有功能,集合都能实现,反之,集合能实现的某些功能,数组难以实现.
5.简单介绍c#类中的两个特殊函数
答:构造函数:如果类中没有声明构造函数,则在调用类实例时,系统自动生成一个构造函数;如果我们声明一个构造函数,系统都不再理会;作用:当类被实例化(创建)的时候,执行的函数(调用).
析构函数:一个类中只允许拥有一个或没有析构函数;作用:当这个类生成的对象被释放(销毁)的时候自动执行的函数.
6.简单介绍static静态的用法和特性
答:使用static修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器和析构函数或类以外的类型。
7.c#中的委托是什么?事件是不是委托?
答:委托可以把一个方法作为参数代入另一个方法。委托可以理解为指向一个函数的引用。事件是一种消息机制,它是一种特殊的委托。
8.请详述c#中类(class)和结构(struct)的异同
答:①值类型与引用类型:

  • 结构(Struct)是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型。
  • 类(Class)是引用类型:引用类型在堆上分配地址;堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
    i. 因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用;
    ii. 虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object;
    iii. 虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
    ②继承性:
  • 结构(struct):不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
  • 类(class):完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
    ③内部结构:
    结构(struct):
  • 没有默认的构造函数,但是可以添加构造函数
  • 没有析构函数
  • 没有 abstract 和 sealed(因为不能继承)
  • 不能有protected 修饰符
  • 可以不使用new 初始化
  • 在结构中初始化实例字段是错误的
    类(class):
  • 有默认的构造函数
  • 有析构函数
  • 可以使用 abstract 和 sealed
  • 有protected 修饰符
  • 必须使用new 初始化
    9.介绍c#中的string和stringBuildder的用法
    答:string:字符串初始化之后里面的内容不再发生改变,当引用指针发生改变,先创建个新的string对象,然后存储新的引用地址;
    stringBuilder:使用先进行实例化,支持空的构造函数,默认是空字符串,长度为零,来自system.text;引用类型;初始化过程可以指定初始大小,如果字符不超过指定范围,则不会更改存储位置引用;如果字符串改变长度后超出初始化大小,则在堆里面开辟一个新的地址空间,将原来的字符串的内容复制到新的空间中,再追歼超出长度的内容,旧的空间会自动删除,然后引用指向新的空间地址,新的空间大小是旧的空间大小的基础倍.
    10.什么是抽象函数?什么是虚拟函数?并说明两者的区别
    答:抽象函数:抽象方法必须声明在抽象类中。声明抽象方法时,不能使用virtual、static、private修饰符。在抽象类中抽象方法不提供实现。抽象方法不包含方法主体,必须由派生类以override方式实现此方法。
    虚拟函数:虚拟函数在编译期间是不被静态编译的,它的相对地址是不确定的,它会根据运行 时期对象实例来动态判断要调用的函数,其中那个申明时定义的类叫申明类,那个执行时实例化的类叫实例类。
    11.c#中的接口和类有什么异同
    答:①接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念;而类是负责功能的具体实现.
    ②在类中也有抽象类的定义,抽象类与接口的区别在于:
  • 抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
    但接口是一个行为的规范,里面的所有东西都是抽象的.
    ③一个类只可以继承一个基类也就是父类,但可以实现多个接口
    ④接口可以继承接口。抽像类可以实现(implements)接口,抽像类是否可继承实体类,但前提是实体类必须有明确的构造函数。
    12.进程和线程的区别是什么
    答:理解:进程是比线程大的程序运行单元,都是由操作系统所体会的系统运行单元,一个程序中至少要有一个进程,有一个进程中,至少要有一个线程,线程的划分尺度要比进程要小,进程拥有独立的内存单元,线程是共享内存,从而极大的提高了程序的运行效率同一个进程中的多个线程可以并发执行。
    区别:进程是系统进行资源分配和调度的单位;
    线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。
    13.请详述c#中的继承问题
    答:①子承父业,子类会继承父类的属性\构造\行为
    ②父类具有的子类不一定具有,子类具有的父类也不一定具有
    ③c#不支持多重继承,但是可以多重接口继承
    ④关键字this:当前类自己;base:代表当前类的亲父类
    14.简单介绍break、continue、return的区别
    答:break:跳出循环,跳出的是整个循环体,进行循环之后的代码;
    continue:跳出当前循环,进行新的下一次循环;
    return:跳出当前循环,跳出的是整个代码块或方法体,直到代码块结束。
    15.简单描述socket通信TCP协议的三次握手的作用
    答:第一次握手:建立连接时,客户端发送数据包到服务器,并进入监听状态,等待服务器确认。
    第二次握手:服务器收到数据包,必须确认客户的数据包,同时自己也发送一个数据包,此时服务器进入监听状态。
    第三次握手:客户端收到服务器的数据包,向服务器发送确认包,此包发送完毕,客户端和服务器进入Established状态,完成三次握手。
    16.按照步骤叙述简历socket通信的服务端和客户端的步骤
    答:服务器端:
  • 第一步:创建一个用于监听连接的Socket对像;
  • 第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
  • 第三步:用socket对像的Bind()方法绑定EndPoint;
  • 第四步:用socket对像的Listen()方法开始监听;
  • 第五步:接收到客户端的连接,用socket对像的Accept()方法创建一个新的用于和客户端进行通信的socket对像;
  • 第六步:通信结束后一定记得关闭socket;
    客户端:
  • 第一步:建立一个Socket对像;
  • 第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
  • 第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;
  • 第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;
  • 第五步:用socket对像的Receive()方法接受服务器发来的信息 ;
  • 第六步:通信结束后一定记得关闭socket;

二.算法题

1.使用递归算法计算斐波那契数列(1,1,2,3,5,8,13…)

2.在1-20这20个数中求出7个不重复随机数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆皮没有豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值