1..NET框架包括【公共语言运行库CLR】和.NET类库。
2.为便于管理多个项目,在https://www.doczj.com/doc/0416007821.html,集成环境中引入例如【解决方案资源管理器】,用来对企业级解决方案涉及的多个项目进行管理。
3.C#是作为【Visual J++】语言的替代品种出现的。
4.要使lable控件显示给定的文字“您好。”,应在设计状态下设置它的【Text】属性值。
5.C#要求程序中的每个元素都要属于一个【类】,
6.在C#程序中,程序的执行总是从【Main()】方法开始的。
7.在C#中,进行注释有两种方法:使用“//”和使用“/* */”符号对,其中【//】只能进行单行注释。
8.要在控制台程序运行时输入信息,可使用Console类的【Read()】方法。
1.在C#中,使用【const】关键字来声明符号常量。
2.在C#中,表达式Math.Pow(2,-2)的值是【1/4 】。
3.为计算表达式e x+y的值,应使用的C#语言的表达式是【Exp(x+y) 】。
4.C#语言规定,变量在使用之前必须先【先定义(声明)后引用】
5.下列程序完成的功能是:从键盘上输入一个直角三角形的斜边长度和一个角的度数,计算出另两条直角边的长度并输出。
请填空。
using System;
class Program
{ public static void Main(string[] args)
{ double a, b, c, d, jd;
c= Convert.Tosingle(Console.ReadLine()); //输入斜边的长度
jd=Convert.Tosingle(Console.ReadLine()); //输入角的度数
d=【jd 】;
a=c*Math.Sin(d);
b=【c*Math.Cos(d)】;
Console.WriteLine(“a={0},b={1}”,a,b); //输出两直角边的值
6.设x为int型变量,请写出描述“x是奇数”的C#语言表达式【X%2!=0】。
7.请写出描述“-10≤x≤10”的C#语言表达式【x>=-10&&x<=10】。
8.在代码中明确表示将某种数据类型转换为另一种数据类型称为【显示转换】。
1.在switch语句中,在每个分支的最后应有一条【break】语句。
2.在C#中,实现循环的语句主要有【while】、do……while和【for】语句。
3.在循环执行过程中,希望当某个条件满足时强行退出循环,应使用【break】语句。
4.continue语句的作用是【结束本次循环的执行,开始下一个循环】。
5.下列程序完成的功能是求出所有的水仙花数。(所谓水仙花数是指这样的数:该数是三位数,其各位数字的立方和等于该数。例如:153=13+53+33,所以153是一个水仙花数。)请填空。
using System;
class Program
{ public static void Main(string[] args)
{ int a, b, c, t;
for(i=100;i<=【999 】; i++)
{ t=i;
a=t%10; t=t/10; b=t%10; c=t/10;
if(【i==a*a*a+b*b*b+c*c*c 】)
Console.WriteLine(“i={0}”,i);
6.WriteLine()方法和Write()方法的区别是【是否逐行显示】。
7.下列程序的功能是:输出100以内能被3整除且个位数为6的所有整数。请填空。
using System;
class Program
{ public static void Main(string[] args)
{ int i, j;
for(i=100;【】; i++)
{ j=i*10+6;
if(【j%3==0 】) continue;
Console.WriteLine(“{0} ”, j);
(老师加)7.下列程序的功能是:输出200以内的所有素数。请填空。
using System;
class Program
{ public bool sushu(int x)
{ k=Convert.ToInt32(Math.Sqrt(x))
for(i=2;i<=k;i++)
if (x%i==0) return false;
【break】;
}
public static void Main(string[] args)
{ int i, j;
for(i=3;i<=200; i=i+2)
{ i f(【i%2=1】)
Console.WriteLine(“{0} ”,i);
8.下列程序的功能是:产生100个两位随机正整数,求这些数中所有能被3整除的数的和,以及所有不能被3整除的数的各位数字和。请填空。
static void Main(string[] args)
{ float sum1=0,sum2=0;
int i,num;
Random randObj1=new Random();
for(i=1;i<=100;i++)
{ n um=【randObj1.Next(10,100) 】;
if(num%3==0)
{sum1=sum1+num;【continue; 】} sum2=sum2+num%10;
sum2=sum2+num/10;
}
Console.WriteLine("能被3整除的数的和为:{0}",sum1);
Console.WriteLine("不能被3整除的所有数的各位数字和为:{0}",sum2);
Console.Read ();
四
1.数组定义与赋初值语句如下:int[] a={1,2,3,4,5};
则a[2]的值为【3】。
2.下列程序段执行后,a[4]的值为【4 】。
int[] a={1,2,3,4,5};
a[4]=a[a[2]];
3.下列数组定义语句中:int[] a=new int[3]; ,定义的数组a占的字节数为【12】。
4.下列数组定义语句中,数组将在内存中占用【160 】个字节。
double[,] d=new[4.5];
5.要定义一个3行4列的单精度二维数组f,使用的定义语句为【float[,] f=newfloat [3,4]; 】。
6.要定义一个int型的参差数组a,数组有两行,第一行一个元素,第二行两个元素并赋初值3和4,使用的语句如下,请填空。
int[][] a=【new int[2][] 】;
a[0]=【new int[1] 】;
a[1]=【new int[2]{3,4} 】;
五
1.C#中的字符串有两类:规则字符串和逐字字符串,定义逐字字符串时,应在其前面加上【@ 】号。
2.下列程序的执行结果是【False】。
class Program
{ public static void Main(string[] args)
{ string str1,str2;
str1=”abdde”; str2=”abcdefg”;
Console.WriteLine(“{0}”,str1==str2);
}
}
3.已知str的值为”abcdefgh”,则表达式str.Substring(1,3)的值为【bcd 】。
4.若要从字符串str的第3个字符开始取5个字符作为一个子串赋给sstr,可以使用语句【str.Substring(2,5) 】实现。5.以下程序的执行结果是【 1 2 3 】。
class Program
{ public static void Main(string[] args)
{ string str=”1a2b3c”;
int i;
for(i=0;i if(str[i]>=’0’&& str[i]<=’9’) Console.WriteLine(str[i]); } } 6.所谓装箱就是将一个【值类型】隐式或显示地转换成一个object类型。所谓拆箱就是将一个【对象类型】显式地转换成一个值类型。 7.声明一个委托类型MyFun1,该委托类型可以与无参且返回值为int类型的方法相关联,则该声明语句应为【delegate int MyFun1(int n)】。 六 1.【类】是面向对象编程的基础模块,在C#中,所有的内容都被封装在其中。 2.声明类之后,通过new创建【对象】,它是一个引用类型的变量。 3.静态字段是用【static】修饰符声明的字段,无论存在多少个类实例,它们都共享一个字段副本。 1.定义方法时使用的参数是【形参】,调用方法时使用的参数是【实参】。 2.数据类型说明符用来说明方法返回值的类型,如果没有返回值,则类型说明符应为【void 】。 3.下列方法的作用是求两个数的较大数,并把较大数作为返回值,请填空。 float max_v(【f loat b】) { float max; max=a; if(max 【return(max)】; 4.在调用方法时,要使参数按引用方式进行传递,需要使用关键字【ref】。 5. 在调用方法时,要使参数按输出方式进行传递,需要使用关键字【out】,此时并不要求实参变量已经初始化。 6.在类的成员声明时,若使用了【protacted】修饰符,则该成员只能在该类或其派生类中进行访问。 7.类的静态成员属于【类】所有,非静态成员属于类的实例所有。 8.已知某类的类名为ClassA,则该类的析构函数名为【~classA(){}】。 9.C#方法的参数有四种,分别是:值参数(对应值传递)、引用参数(对应地址传递)、输出参数和参数数组,在形参中声明参数数组时应使用【params】关键字。 10.要给属性对应的数据成员赋值,通常要使用set访问器,set访问器始终使用【value】来设置属性的值。 11.在C#中有两种多态性:编译时的多态性和运行时的多态性。编译时的多态性是通过【方法重载】实现的,运行时的多态性是通过继承和【虚函数】来实现的。 12.在声明类时,在类名前使用【abstract】修饰符,则声明的类只能作为其他类的基类,不能被实例化。 13.在声明类时,在类名前使用【sealed】修饰符,则声明的类不能作为其他类的基类,不能再派生新的类。 17.下列程序的运行结果是【3,5 】。 class program { static void Func(int a,out int x,out int y) { x=a/10; y=a%10; } static void Main() { int m=35; int a,b; Func(m,out a,out b); Console.WriteLine("{0},{1}",a,b); 18.下列程序的运行结果是【AA CC DD DD 】。 class A { p ublic void F1() { Console.Write("AA "); } public virtual void F2() { Console.Write("BB "); } } class B : A { new public void F1() { Console.Write("CC "); } public override void F2() { Console.Write("DD "); } } class Test { static void Main() { B b = new B(); A a = b; a.F1(); b.F1(); a.F2(); b.F2(); Console.Read(); 七 1.与try块相关的【catch】块将一定被执行。 2.异常对象均是从【Exception】类派生而来的。 3.【try】块封装了可能引发异常的代码。 4.如果方法Convert.ToInt32的参数不是一个有效的整数值,可以抛出一个【FormatException】异常。 5.在整型运算中发生算术溢出时,为了强制发生异常,使用运算符【checked】。 6.数组下标越界时产生的异常是【System.IndexOutOfRangeException】类型的异常。 7.Exception类有两个重要的属性:【Message】属性包含对异常原因的描述信息。 8.在catch语句中列举异常类型时,DivideByZeroException异常应列在Exception异常的【前面】。(填前面或后面) 9.常用的异常处理关键字包括【try】、【catch 】、【finally 】、【throw 】。 八 1.如果TextBox控件中显示的文本发生了变化将会发生【TextChanged】事件。 2.使用NumericUpDown控件时,可通过它的【Increment】属性来获取或设置单击向上或向下按钮时,控件递增或递减的值。 3.当复选框能够显示三种状态时,可通过它的【ThreesState】属性来设置或返回复选框的状态。 4.要使ListBox控件能够显示多列,应把它的【MultiColumn】属性值设置为True。 5.在允许ListBox控件多选的情况下,可使用它的【SelectedIndex】属性来访问选中的列表项。 6.要使PictureBox中显示的图片刚好填满整个图片框,应把它的【SizeMode】属性值设置为StretchImage。 7.Timer控件的【Interval】属性用来设置定时器两次Tick事件发生的时间间隔。 8.滚动条、TrackBar、ProgressBar等控件的当前位置值均可通过【Value】属性来得到。 9.C#中所有的类都继承【Object 】类,所有的窗体都继承【Control 】类。 1.OpenFileDialoge对话框执行后,用户选择文件的文件名保存在它的【FileName】属性中。 2.如果希望在OpenFileDialoge对话框控件中选择多个文件,应把它的【MultiSelect】属性设置为True。 3.要显示Visual C# 2008的标准对话框,需要调用标准对话框的【ShowDialog】方法。 4.FontDialog控件的【Showeffect】属性用来获取或设置一个值,该值指示对话框是否包含允许用户指定删除线、下划线和文本颜色选项的控件。 5.若想让菜单标题显示为“工具[T]”,应把菜单项的Text属性值设置为【工具[&F]】。 6.显示标准对话框后,如果用户在对话框中单击【确定】按钮,则返回值为【DialogResult.OK】。 7.若要把窗体设置为MDI父窗体,应把它的【IsMdiContainer】属性设置为True。 8.要制作工具栏,可以使用Visual C# 2008的【ToolStrip】控件。 9.标准窗体应用程序有3种类型:【对话框应用程序】、【SDI】和【MDI】。 10.字体对话框类和打开文件对话框类分别是【FontDialog】和【OpenFileDialog】。 11.控件中用于设置弹出式对话框的属性是【title】。 12.菜单可以分为两种形式:【主菜单】和【弹出式菜单】。 12.通过设置菜单项的【ShortcutKeys】属性,可以为菜单添加快捷键。 13.用户在字体对话框中选定的字体可以通过【Font】属性获得,选中的字体颜色可以通过【Color】属性获得。 14.如果已为项目添加了一个名称为child的子窗体,要将此窗体显示出来,则可以使用下面的代码段,请将其补充完整。 child c=new child();【c.MdiParent = this;】c.show(); 1.Connection对象负责建立与数据库的连接,它使用【open】方法建立连接,使用完毕后,一定要用【close 】方法关闭连接。 2.Connection对象的主要属性是【ConnectionString】,用于设置连接字符串。 3.【DataReader】是一个简单数据集,用于从数据源中检索只读、只向前的数据流。 4.一个【DataSet】对象包含一组DataTable对象和DataRelation对象,其中每个DataTable对象都有DataColumn、DataRow 组成。 5.在https://www.doczj.com/doc/0416007821.html,中,从数据源向DataSet中填充数据用DataAdapter对象的【Fill 】方法,从DataSet中向数据源更新数据用DataAdapter对象的【update】方法, 但在调用该方法之前要先使用【CommandBuilder 】对象设置更新需要的相关命令。6.【DataAdapter】是DataSet对象和数据源之间的一个桥梁,用于从数据源中检索数据、填充DataSet对象中的表及将DataSet 对象做出的更改提交回数据源。 7.可以将数据源中的数据与控件中的属性关联起来,这称为【数据绑定】。 8.OleDb数据提供程序类位于【System.Data.OleDb】命名空间。 9.DataSet可以看作一个【内存】中的数据库。 10.DataReader对象是通过Command对象的【ExecuteReader】方法生成的。 三、 1.请写出下列代码段的运行结果,并说明原因100。 int i=1,n=-1; if(i==0); n=100; Console.Write(n); (答案)100 2.请写出下列代码段的运行结果,并说明原因x=0,y=-1。 int x=0; int y=-1; if(x!=0) if(x>0) y=1; else y=0; (答案)x=0,y=-1 老师加3.下列程序的运行结果是【i=11,s=12 】。 class Program { public static void Main(string[] args) { int i=0,s=1; do { s/=s+1; i++; }while(i<=10); Console.WriteLine(“i={0},s={1}”,i,s); 4.下列程序的运行结果是【m=51,n=50 】。 class Program { public static void Main(string[] args) { int i=0,m=0,n=0; while(i<=100) { if(i%2==0) m+=1; else n=n+1; i++; Console.WriteLine(“m={0},n={1}”,m,n); 四、 1.下面程序的运行结果是【1 4 7 10 13 16 19 22 25 28】。 using System; class Program { public static void Main(string[] args) { const int SIZE=10; int[] y={1,2,3,4,5,6,7,8,9,10}; int[] z=new int[SIZE]; for (int i = 0; i < z.Length; i++) { z[i] = i * 2 + y[i]; Console.Write("{0} ", z[i]); } Console.Read(); 2.下面程序的运行结果是 【1 1 1 1 2 1 1 3 3 1 1 4 6 4 1】。 static void Main(string[] args) { const int M = 5; int[][] yhsj = new int[M][]; int i, j; for (i = 0; i < M; i++) yhsj[i] = new int[i + 1]; for (i = 0; i < M; i++) { yhsj[i][0] = 1; yhsj[i][i] = 1; } for (i = 2; i < M; i++) for (j = 1; j < i; j++) yhsj[i][j] = yhsj[i - 1][j - 1] + yhsj[i - 1][j]; for (i = 0; i < M; i++) { for (j = 0; j <= i; j++) Console.Write("{0} ", yhsj[i][j]); Console.WriteLine(); Console.Read(); 3.下面程序的运行结果是【string str1=星期一\星期二\星期三,string str2=星期一\\星期二\\星期三】。 class Program { public static void Main(string[] args) { string str1="星期一\\星期二\\星期三"; string str2=@"星期一\\星期二\\星期三"; Console.WriteLine("str1={0}",str1); Console.WriteLine("str2={0}",str2); (说明:下列程序中部分下划线的代码有错误,请将有错误的部分改正过来,并说明原因) 1.class A { A(){ } } A a=new A(); 答:“A(){ }”应改为“public A(){ }”。因为在默认修饰符的情况下,类中的成员被默认为私有成员,因此在用A创建a时试图调用此构造函数,会因此构造函数为私有成员而拒绝访问。 2.class A { public A(int x){ } } class B:A { public B(int x){ } } 答:“public B(int x){ }”应改为“public B(int x):base(x){ }”。因为基类A中没有无参数的构造函数。 3.class A { public int x=100; } class B:A { new public int x; public B(int y, int z){ x=y; base.x=z; } public int getx1(){ return base.x; } public int getx2(){ return x; } 执行下面的语句后: B b=new B(3,6); int n=b.getx1(); int m=b.getx2(); n和m的值分别为【6】和【3】。 4.class A { public static int x=100; public int y=200; } class Program { static void Main(string[] args) { A a=new A(); a.x=10; a.y=20; 答:“a.x=10;”应改为“A.x=10;”。因为x是类A中的静态成员。 5.class A { A(){ } void A(){ } private A(int x){ } private A(int y){ } 答:“void A(){ }”应改为“A(){}”,因为构造函数不能带任何返回类型修饰符。“private A(int x){ }”和“private A(int y){ }” 实际上是同一个构造函数,应删除其中一个。 6.interface I { int x; public void f(int x); void g(int x); int h(int x){ return 1; } } class A:I { public void f(int x){ } public int h(int x){ } 答:“int x;”应予以删除,因为接口中不允许存在成员变量。“public void f(int x);”中的修饰符“public”应予以删除,因为接口的方法前不允许存在任何修饰符;“int h(int x){ return 1; }”应改为“int h(int x);”,因为不能在接口声明的函数中编写实现代码;应该在类A中添加函数“void g(int x);”的实现代码。 7.class A{ } class B{ } class C: A, B { } 答:必须将“class C:A,B”中的“A”或“B”其中之一去掉,因为C#中不允许类进行多重继承。 8.class A { int f(){ return 1; } void f(){ } void g(int x){ } void g(int y){ } 答:类A中试图重载函数f()和函数g(),但函数的重载是通过定义不同的参数个数和类型来实现的,其返回类型不能说明函数的重载特性,因此应删除其中的一个f()函数;类似的原因,函数g()中的形参名不同也不能说明函数的重载特性,实际上这两个g()函数是一样的,因此也需去掉其中之一。 9.class A { protected static void f(){ } protected void g(){ } } class B:A { new public static void f() { } new public void g(){ } public void h() { base.f(); base.g(); f(); g(); 答:“base.f();”应改为“A.f();”,原因是类A中的方法“f()”是静态方法,它不能被实例化,只能通过类名来访问。七、 填空题和改错题 1.对于下列代码段,执行后输出结果是【】。 int n,m; int[] a=new int[5]; n=10; m=10; try { for(int i=0; i<=a.Length; i++) a[i]=i; n=1/(n-m); } catch(DivideByZeroException e1) { Console.WriteLine(“产生零除异常!”); } catch(IndexOutOfRangeException e2) { Console.WriteLine(“产生数组访问越界异常!”); } 答:输出“产生数组访问越界异常!”。 2.下列代码段中试图用try-catch-catch结构捕获和处理异常,其中有的地方是错误的,请将错误的地方纠正过来。 int m; int[] a=new int[5]; n=10; m=10; try { m=int.Parse(“2000$”); for(int i=0; i<=a.Length; i++) a[i]=i; catch(Exception e1) { Console.WriteLine(“产生异常:{0}”,e1.Message); } catch(IndexOutOfRangeException e2) { Console.WriteLine(“产生异常:{0}”,e2.Message); } 答:需要将两个catch块的位置顺序对调过来。 3.对于下列代码段,执行后输出结果是【】。 int n,m; n=10; m=10; try { n=1/(n-m); } catch(Exception e) { Console.WriteLine(“产生零除异常!”); return; } finally { Console.WriteLine(“在执行finally块中的语句…”); } 答:输出结果如下: 产生零除异常! 在执行finally块中的语句… 4.对于下面程序: using system namespace ThrowtException class testException { public void g() { try { int n=Convert.ToInt16(“200$”); } catch(Exception e) { throw new Exception(“产生异常!”); } class Program { static void Main(string[] args) { testException te=new testException(); try { te.g(); } catch(Exception ex) { Console.WriteLine(ex.InnerException.Message); } 程序中有的地方在运行时会产生没有被捕获的异常,应该如何纠正以保证程序的稳定性?为什么? 答:类testException中在抛出异常时并没有将捕获到的异常“嵌入”新创建的异常中,因而导致ex.InnerException属性值为null,从而导致下列语句产生新的异常。 Console.WriteLine(ex.InnerException.Message); 一种纠正方法是,将下列语句: throw new Exception(“产生异常!”); 改为:throw new Exception(“产生异常!”,e); 5.对于下面定义的类A: class A { public void g() { try { int n=Convert.ToInt16(“200$”); } catch(Exception e) 执行下列语句时是否会出现异常?为什么? A a=new A(); a.g(); 答:不会出现异常,因为在类A的方法g()中虽然捕获了一个异常,但捕获后并没有对异常进行处理。 6.阅读下列程序,写出程序的运行结果。 using system namespace ThrowtException class myException: Exception { public myException(string ms):base(ms){ } public myException(string ms, Exception e):base(ms,e){ } } class A { public void f() { int n,m=0; if(m==0) throw new myException("在函数f()中抛出零除异常!") else n=1/m; class B { public void g() { try { A a=new A(); a.f(); } catch(myException e) { throw new myException("在函数g()中抛出的异常!",e); } class Program { static void Main(string[] args) { B b=new B(); try { b.g(); } catch(myException e) { Console.WriteLine(e.Message); Console.WriteLine(e.InnerException.Message); 答:程序的输出结果如下: 在函数g()中抛出的异常!在函数f()中抛出零除异常! 一、 1.C#语言的特点是什么? 语法简洁、支持跨平台、完全的面向对象程序设计功能、强大的Web应用支持、灵活性和兼容性 对XML的高度支持、快速应用开发功能 2.说明Visual https://www.doczj.com/doc/0416007821.html,、.NET Framework和C#之间的联系。 Visual https://www.doczj.com/doc/0416007821.html,的核心是.NET Framework,而C#是.NET的一个开发工具 3.Visual Studio 2008包含哪几种开发语言? Visual Basic、Visual C++和新的Visual C#等 4.控制台应用程序有哪些输入输出方法? Console.ReadLine();Console.WriteLine(); 5.简述命名空间的作用。 命名空间(namespace)是组织类的一种机制。通过命名空间可以将系统中的大量类库,有序地组织起来,使得类更容易被使用和管理。 6.什么是解决方案?什么是项目?解决方案与项目有什么关系? 解决方案是管理项目的管理器。项目可以视为编译后的一个可执行单元,可以是应用程序、动态链接库等。它们之间是管理与被管理的关系。二、 1.什么是字符类型和字符串类型?两者有何区别和联系? 字符常量是用单括号括起来的单个字符,字符串常量是用一对双引号引起来的零个或者多个字符序列。字符串和字符常量储存格式不同。字符串储存时,系统会自动在字符串的末尾加一个字符串结束的表示,即转义字符 3.变量与常量有何区别? 常量中字面常量可以直接应用,而符号常量必须先声明。变量必须先定义(声明)后引用,变量修饰符中有static。 4.什么是数据类型转换?有哪几种方法? 将不同数据类型的字符进行相互转化。Parse方法、ToString()方法、Convert类的共享方法 6.除(/)运算对整型数据和浮点型数据有何不同? 对于“/”运算符,若运算对象中有实数,则运算结果为双精度数,若运算对象均为整数,则运算结果为整数。如:3.0/2的值为1.5,3/2的结果为整数1 8.说明C#值类型与引用类型数据的区别。 引用类型可以派生出新的类型,而值类型不能;引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型);引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值 9.什么是装箱和拆箱? 所谓装箱就是将一个值隐式或显示地转换成一个object类型。所谓拆箱就是将一个object显式地转换成一个值类型。 六、 1.简述类和对象的关系。 将数据及处理这些数据的操作都封装到一个称为类的数据结构中。 类是面向对象程序设计的核心,是对具有相同属性与行为的一组事物的抽象描述。 利用类可以把数据和对数据所做的操作组合成一个整体,实现对数据的封装和隐藏。 在程序中使用的是类的实例——对象。 对象是代码与数据的集合,是封装好的一个整体,具有一定的功能。 2.简述面向对象的基本特征。 封装性将描述对象的数据及处理这些数据的代码组装在一起,形成一个不可分割的独立单位(类),并尽可能地隐藏对象的内部细节,只保留有限的对外接口使之与外界发生联系。 继承性就是指不需要编写相同的代码,一个类(子类)可以从另一个类(基类)中继承其全部属性和方法。 多态性所谓多态性就是指同一个名字可以代表不同、但相似的功能。程序运行时,面向对象的语言会自动判断对象的派生类型,并调用相应的方法。 3.类的声明格式中包含哪些部分?各有什么意义? 格式: [访问修饰符] class 类名[:基类类名] { 成员定义列表; } 访问修饰符的作用是对类的数据成员进行保护,提高数据的安全性。 “基类类名”用来定义派生该类的基类。隐含为object “成员定义列表”声明该类包含的成员,如字段、属性、方法等。 4.什么是实例方法?什么是静态方法? 类的成员又可以分成静态成员和非静态成员。在声明成员时,如果在语句前加上static保留字,则该成员是静态成员。如果没有static保留字,则成员是非静态成员(也称实例成员)。静态成员属于类所有,又称共享成员非静态成员属于类的实例所有,又称实例成员。访问静态成员只能通过类名来进行。访问非静态成员只能通过类的实例——对象来进行。 5.类可以使用哪些修饰符?各代表什么含义? Public、protected、private、internal、new、abstract、sealed 6.简述构造函数和析构函数的作用。 构造函数:用类创建对象自动执行。构造函数仅被执行一次,它通常用于对成员变量进行初始化。 析构函数:在对象被撤销(从内存中消除)时自动执行。析构函数也仅仅执行一次,通常用于对象被销毁前的“扫尾”工作。 7.什么是类的继承?怎样定义派生类? 是面向对象语言的基本特征,是实现代码复用的手段。 继承是指一个类可以继承另一个类中的相关成员,被继承的类称为基类、超类或父类,继承而形成的类称为派生类或子类。 访问修饰符class 派生类类名:基类类名 { 成员声明列表; } 8.简述创建派生类时,构造函数的调用。 如果基类中定义了带参数的一个或者多个构造函数,则派生类中也必须定义至少一个构造函数,且派生类中的构造函数都必须通过base()函数“调用”基类中的某一个构造函数。 传递给基类构造函数的“实参列表”通常包含在派生类构造函数的“形参列表”中。 9.怎样定义基类虚方法,并在派生类中重写基类虚方法? 基类中虚方法的定义: virtual 方法名([参数列表]) { 语句序列} 派生类中重写方法的定义: override 方法名([参数列表]) { 语句序列} 派生类中重写方法的名称、参数个数、类型以及返回值类型必须和基类中的虚拟方法一致 虚拟方法不能声明为静态的。 virtual不能和private一起使用,即虚拟方法不能是私有的。 10.抽象方法和虚方法有什么异同? 虚方法必须有实现部分,并为派生类提供了覆盖该方法的选项; 抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。 抽象方法只能在抽象类中声明,抽象方法必须在派生类中重写; 虚方法不是也不必要重写。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。抽象方法不能声明方法实体,而虚方法可以包含抽象方法的类不能实例化,而包含虚方法的类可以实例化! 11.什么是抽象类?它有什么特点?它和接口有何异同? 在声明类时,在类名前使用abstract修饰符则表示该类为抽象类。 抽象类不能被实例化,只能作为其他类的基类。 抽象类可以包含抽象成员(有abstract 修饰符的成员)和非抽象成员。 必须在派生类中实现抽象类的每一个抽象方法,而且实现的方法必须和抽象类中指定的方法一样(即参数个数、类型、返回值完全相同)。12.什么是方法重载?重载的方法有何特点? 方法重载是指同样的一个方法名有多种不同的实现方法。 方法重载的实施是在一个类中两次或多次定义同名的方法,但每个方法的参数类型或个数不同,从而便于用户在调用方法时系统能够自动识别应调用的方法。 仅返回值类型不同的同名函数以及仅参数名不同的同名函数都不是方法重载。 静态成员方法不能重载。 在调用重载的方法时,具体要调用哪个方法,由实际参数与形式参数的匹配来决定,参数匹配得上的方法即为被调用的方法。 13.简述抽象类和接口有何异同。 相同点: (1) 都可以被继承(2) 都不能被实例化(3) 都可以包含方法声明(4) 派生类必须实现未实现的方法 区别:(1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。(2) 抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。” (3) 接口可以被多重实现,抽象类只能被单一继承(4) 抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中(5) 抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定,因此反映的是事物的外部特性(6) 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法(7) 接口可以用于支持回调,而继承并不具备这个特点(8) 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的(9) 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法 1.程序错误有哪几类? 程序错误分为三类:①语法错误:指不符合C#语法规则的程序代码。编译时VS能够自动指出这类错误,并告知错误的位置和原因。一般通过简单的调试处理即可解决;②逻辑错误:由于人为因素导致的错误(如算法设计错误、输入错误等),编译时不会出错,但结果不对。一般需要重新检查程序的执行流程以及算法是否符合要求来解决。③运行错误:往往是由于在程序执行时遇到了一些非法操作引起的。这类错误在程序编辑和编译时不会被发现,只有在运行时才会发现。程序在运行时发生错误,系统通常会给出一个错误提示信息,然后终止程序的运行。 2.什么是异常?所有异常类型都派生于什么类? 异常:指反常程序事件所有的异常都派生于Exception类,该类包含在公共语言运行库中。 3.写出异常类中的两个常用属性,并指出它们分别有什么作用。 Message属性:string类型的只读属性,包含了对异常原因的描述。 InnerException属性:Exception类型的只读属性,如果其值为null,则表示当前异常是由系统内部产生的或者根据相关条件直接抛出的。如果其值不为null,则表示当前异常是作为对另一个异常的回答而被抛出的,产生当前异常的异常可以在InnerException属性中得到。 4.简述try……catch……finally语句的执行过程。 先执行try里面的语句,如果try里面的语句抛出了错误,就会被catch捕获,所以就会中断try里面语句的执行转而执行catch里面的语句, 如果try里面的语句都执行完了也没有抛出错误,那么catch里的语句就没有机会执行了。 最后不论try顺利运行完毕,还是try抛出了错误被catch语句捕获并执行了catch的语句都要接着执行finally里面的语句 1.如果需要将一个文本框用做密码输入框,应该如何设置它的属性? 将PasswordChar属性设置为“*” 2.关闭窗体与隐藏窗体有什么区别? Hide方法:隐藏窗体。 格式:窗体名.Hide(); Close方法:关闭窗体。 格式:窗体名.Close(); 3.模式窗体和非模式窗体有什么区别?、frm.ShowDialog();//打开一个模式窗体 frm.Show();//打开非模式窗体 区别: 1.返回值不同,DialogResult/void 2.模式窗体会使程序中断,直到关闭模式窗口 3.打开模式窗体后不能切换到应用程序的其他窗体 4.子窗体和模式窗体互斥。 5.简述Lable和TextBox控件的主要区别是什么? Label 控件用于显示用户不能编辑的文本或图像。含义:用于显示标签 TextBox 控件通常用于可编辑文本,不过也可使其成为只读控件,文本框用于获取用户输入或显示文本。 这就是区别,Label只能显示,而TextBox可以修改,输入数据。 4.简述Lable、Button和TextBox控件的作用。 Lable控件通常用于显示静态文本信息,显示的文本不能编辑。通常不使用标签控件来触发事件,也很少调用它的方法 Button控件允许用户通过单击操作来执行某些代码,单击一个按钮将引发执行相应的一个函数,该函数就是单击Button按钮时产生的Click事件的事件处理函数 TextBox控件,文本框控件主要用于文本的输入、显示、编辑和修改。 6.简述消息框的作用。 消息对话框一般用于在程序运行过程中显示相关提示信息,以增加程序与用户的交互能力。 C#提供了实现消息对话框功能的多种途径。 在C#中通常是利用MessageBox类来实现消息对话框的功能。 MessageBox类的消息对话框是一种“轻便”消息对话框,如果交互性要求不是很强,利用它来实现信息提示是非常方便的。 7.简述PictureBox和ImageList控件的作用。 PictureBox控件(图片框)PictureBox控件又称图片框,常用于图形设计和图像处理应用程序。在该控件中可以加载的图像文件格式有:位图文件(.Bmp)图标文件(.ICO)图元文件(.wmf).JPEG和.GIF文件 ImageList向其他控件(如ToolBar、ListView和Treeview)提供图像。 8.简述RadioButton和CheckBox控件的作用。 RadioButton 控件为用户提供由两个或多个互斥选项组成的选项集。虽然单选按钮和复选框看似功能类似,却存在重要差异:当用户选择某单选按钮时,同一组中的其他单选按钮不能同时选定。相反,却可以选择任意数目的复选框。 CheckBox控件就是我们一般所说的复选框,通常用于某选项的打开或关闭。 9.简述GroupBox和TabControl控件的作用。 GroupBox控件是一个HeaderedContentControl,可提供一个带标题的容器来放置图形用户界面(GUI) 内容 TabControl控件用来显示多个Tab页,每页由“选项卡”来选择。个Tab是一个容器控件,可以用来放置其他控件。 10.简述ListBox和ComboBox控件的作用。 1 ListBox控件提供一个列表供用户选择。在列表框中,用户一次可以选择一个或多个选项。在列表框中,列表项可以单列显示,也可以多列 显示。 2组合框(ComboBox)类似于列表框,它提供一个列表供用户选择。不同的是,组合框具有一个带下拉按钮的文本框,可通过点击下拉按钮从弹出的列表中选择所需的选项(只能选一项),被选中的项将在文本框中显示出来。并且组合框允许输入一个选项,而列表框不允许输入选项。 11.简述Timer和ProgressBar控件的作用。 Timer控件(定时器)按一定的时间间隔周期性地触发一个名为Tick的事件。因此,在该事件的代码中可以放置一些需要每隔一段事件重复执行的代码。在程序运行时,定时器控件是不可见的。 ProgressBar控件(进度条)该控件在水平栏中显示适当长度的矩形来指示进程的进度。当执行进程时,进度条用系统突出显示颜色在水平栏中从左到右进行填充,进程完成时,进度栏被填满。 1.什么是模式对话框和非模式对话框?如何利用Form类来实现这两种对话框。 答,模式对话框处于活动状态时程序就不能切换到其他对话框和窗体中除非关闭它。与此相反 当费模式对话框处于活动状态时程序可以切换到其他对话框和窗体中。Form类提供的showDialog()方法和show()方法分别由于实现模式对话框与非模式对话框的显示。 Form frm1=new Form() Foem.showDialog();//打开模式对话框 Form frm2=new Form Frm.show();//打开非模式对话框 2.什么是控件?什么是组件?它们有何区别与联系? 控件和组件的区别: 组件:是指没有界面的组件(运行时不可见); 控件:是指有界面的组件(运行时可见)。 但有的时候也把两者统称为组件,其具体意义要根据上下文来决定。 4.在VS2008中,要选用何种模板来创建ActiveX控件? “Windows窗体控件库”模板 7.菜单按使用方式可分为哪两种?在C#.NET中使用什么控件来设计这两种菜单? 在VC#2008中,可使用MainMenu控件和MenuStrip控件很方便地实现Windows的菜单。 8.如何快捷有效地让工具栏中的按钮与下拉式菜单中的菜单项具有相同的功能? 9.什么是SDI和MDI? 单文档界面(SDI)应用程序:仅支持一次打开一个文档(如记事本),若需要编辑多个文档,必须创建SDI应用程序的多个实例。 多文档界面(MDI)应用程序:(如Excel),用户可以同时编辑多个文档。 10.什么是ActiveX控件?创建ActiveX控件一般需要哪几个步骤? ActiveX是Microsoft对一系列策略性面向对象程序技术和工具的称呼,它与Java中的Applet功能类似,其依赖的主要技术是组件对象模型(COM),它是“成品”的软件模块。 创建ActiveX控件,一般需要下列4个步骤: 1创建“Windows窗体控件库”类型的项目。 2设计ActiveX控件的界面:将一个或多个Windows窗体控件或组件添加到自定义控件视图设计器中。 3为ActiveX控件编写代码。 4生成ActiveX控件。 1.什么是应用程序的发布? 应用程序的发布:也称为应用程序部署或打包,是指在Visual https://www.doczj.com/doc/0416007821.html,环境中将应用程序或组件脱离Visual https://www.doczj.com/doc/0416007821.html,环境而使之能够独立运行的过程。 2.在Visual C# 2008中,Windows应用程序的发布有哪几种常用的发布方法?请简述每种发布方法的发布过程及优缺点。 最简单的做法:用手工或半手工方法将相关文件及资源拷贝到目标目录中。但这种方法只适用于功能简单、结构单一、发布量小的程序。 通过基于Windows Installer的.NET项目来创建应用程序的安装程序,可以最大限度地减少手工的参与,提高安装程序的正确性、兼容性和高效性。 三.问答题 https://www.doczj.com/doc/0416007821.html,包括哪些对象?请简述各个对象的作用。 答案:五大对象分别是:1、Connection(连接数据库)2、Command(执行T-SQL语句)3、DataAdapter(用户填充DataSet,断开模式)4、DataReader(读取数据库,一种只读模式,只向前的)5、DataSet(数据集,好比电脑的内存) https://www.doczj.com/doc/0416007821.html, 包括哪两个主要的组件?其中数据提供程序的四个核心对象是什么? https://www.doczj.com/doc/0416007821.html,体系结构主要包括两个主要组件:数据提供程序和DataSet 1.Connection Object:提供与数据源的连接。 https://www.doczj.com/doc/0416007821.html,mand Object:发出命令,包括返回数据,修改数据,运行存储过程以及发送或检索参数信息的数据库命令。 3.DataReader Object:从数据源中读取仅向前的、只读的数据流。快速而且高效。 4.DataAdapter Object:可以执行针对数据源的各种操作,包括填充DataSet,更新变动数据到数据源中,并使对DataSet中数据的更改与数据 源保持一致。 3.Connection对象的作用是什么?Connection 对象的什么方法用来打开和关闭数据库连接? Connection对象用于连接数据库,不同的数据库有不同的Connection对象。连接SQL Server数据库使用SqlConnection对象(在System.Data.SqlClient 命名空间中)。连接Access数据库使用OleDbConnection对象(在System.Data.OleDb命名空间中) 1)Open()方法,打开数据连接,ConnectionString属性并没有真正的打开数据库,必须由Open()方法来打开,打开的方式由ConnectionString的属性指定。 2)Close()方法:关闭数据库连接,数据源使用后,务必记得关闭数据连接。 https://www.doczj.com/doc/0416007821.html,mand对象的ExecuteNonQuery() 方法的功能是什么? 执行没有返回结果集的SQL语句,如Insert、Update、Delete语句等。命令的文本在CommandText属性中设置。 返回结果是执行命令后受到影响的行数 https://www.doczj.com/doc/0416007821.html,mand对象的ExecuteReader() 方法的功能是什么? 执行CommandText属性中定义的(查询)命令,返回DataReader对象 6.请简述使用Command和DataReader 对象对数据库中的数据进行检索的步骤。 利用Connection对象建立和数据库的连接。创建Command 对象,指定查询语句。调用Command对象的ExecuteReader()方法执行查询并建立DataReader对象。使用DataReader对象的Read() 方法逐行读取数据,进行相应处理关闭DataReader对象和数据库连接。 7.DataGridView 控件的作用是什么? DataGridView控件具有极高的可配置性和可扩展性,它提供有大量的属性、方法和事件,可以用来对该控件的外观和行为进行自定义。是https://www.doczj.com/doc/0416007821.html,中增强的datagrid控件,用来在网格中显示表格数据,使用gridview控件,可以显示,更新和删除多种不同的数据源中的数据。 8.请简述使用DataAdapter 对象和DataSet 对象对数据库中的数据进行增删改的程序设计步骤。 一般步骤:1利用Connection对象建立和数据库的连接。2建立Command对象,执行查询语句命令。3建立DataAdapter对象。4建立DataSet 对象。5使用DataAdapter对象的Fill方法填充DataSet对象。6将DataSet对象数据集中的数据显示出来。 向DataSet对象中添加行:第一步:为数据集中的某个数据表添加一个新行;第二步:给新行的各列赋值; 第三步:把新行添加到数据表的行集合中。 从DataSet对象中删除行:MyDs.Tables["Student"].Row[4].Delete(); 修改DataSet对象中的数据:MyDs.Tables["Student"].Row[4][ "Native"]="南京"; 利用DataSet对象更新数据源:对DataSet对象的更改并没有实际写入到数据源中,要将更改传递给数据源(即使用DataSet对象更新数据源),还需调用DataAdapter对象的Update方法。 9.简述DataSet、DataAdapter和数据源三者之间的关系。 DataAdapter作为桥梁连接数据源和DataSet DataSet,在这里进行update,delete,insert DataAdapter DataBase Update()方法在这刷新Fill方法10.16简述简单绑定和复杂绑定的概念。 简单绑定:就是将数据显示控件的属性绑定到数据源的某个字段上,该属性值在程序运行时能随数据源对应字段值的变化而变化。 复杂绑定:就是将一个基于列表的控件(ListBox、DataGridView等)绑定到一个数据实例列表(如数据库的表、数组等)。同样,复杂绑定也能实现界面数据和数据源数据之间的双向传递。 六、 5.创建一个名为Person的类,具体要求如下: 含有静态字段total(存放学生总数),实例字段ID(学号)、name(姓名)、sex(性别) 创建构造函数,为新实例设置变量值,并记录实例个数。 创建静态方法,显示当前学生总数。 创建实例方法,显示学生的学号、姓名和性别。 在主函数中调用实例化Person类,并调用静态方法和实例方法,要求第一次实例化显示自己的学号和姓名等。 class Person { public static int total=0; public int num; public string name; public string sex; public Person(int n, string a, string s) { num = n; name = a; sex = s; total++; } public static void displayNum() { Console .WriteLine ("total:{0}",total ); } public void DisplayAll() { Console.WriteLine("学号:{0}\t姓名:{1}\t性别:{2}", num ,name,sex ); } } public class test { static void Main() { Person myPerson = new Person(1001, "张小为", "女"); Person.displayNum(); myPerson.DisplayAll(); } } 6.创建一个复数类Complex,可以实现复数的赋值(通过构造函数)、显示(通过实例方法)和加法运算(通过“+”运算符重载)。 class Complex { int real, imag; public Complex(int a, int b) { real = a; imag = b; } public void Display() { Console.WriteLine("Complex.real={0},Complex.imag={1}", real, imag); } public static Complex operator +(Complex p1, Complex p2) { Complex p=new Complex(0,0); p.real = p1.real + p2.real; p.imag = p1.imag + p2.imag; return p; 7.定义一个Shape抽象类,在该类中定义两个抽象方法GetArea和GetPerim。然后以Shape抽象类作为基类派生出Rectangle和Circle类,在这两个类中分别对GetArea和GetPerim方法进行重写,实现求特定形状的面积和周长。using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace B_6_1 { publicabstractclass Shape { publicvirtualdouble GetArea() //虚方法,求面积 { return (0); } publicvirtualdouble GetPerim() //虚方法,求周长 { return (0); } } class Rectangle : Shape//派生出来的Rectangle类 { publicdouble Width; //矩形的宽度 publicdouble Length; //矩形的长度 public Rectangle(double a, double b) //构造函数 { Width = a; Length = b; } publicoverridedouble GetArea() //重载的求面积方法 { return (Width * Length); } publicoverridedouble GetPerim() //重载的求周长方法 { return (2 * (Length + Width)); } } class Circle : Shape//派生出的Circle类 { publicdouble Radius; public Circle(double r) //构造函数 { Radius = r; } publicoverridedouble GetArea() //重载的求面积方法 { return (Math.PI * Radius * Radius); } publicoverridedouble GetPerim() //重载的求周长方法 { return (2 * Math.PI * Radius); } } }