学习啦>创业指南>职场>面试题>

C#习题大全

文桦分享

  C#是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT .NET平台的应用程序,MICROSOFT .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。C#使得C++程序员可以高效的开发程序,且因可调用由 C/C++ 编写的本机原生函数,因此绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。

  今天学习啦小编就与大家分享:C#习题大全!

C#习题

  1.String str=new String("a")和String str = "a"有什么区别?

  String str = "a"; 这个只是一个引用,内存中如果有“a"的话,str就指向它,如果没有才创建如后还用到"a"这个字符串的话并且是这样用: String str1 = "a"; String str2 = "a"; String str2 = "a"; 这4个变量都共享一个字符串"a" 而String str = new String("a");是根据"a"这个String对象再次构造一个String对象,将新构造出来的String对象的引用赋给str

  2.判断字符串变量str是否为空的一下三种方法哪个性能更优

  a、str=="";b、str==String.Empty;c、str.Length==0;?答案是c;

  3.string与String的区别

  string、int是C#定义的类型,而String、Int32是.net类型即是CTS类型; string 是 .NET 框架中 System.String 的别名。string在编译的时候会转化为String类

  4.虚方法(virtual )和抽象方法(abstract)的区别?

  1:抽象方法仅有声明,而没有任何实现,如abstract someMethod();,虚方法却不能如此

  virtual用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。

  2:子类继承父类,可以对父类中的虚方法进行重写、覆盖、不处理三种处理(见5),对抽象方法却必须实现

  5.子类对父类中虚方法的处理有重写(override)和覆盖(new),请说明它们的区别?

  有父类ParentClass和子类ChildClass、以及父类的虚方法VirtualMethod。有如下程序段:

  ParentClass pc = new ChildClass();pc.VirtualMethod(...);

  如果子类是重写(override)父类的VirtualMethod,则上面的第二行语句将调用子类的该方法

  如果子类是覆盖(new)父类的VirtualMethod,则上面的第二行语句将调用父类的该方法

  6.抽象类(abstract)和接口(interface)的区别

  抽象类可以有自己的实现,接口却仅有声明,可以有自己的静态数据字段;

  java和C#中可以实现多个接口,却只能继承一个抽象类(或者非抽象类)(单继承,和c++的多继承不同);

  7.填空:

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

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

  (3)列举ADO.net中的五个主要对象

  Connection,Command,DataReader,DataAdapter,DataSet

  connection 连接对象

  command 命令对象,指示要执行的命令和存储过程!

  datareader是一个向前的只读的数据流。

  dataadapter是功能强大的适陪器,支持增删改查的功能

  dataset是一个数据级对象,相当与内存中的一张表或多张表

  8.不定项选择:

  (1) 以下叙述正确的是:BC

  A. 接口中可以有虚方法。 B. 一个类可以实现多个接口。

  C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。

  (2) 从数据库读取记录,你可能用到的方法有: BCD

  A. ExecuteNonQuery B. ExecuteScalar C. Fill D. ExecuteReader

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

  A.Private:关键字是一个成员访问修饰符。私有访问是允许的最低访问级别。私有成员只有在声明它们的类和结构体中才是可访问的, 同一体中的嵌套类型也可以访问那些私有成员

  B.Protected 关键字是一个成员访问修饰符。受保护成员在它的类中可访问并且可由派生类访问。有关 protected 与其他访问修饰符的比较,请参见可访问性级别,只有在通过派生类类型发生访问时,基类的受保护成员在派生类中才是可访问的

  C.Internal关键字是类型和类型成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的

  D Protected Internal 它可以看作是Protected与Internal的并集,意思是:如果是继承关系,无论在不在同一程序集里都能访问;如果不是继承关系,那么只能在同一程序集内访问。

  E.Public具有最高级别的访问权限,对访问成员没有限制。

  10.写出一条Sql语句:取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键, 注意:ID

  可能不是连续的。)

  11.列举ASP.NET 页面之间传递值的几种方式。

  QueryString,Session和Server.Transfer

  12.写出程序的输出结果

  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);

  }

  }

  13.写出程序的输出结果

  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 new void Fun()

  {

  Console.WriteLine("B.Fun()");

  }

  public static void Main()

  {

  A a = new B();

  a.Fun();

  }

  }

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

  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();

  a.Fun2(b);

  b.Fun2(a);

  }

  }

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

  16.程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)

  要求: 1.要有联动性,老鼠和主人的行为是被动的。2.考虑可扩展性,猫的叫声可能引起其他联动效应。

  参考答案

  1.(1) 继承性、封装性、多态性。 (2) IEnumerable 、 GetEnumerator (3) 对ADO.net的了解

  2. (1) B、C (考对接口的理解) (2) B、C、D (考查对ADO.net的熟练程度)

  3. private : 私有成员, 在类的内部才可以访问。protected : 保护成员,该类内部和继承类中可以访问。public : 公共成员,完全公开,没有访问限制。internal: 在同一命名空间内可以访问。

  4. 解1: select top 10 * from A where id not in (select top 30 id from A)

  解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)

  5. 1.使用QueryString, 如....id=1; response. Redirect()2.使用Session变量3.使用Server.Transfer

  6. (考查值引用和对象引用)

  10

  21

  0

  Str

  string being converted.

  7. A B

  A.Fun()

  (考查在继承类中构造函数, 以及new 方法, )

  8. 2

  5

  1

  6

  评分标准: 答对一点得2分,两点得5分,3点得7分。全对得10分。

  9.

  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);

  }

  }

  评分标准: 写出return Foo(i -1) + Foo(i - 2); 得5分。

  写出if(i > 0 && i <= 2) return 1; 得5分。

  方法参数过多需要扣分(扣除分数 = 参数个数 - 1)

  不用递归算法扣5分

  (递归算法在树结构建立等方面比较常用)

  10.要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法。2. 对老鼠和主人进行抽象

  评分标准: <1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分)

  <2>从Mouse和Master中提取抽象(5分)

  <3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分)

  public interface Observer

  {

  void Response(); //观察者的响应,如是老鼠见到猫的反映

  }

  public interface Subject

  {

  void AimAt(Observer obs); //针对哪些观察者,这里指猫的要扑捉的对象---老鼠

  }

  public class Mouse : Observer

  {

  private string name;

  public Mouse(string name, Subject subj)

  {

  this.name = name;

  subj.AimAt(this);

  }

  public void Response()

  {

  Console.WriteLine(name + " attempt to escape!");

  }

  }

  public class Master : Observer

  {

  public Master(Subject subj)

  {

  subj.AimAt(this);

  }

  public void Response()

  {

  Console.WriteLine("Host waken!");

  }

  }

  public class Cat : Subject

  {

  private ArrayList observers;

  public Cat()

  {

  this.observers = new ArrayList();

  }

  public void AimAt(Observer obs)

  {

  this.observers.Add(obs);

  }

  public void Cry()

  {

  Console.WriteLine("Cat cryed!");

  foreach (Observer obs in this.observers)

  {

  obs.Response();

  }

  }

  }

  class MainClass

  {

  static void Main(string[] args)

  {

  Cat cat = new Cat();

  Mouse mouse1 = new Mouse("mouse1", cat);

  Mouse mouse2 = new Mouse("mouse2", cat);

  Master master = new Master(cat);

  cat.Cry();

  }

  }

  //---------------------------------------------------------------------------------------------设计方法二: 使用event -- delegate设计..

  public delegate void SubEventHandler();

  public abstract class Subject

  {

  public event SubEventHandler SubEvent;

  protected void FireAway()

  {

  if (this.SubEvent != null)

  this.SubEvent();

  }

  }

  public class Cat : Subject

  {

  public void Cry()

  {

  Console.WriteLine("cat cryed.");

  this.FireAway();

  }

  }

  public abstract class Observer

  {

  public Observer(Subject sub)

  {

  sub.SubEvent += new SubEventHandler(Response);

  }

  public abstract void Response();

  }

  public class Mouse : Observer

  {

  private string name;

  public Mouse(string name, Subject sub) : base(sub)

  {

  this.name = name;

  }

  public override void Response()

  {

  Console.WriteLine(name + " attempt to escape!");

  }

  }

  public class Master : Observer

  {

  public Master(Subject sub) : base(sub){}

  public override void Response()

  {

  Console.WriteLine("host waken");

  }

  }

  class Class1

  {

  static void Main(string[] args)

  {

  Cat cat = new Cat();

  Mouse mouse1 = new Mouse("mouse1", cat);

  Mouse mouse2 = new Mouse("mouse2", cat);

  Master master = new Master(cat);

  cat.Cry();

  }

  }

  18.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.

288037