一.填空题(每空1分,共12分)

1面向对象的语言具有__封装______性、__继承_______性、__多态______性。

2能用foreach遍历访问的对象需要实现 ____Ienumerable____________接口或声明_____GetEnumerator___________方法的类型。

3当类T只声明了私有实例构造函数时,则在T的程序文本外部,不可以(可以 or 不可以)从T派生出新的类,在T的内部__可以__(可以 or 不可以)直接创建T的任何实例,在T的外部__不可以__(可以 or 不可以)直接创建T的任何实例。

  1. 委托声明的关键字是__Delegate____
  2. override与重载的区别: override覆盖是基类中函数的重写。重载:方法或函数的名称相同,参数或许参数类型不同,进行多次重载实现功能。

二. 不定项选择(每题2分,共18)

Question 1

以下叙述正确的是:

  A. 接口中可以有虚方法。     B. 一个类可以实现多个接口。C. 接口不能被实例化。       D. 接口中可以包含已实现的方法。

Question 2

以下描述错误的是()

1.在C++中支持抽象类而在C#中不支持抽象类。

2. C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。

3. 在C#中可使用 new 修饰符显式隐藏从基类继承的成员。

  1. 在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。

Question 3

声明一个委托public delegate int myCallBack(int x); 则用该委托产生的回调方法的原型应该是

1. void myCallBack(int x)

2. int receive(int num)

3. string receive(int x)

  1. 不确定的

Question 4

下列描述错误的是()
a) 类不可以多重继承而接口可以;
b) 抽象类自身可以定义成员而接口不可以;
c) 抽象类和接口都不能被实例化;
d) 一个类可以有多个基类和多个基接口;

Question 5

下列关于构造函数的描述正确的是()
a) 构造函数可以声明返回类型。
b) 构造函数不可以用private修饰
c) 构造函数必须与类名相同
d) 构造函数不能带参数

Question 6

接口是一种引用类型,在接口中可以声明(),但不可以声明公有的域或私有的成员变量。
a) 方法、属性、索引器和事件;
b) 方法、属性信息、属性;
c) 索引器和字段;
d) 事件和字段;

Question 7

以下的C#代码,试图用来定义一个接口:
public interface IFile
{
int A;
int delFile()
{
A = 3;
}
void disFile();
}
关于以上的代码,以下描述错误的是( )。
a) 以上的代码中存在的错误包括:不能在接口中定义变量,所以int A代码行将出现错误;
b) 以上的代码中存在的错误包括:接口方法delFile是不允许实现的,所以不能编写具体的实现函数;
c) 代码void disFile();声明无错误,接口可以没有返回值;
d) 代码void disFile();应该编写为void disFile(){};

Question 8.

class Class1

{

public static int Count = 0;

static Class1()

{

Count++;

}

public Class1()

{

Count++;

}

}

Class1 o1 = new Class1();

Class1 o2 = new Class1();

请问,Class1.Count的值是多少?( )

1. 1

2. 2

3. 3

4. 4

Question 9

abstract class BaseClass

{

public virtual void MethodA()

{

Console.WriteLine(“BaseClass”);

}

public virtual void MethodB()

{

}

}

class Class1: BaseClass

{

public void MethodA()

{

Console.WriteLine(“Class1”);

}

public override void MethodB()

{

}

}

class Class2: Class1

{

new public void MethodB()

{

}

}

class MainClass

{

public static void Main(string[] args)

{

Class2 o = new Class2();

o.MethodA();

}

}

请问,此程序输出结果是:

1. BaseClass

2. BassClass Class1

3. Class1

4. Class1 BassClass

(解析,三重继承问题,孙类只是继承父类,而不是直接继承祖父类)

三.问答题(每题3分,共15分)

  1. 简述 private、 protected、 public、 internal 修饰符的访问权限。

private:私有访问,它只能在声明自身的类中进行访问。

protected:表示受保护的访问,该类内部和继承类中可以访问

.public :表示公共访问,在代码任何位置都可对其进行访问

internal表示内部成员,在同一命名空间内可以访问。

  1. C#中的委托是什么?事件是不是一种委托?

委托是指具有相同属性(也称具有相同的函数签名:返回类型相同,参数类型、参数顺序及参数个数相同)的函数或方法的抽象,关键字为delegate。主要用途是三个:1)函数回调;2)传递方法;3)事件机制
事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托,对事件的声明, 实际是声明一个私有的委托变量,对委托变量进行封装,即委托变量加上event关键字后,不管其前面的访问修饰符是public还是private,编译器都会将其编译为private。

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。以委托为参数的函数具有一定的通用性。

使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

  1. abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?

不可以一起使用,但是可以和override一起使用。

  1. 请叙述属性与索引器的区别。

属性:它是存取类的字段,索引器:Indexer它是特殊的属性,用它可以使用户像访问数组一样访问类的成员。

  1. 请详述在dotnet中类(class)与结构(struct)的异同。

类class可以进行实例化,它是引用类型,内存分配在栈中,效率高,它有默认的构造函数,有析构函数可以使用 abstract 和 sealed, protected 修饰符。要用new进行初始化,

结构它是属于值类型,内存分配在堆中,效率低,它没有默认的构造函数,但是可以添加构造函数,没有析构函数没有 abstract 和 sealed(因为不能继承)不能有protected 修饰符 可以不使用new 初始化,但是可以在结构中初始化实例字段。

四.分析程序(每题5分,共25分)(此题不能调试,若发现调试,扣除分数)

  1. 写出程序的输出结果

class Class1 {

   private string str = "Class1.str";private int i = 0;static void StringConvert(string str)  {str = "string being converted.";}static void StringConvert(Class1 c)  {c.str = "string being converted.";}static void Add(int i)  {i++;}static void AddWithRef(ref int i)  {i++;}static void Main()  {int i1 = 10;int i2 = 20;string str = "str";Class1 c = new Class1();Add(i1);AddWithRef(ref i2);Add(c.i);StringConvert(str);       StringConvert(c);Console.WriteLine(i1);Console.WriteLine(i2);Console.WriteLine(c.i);Console.WriteLine(str);Console.WriteLine(c.str);}

}

10

21

0

str

string being converted

2.写出程序的输出结果

public abstract class A

{

    public A(){Console.WriteLine('A');}public virtual void Fun(){Console.WriteLine("A.Fun()");}

}

public class B: A

{

    public B(){Console.WriteLine('B');}public override void Fun(){Console.WriteLine("B.Fun()");}public static void Main(){A a = new B();a.Fun();}

}

解析:主函数 A a = new B();首先声明了一个A的对象a,但被赋给不同于A的对象B,在此期间分别调用了A类的构造函数和B类的构造函数,然后调用a的fun()函数,因为a的fun()函数是虚函数,被b的fun()的函数覆盖,所以实际执行的是b的fun().

答案:

A

B

B.Fun()

3.写出程序的输出结果:

public class A

{

    public virtual void Fun1(int i){Console.WriteLine(i);}public void Fun2(A a) {a.Fun1(1);Fun1(5);}

}

public class B : A

{

    public override void Fun1(int i)  {base.Fun1 (i + 1);}public static void Main() {B b = new B();A a = new A();b.Fun2(a);a.Fun2(b);       }

}

输出结果为:

2

5

1

6

(一个函数的执行必须在一个具体的对象中实现,如果函数明确告诉是哪个对象,则在改该对象下执行;如果没有,则在默认的对象下执行)

4.在下面的例子里
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=4;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{

x += 1;
Console.WriteLine(“x={0},y={1}”,x,y);

y += 1;
}
当使用B b = new B()创建的实例时,产生什么输出?b. PrintFields();结果是什么?

X=5,y=0

b. PrintFields 结果是x=6;y=1

  1. 下面的例子中

using System;
class A
{
public static int X;
static A()

{

X=B.Y+1;
}

}

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=2,Y=1

五.程序设计(每题7分,共28分)

1.请编程实现一个冒泡排序算法?

//比较法

using System;

using System.Collections.Generic;

using System.Text;

namespace test1

{

class Program{static void Main(string[] args){int[] Array ={ 6,18,12,23,19,28,30};Console.WriteLine("排序前的数组:");foreach(int n in Array){Console.Write(n+" ");}Console.WriteLine();for (int i = 1; i < Array.Length; i++) //控制趟数{for (int j = 0; j < Array.Length - i; j++){if (Array[j] > Array[j + 1]) //交换{int temp = Array[j]; Array[j] = Array[j + 1]; Array[j + 1] = temp;}}}//排序后Console.WriteLine("排序后的数组:");for (int n = 0; n < Array.Length; n++){Console.Write(Array[n] + " ");}Console.WriteLine();}}

}

  1. 编程程序实现委托,事件。

using System;

using System.Collections.Generic;

using System.Text;

namespace delegateDemo

{

class Program{static void Main(string[] args){Cat cat = new Cat();Mouse mouse = new Mouse();Master master = new Master();cat.Calling += new EventHandler(mouse.Escape);cat.Calling += new EventHandler(master.Wakened);cat.Call();}}public sealed class Cat  //猫类{public event EventHandler Calling;public void Call(){Console.WriteLine("猫开始叫了……");if(Calling!=null)              //检查事件是否被注册Calling(this,EventArgs.Empty);//调用事件注册的方法}}public sealed class Mouse //老鼠类{public void Escape(object sender, EventArgs e){Console.WriteLine("老鼠逃跑了...");}}public sealed class Master //主人{public void Wakened(object sender, EventArgs e){Console.WriteLine("主人惊醒了...");}}

}

  1. 写一个程序,语言不限,打印出100的阶乘(即123*…100)的精确数值结果(不能是浮点数)。如5的阶乘是1234*5=120。

using System;

using System.Collections.Generic;

using System.Text;

//,打印出100的阶乘(即123*…100)的精确数值结果(不能是浮点数)。如5的阶乘是1234*5=120

namespace shuzu

{

class Program{static void Main(string[] args){Console.WriteLine("请输入一个正数");int n = int.Parse(Console.ReadLine());Console.WriteLine("{0}的阶乘1*2*3*…*{1}={2}", n,n,Fn(n));}public static double Fn(int n){if (n==1){return 1;}else{return n * Fn(n - 1);}}}

}

  1. 写一个程序,语言不限,能将人民币金额从阿拉伯数字转换为大写汉字表示。例如,把1234.56转换为壹仟贰佰叁拾肆圆零伍角陆分。

using System;

using System.Collections.Generic;

using System.Text;

namespace ConsoleApplication1

{

class Program{static void Main(string[] args){Console.WriteLine("请输入数字:");string s = Console.ReadLine();Console.Write("转换后¥:");for (int i = 0; i < s.Length; i++){

//switch(Convert.ToInt32(Console.ReadLine()))

            switch (s[i] - 48){case 0:Console.Write("零");break;case 1:Console.Write("壹");break;case 2:Console.Write("贰");break;case 3:Console.Write("叁");break;case 4:Console.Write("肆");break;case 5:Console.Write("伍");break;case 6:Console.Write("陆");break;case 7:Console.Write("柒");break;case 8:Console.Write("捌");break;case 9:Console.Write("玖");break;case 10:Console.Write("拾");break;default:Console.Write("输入其他字符");break;}}Console.WriteLine();Console.Read();}}

}

六.附加题(12分)

一列数的规则如下: 1、1、2、3、5、8、13、21、34… 求第30位数是多少,用递归算法实现。(C#语言)

using System;

using System.Collections.Generic;

using System.Text;

// 一列数的规则如下: 1、1、2、3、5、8、13、21、34… 求第30位数是多少, 用递归算法实现

namespace rabbit

{

class Program{static void Main(string[] args){Console.WriteLine("请输入个正数:");int I= int.Parse(Console.ReadLine());Console.WriteLine("第{0}个数字是{1}", I, Fn(I));}static int Fn(int n){if ( n == 1 || n == 2 ){return 1;}else{return Fn(n - 1) + Fn(n - 2);}}}

}

1、权限控制方面问题:
从面向对象的角度讲,如果一个程序中,没有应用角色及角色组的话,那么这个程序是不合格的.一般来说,权限是由权限及流程角色组合而来的,如果仅有权限而没有角色,那么这个控制不灵活;如果仅有角色没有权限,那么这个控制不细致.
当然,用SESSION肯定是要的,但这个SESSION,应当只记录当前用户的个人信息,比如他的用户名.在需要判断的时候,根据他的用户名(唯一),至数据库中去取他的权限,或在类中编写权限/角色,根据此用户的用户号及当前模块号,计算当前用户是否对当前页面有操作权限.不过,如果把用户的权限也取出来放在SESSION中的话,这种做法一般仅在很小的网站中使用,稍大一点的系统,基本不允许这么做,而且也做不到

  1. PID是什么?在做系统的故障排除时如何使用它?
    PID是进程编号,在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过visual studio.net等ide将故障进程附加到进程中进行调试(debug)

  2. XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?
    答:我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.

4.为什么不提倡catch(Exception)?
答:原因可能有两点:1. try…catch在出现异常的时候影响性能 2.应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等

  1. Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?
    答:Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。

  2. Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。
    答:Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略

  3. JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?
    答:方法,道理很简单,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么

  4. a.Equals(b)和a == b一样吗?
    答:不一样。a.Equals(b)表示a与b一致, a==b表示a与b的值相等

  5. 在对象比较中,对象一致和对象相等分别是指什么?
    答:对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同

10.在.NET中如何实现深拷贝(deep copy)?
答:实现IClonable接口

11.请解释一下IClonable
答:IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是 Object.MemberWiseClone().
深度复制(Deep Copy)与浅表复制(Shadow Copy)的比较

<!–

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

–>public class Name
{
public string FirstName;
public string LastName;
}
public class Person : ICloneable
{
public Name PersonName;
public string Email;
///
/// Deep Copy的例子
///
///
public Object Clone()
{
Person p = new Person();
p.Email = this.Email;
p.PersonName = new Name();
p.PersonName.FirstName = this.PersonName.FirstName;
p.PersonName.LastName = this.PersonName.LastName;
return p;
}

public void ChangLastName(string lastName)
{
this.PersonName.LastName = lastName;
}

public static void Main()
{
Person p = new Person();
p.PersonName = new Name();
p.PersonName.LastName = ”san”;
p.PersonName.FirstName = ”zhang”;
p.Email = ”sanzhang@126.com”;
Person sameNamePerson = p.Clone() as Person;
sameNamePerson.ChangLastName(“clr_”);
Console.WriteLine(p.PersonName.LastName);
Console.WriteLine(sameNamePerson.PersonName.LastName);

Person samePerson = p.MemberwiseClone() as Person;
samePerson.ChangLastName(“Shadow”);

Console.WriteLine(p.PersonName.LastName);
Console.WriteLine(sameNamePerson.PersonName.LastName);

Console.Read();
}
}

12.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
答:switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

13.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。

14.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
答:都不能。

15.List, Set, Map是否继承自Collection接口?
答:List,Set是Map不是

16.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用还是equals()? 它们有何区别?
答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。equals()和方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

17.数组有没有length()这个方法? String有没有length()这个方法?
答:数组没有length()这个方法,有length的属性。String有有length()这个方法。

18.sleep()和 wait() 有什么区别?
答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

一.填空题
1.面向对象的语言具有(继承)性、(多态)性、(封装)性。

2.能用foreach遍历访问的对象需要实现 (IEnumberable)接口或声明(GetEnumberator)方法的类型。

3.列举ADO.net中的五个主要对象(Command)、(Connection)、(DataReader)、(DataSet)、(DataAdapter)。

4.C#中的三元运算符是__(?

.net软件开发工程师面试题精选相关推荐

  1. 十道腾讯软件开发工程师面试题

    本来在一加软件公司工作,三月初的时候无意中收到深圳腾讯云的电话(对方表明身份后,说看到我的简历,想和我聊聊.当时没有电面经验再加上也没有进来也没有投简历,爽快的答应聊就聊呗.上来就是技术问题,当时蒙了 ...

  2. .NET软件开发工程师面试题(上)

    1.简述区别:string str=null.string str="".string str=string.empty 答: string str = null; 定义了一个字符 ...

  3. Java 并发编程—— Exchanger 应用,java软件开发工程师面试题

    前面已经介绍 SyclicBarrier.CountDownLatch.Semaphore 三个并发编程中的工具类,还剩下最后一个 Exchanger.Exchanger(交换者)是一个用于线程间数据 ...

  4. C++软件开发工程师笔试题

    1.二层交换机能够识别()地址. A.MAC地址 B.域名 C.IP地址 D.UDP端口号 2.以下代码运行结果为 #include "stdio.h"class Base { p ...

  5. java软件开发工程师面试题_Java开发工程师常见面试题01

    Java 基础 1. JDK和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境. JRE:Java Run ...

  6. 小米2020校招软件开发工程师笔试题二

    https://blog.csdn.net/Yuudachi/article/details/104090132

  7. 小米2020校招软件开发工程师笔试题一

    1. 下列关于设计模式说法错误的是(B) A. 装饰器模式在实现过程中一般不会更改被封装对象的接口定义 B. 适配器模式以不改变被适配对象的接口定义为目的对其进行改造 C. 用饿汉方式实现的单例模式是 ...

  8. 【校招】C/C++软件开发工程师笔试题(1)

    目录 一.题目描述 二.C代码实现 三.C++代码实现 一.题目描述 给定一个整数数组arr,将这个数组中的值进行解码. 解码规则:将数组中的元素转换成对应的ASCII码,解码后能拼出"cs ...

  9. 软件开发工程师招聘笔试题面试题223套和招聘考察内容

    技术族职业发展通道\阶梯\标准(即招聘考核内容) (1) 通道 技术族分为软件研发.美术.质量管理.设计.技术支持五个职业发展通道,每个发展通道包含下列职位(具体内容请见表4-技术族发展通道职位列表) ...

最新文章

  1. UI5界面绘制的机制,以及老旧dom节点的清除机制
  2. python监控某个程序_写一个python的服务监控程序
  3. matlab 工具函数(一) —— 添加指定 SNR 的噪声
  4. ccs中如何插入字体
  5. USB VIDPID 表
  6. 网站COM组件调用失败解决办法
  7. 汽车故障检测仪计算机教程,道通MS诊断仪在线编程刷隐藏908SPRO汽车故障检测电脑...
  8. 怎么把java程序打包?java源代码打包方法
  9. PyCharm - Split Vertically Split Horizontally (垂直拆分窗口 水平拆分窗口)
  10. 克拉克松Clarkson Research情报网注册登录及进行数据查询(以世界造船厂分布为例)
  11. 市场热度持续提升!4D成像雷达进入「细分场景争夺战」
  12. img标签 src路径正确 但图片不显示
  13. CentOS 7 安装搜狗拼音输入法
  14. 一个学机械的中年人半年时间入门物联网嵌入式的历程
  15. 2K和XP下的CMD命令
  16. 黑苹果一些奇怪的事情
  17. 详解Android电量优化
  18. Unity延迟几秒执行一个方法小工具
  19. Flutter Icons图标库地址
  20. Freeline框架解析

热门文章

  1. 基于AOP和HashMap原理学习,开发Mysql分库分表路由组件!
  2. jfif怎么改成jpg,jfif转jpg方法
  3. Android Audio - 支持多应用同时录音_Android8.1修改方法
  4. 微信小程序点击换头像-图片从本地获取-tab选项卡-点击按钮出弹框
  5. 路径规划 | 图解LPA*算法(附ROS C++/Python/Matlab仿真)
  6. 社区发现算法1——LPA 算法群
  7. C#.NET 国密数字信封 民生银行
  8. JavaWeb-06 (项目案例3)
  9. 计算方法 matlab代码,计算方法及其MATLAB实现
  10. 2021电赛题目预测