C#基础题
一、问答题:
1、 简述 private、 protected、 public、 internal 修饰符的访问权限
private : 私有成员, 在类的内部才可以访问。protected : 保护成员,该类内部和继承类中可以访问。public : 公共成员,完全公开,没有访问限制。internal: 在同一命名空间内可以访问。
2、 override与重载的区别
Override用来重写父类的方法,重载使用相同名的方法或操作符拥有不同类型的参数
3、 C#中接口和类的异同
接口和类都是类,不同的事,接口只包含方法或属性的声明,不包含具体实现方法的代码,接口可以实现多继承,而类只能是单继承,继承接口的类必须实现接口中声明的方法或属性。接口主要定义一种规范,统一调用方法,在大型项目中接口正发挥日益重要的作用。
4、 在c#中using和new这两个关键字有什么意义,请写出你所知道的意义
Using 引入一个名子空间,或在使用了一个对像后自动调用其IDespose,New 实例化一个对像,或修饰一个方法,表此方法完全重写此方法。
5、 谈谈类和结构的区别
最大区别一个是引用类型,一个是值类型 默认成员访问为public是另外一个区别。
6、 概述反射和序列化
反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性
序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
7、 用sealed修饰的类有什么特点
sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其它类的基类,则会发生编译时错误,密封类不能同时为抽象类。
sealed 修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体说来,由于密封类永远不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。
8、 类成员有几种可访问形式
可访问性:public ,protected ,private,internal。
9、 C#中,string str = null 与 string str ="",请尽量用文字说明区别。(要点:说明详细的内存空间分配)
string str ="" 分配空间。
10、 面向对象的思想主要包括什么?
封装、继承、多态
封装:用抽象的数据类型将数据和基础数据的操作封装在一起,数据被保护在抽象数据类型内部。
继承:子类拥有父类所有的数据和操作。
多态:一个程序中同名的不同方法共存的情况。
多态有两中形式——重载与重写。
11、 如何理解委托?
据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法。
12、 C#中的接口和类有什么异同
接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念。
类是负责具体功能的实现。
在类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一个不完全的类,类里面有抽象的方法、属性,也可以有具体的方法和属性,需要进一步专业化。
但接口是一个行为的规范,里面的所有的东西都是抽象的。
一个类只可以继承一个基类也就是父类,但可以实现多个接口。
13、 进程和线程分别怎么理解
进程就是计算机中正在执行的程序(即处于活动状态的程序),每一个进程都有自己独立的一块内存空间和一组系统资源。
线程和进程有很多相似的特征,线程可以被开作是进程的进一步细分,也就是把进程完成的任务划分成一个个更小的子任务,每一个子任务就是一个线程,然后用细分的这些线程分别去执行。线程是基于进程的一个级别运行单位,线程同样包括一个内存入口地址、一个出口地址以及能够执行的代码序列。但是线程和进程的根本区别在于线程不能够单独执行,它必须运行在处于活动状态的进程中。
14、 什么是装箱和拆箱
装箱就是隐式将一个值类型转换为引用类型对象。
拆箱就是将一个引用类型对象转换成任意值类型。
15、 什么是重载?
重载分为普通方法重载和基类虚方法重载。
普通方法重载是指:类中两个以上的方法(包括隐藏的继承而来的方法),取相同的名字,但使用的参数类型或参数个数不同。
对基类方法的重载是函数重载的另一种特殊形式。在派生类中重新定义此虚函数。方法名称、返回值类型、参数表中的参数个数、类型、顺序都必须和基类中的虚方法一致。在排成类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有new、static或、virtual修饰符;
16、 值类型和引用类型的区别?
值类型:单元直接存放有效值。如:int I = 3; 则I内存单元就存放3。
引用类型:单元放的是另外一个对象的引用(地址)。如:Form form1=new Form();就是说在内存中开辟了一个对象new Form(),form1内存单元存放的就是那个对象的地址,并非对象本身。
17、情描述属性与索引器的区别
属性:通过名称标识。通过简单名称或成员访问来访问。可以为静态成员或实例成员。属性的get访问器没有参数。属性的set访问器包含隐式的value参数。
索引器:通过签名标识。通过元素访问来访问。必须为实例成员。索引器的get访问器
具有与索引器相同的形参表。除了value参数外,索引器的set访问器还与索引器相同的形参表。
18、情叙述count与readonly的区别
每一个类之多只可以定义一个static构造函数,并且不运行增加访问级别关键字,参数必须为空。
为了不违背编码规则,通常把static成员声明为private,然后通过static property提供读写访问。
count关键字用于修改字段或局部变量的声明。它制定字段或局部变量的值不能被修改。常数声明引入给的类型的一个或多个常数。
count数据成员的声明形式必须包含初始值,且初始值必须是一个常量表达式。因为它是在编译时就需要完全评估的。
count成员可以使用另一个count成员来初始化,前提是两者直接没有循环依赖。
readonly在运气期评估赋值,使我们得以在确保“只读访问”的前提下,把object初始化动作推迟到运行期间。
readonly关键字与count关键字的不同:const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段是编译时常数,而 readonly 字段可用于运行时常数。
readonly 只能在声明时或者构造函数里面初始化,并且不能在 static 修饰的构造函数里面。
19、谈谈类和结构的区别
最大区别一个是引用类型,一个是值类型 默认成员访问为public是另外一个区别
20、描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
不是。可以用任意类型。
二、选择题
1、以下哪些可以作为接口成员(多选)(ABCD)
A.方法 B、属性 C、字段 D、事件 E、索引器 F、构造函数 G、析构函数
2、以下关于ref和out的描述哪项是正确的(多项)(ACD)
A、使用ref参数,传递到ref参数的参数必须最先初始化。
B、使用out参数,传递到out参数的参数必须最先初始化。
C、使用ref参数,必须将参数作为ref参数显示传递到方法。
D、使用out参数,必须将参数作为out参数显示传递到方法。
3、”访问范围限定为此程序或那些由它所属的类派生的类型”是对以下哪个成员可访问性含义的正确描述(B)
A、public B、protected C、internal D、protected internal
4、下列选项中,(C)是引用类型。
a)enum类型 b)struct类型 c)string类型 d)int类型
5、以下描述错误的是(A)
a)在C++中支持抽象类而在C#中不支持抽象类。
b)C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。
c)在C#中可使用 new 修饰符显式隐藏从基类继承的成员。
d)在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。
6、C#的数据类型
有(D)
a)值类型和调用类型; b)值类型和引用类型;c)引用类型和关系类型;d)关系类型和调用类型;
7、下列描述错误的是(D)
a)类不可以多重继承而接口可以;
b)抽象类自身可以定义成员而接口不可以;
c)抽象类和接口都不能被实例化;
d)一个类可以有多个基类和多个基接口;
8、下列关于构造函数的描述正确的是(C)
a)构造函数可以声明返回类型。
b)构造函数不可以用private修饰
c)构造函数必须与类名相同
d)构造函数不能带参数
9、.int[][] myArray3=new int[3][]{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}}; myArray3[2][2]的值是(D)。
a)9 b)2 c)6 d)越界
10、接口是一种引用类型,在接口中可以声明(A),但不可以声明公有的域或私有的成员变量。
a)方法、属性、索引器和事件; b)方法、属性信息、属性; c)索引器和字段; d)事件和字段;
11、.下列关于C#中索引器理解正确的是(B/C )
a)索引器的参数必须是两个或两个以上 b)索引器的参数类型必须是整数型
c)索引器没有名字 d)以上皆非
12、装箱、拆箱操作发生在: ( C )
A.类与对象之间 B.对象与对象之间
C.引用类型与值类型之间 D.引用类型与引用类型之间
13、用户类若想支持Foreach语句需要实现的接口是: ( A )
A.IEnumerable B.IEnumerator
C.ICollection D.ICollectData
14、装箱与拆箱操作是否是互逆的操作?( B )
A.是 B.否
15、以下哪个是可以变长的数组?( D )
A.Array B.string[]
C.string[N] D.ArrayList
16、对于一个实现了IDisposable接口的类,以下哪些项可以执行与释放或重置非托管资源相关的应用程序定义的任务?(多选) (ABC)
A.Close B.DisposeC.Finalize
D.using E.Quit
三、程序题
1、using System;
class A
{
public A(){
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
当使用new B()创建B的实例时,产生什么输出?
X=1,Y=0
2、using System;
class A
{
public static int X;
static A(){
X=B.Y+1;
}
}
writeline输出数值变量class B
{
public static int Y=A.X+1;
static B(){}
static void Main(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
产生的输出结果是什么?
x=1,y=2
3、一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现
public class MainClass
{
public static void Main()
{
Console.WriteLine(Foo(30));
}
public static int Foo(int i)
{
if (i <= 0)
return 0
;
else if(i > 0 && i <= 2)
return 1;
else return Foo(i -1) + Foo(i - 2);
}
}
4、请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
foreach (System.Windows.Forms.Control control in this.Controls)
{
if (control is System.Windows.Forms.TextBox)
{
System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;
tb.Text = String.Empty ;
}
}
5、请编程实现一个冒泡排序算法?
int [] array = new int [*] ;
int temp = 0 ;
for (int i = 0 ; i < array.Length - 1 ; i++)
{
for (int j = i + 1 ; j < array.Length ; j++)
{
if (array[j] < array[i])
{
temp = array[i] ;
array[i] = array[j] ;
array[j] = temp ;
}
}
}
6、求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
int Num = this.TextBox1.Text.ToString() ;
int Sum = 0 ;
for (int i = 0 ; i < Num + 1 ; i++)
{
if((i%2) == 1)
{
Sum += i ;
}
else
{
Sum = Sum - I ;
}
}
System.Console.WriteLine(Sum.ToString());
System.Console.ReadLine() ;
7、在下面的例子里
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
当使用new B()创建B的实例时,产生什么输出?
X=1,Y=0;x= 1 y = -1
8、根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:
namespace test
{
public delegate void OnDBOperate();
public class UserControlBase : System.Windows.Forms.UserControl
{
public event OnDBOperate OnNew;
privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if(e.Button.Equals(BtnNew))
{
//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。
}
}
}
补填的代码为:
if( OnNew != null
OnNew( this, e );
9、a 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
List L=new List();
Random random = new Random();
for (int i = 1; i <= 100; i++)
{
if (L.IndexOf(i) < 0)
{
L.Add(random.Next(1,100));
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论