c#课堂笔记.docx
《c#课堂笔记.docx》由会员分享,可在线阅读,更多相关《c#课堂笔记.docx(18页珍藏版)》请在冰豆网上搜索。
c#课堂笔记
10.20封装,继承,多态
100%的时间=50%思考+20%交流+30%写代码
1.封装:
把代码组织起来,编辑器禁止所有类继承该类.
10.25接口
定义:
接口像一个抽象类.像其他类一样,可以定义接口的方法,属性,索引器,事件.继承接口的类必须提供接口成员的实现.
注:
尽量让接口实现单一功能.
接口与抽象类的比较
抽象类是一种不能实例化的类.抽象类可以是完全实现的,但通常是部分实现的,或者完全不实现的,从而他可以用来封装继承类的通用功能.抽象类为管理组件提供了一种简单易行的方法,通过更新基类,所有的派生类都将进行自动更新.
接口是一个完全抽象的成员集,而这个成员集为相关的操作定义了一组规则.接口的实现完全留给开发者.而接口在创建后就不能更改,如果修改接口,则必须创建新的接口.
目标
选择
创建多个版本
抽象类
设计大型功能单元
抽象类
创建大范围异类对象间的使用的功能
接口
设计小而简练的功能块
接口
总结c#
第一章概述
1.集成开发环境(IntegratedDevelopmentEnvironment,IDE)
2.作为一名开发人员,它的开发工作基本上离不开:
编程语言,集成开发环境和运行环境.
具体到本书上就是:
c#编程语言,visualstudio集成开发环境和.netFramework运行环境.
3.计算机软件是指令,数据和文档的集合.
特征:
a.指令按照特定顺序组织,能够使计算机具有信息处理能建立.
b.标志一定的功能,完成一定任务或产生一定的结果.
4.软件分为系统软件和应用软件
我们最常见的应用软件是windows应用软件和web应用软件
5.计算机用编程语言包括:
机器语言,汇编语言和高级语言.
已编程的方式解决问题的一般方法:
分析,设计,选择用户界面,代码实现,测试和调试,完成程序的文档说明.
6.计算机解决问题的实质就是高速的算术和逻辑运算.本质就是:
计算方法和数据.用术语来说就是数据结构和算法.
数据结构是计算机存储数据和组织数据的方式.
7.从高级语言编写的程序到低级语言编写的程序的转换方法有:
解释或编译.
8.c#推荐的代码格式:
缩进,区分大小写,空白区和注释.
第二章c#和visualstudio2005
1.自定义起始页的新闻区:
A.在工具菜单中选择选项命令
B.展开环境,然后单击启动.
C.在起始页新闻频道输入新闻RSS源的url
D.单击确定
第三章变量,数据类型和表达式
1.Shift+alt+f10用于更新对重命名对象的引用的选项.
2.变量就是存储信息的基本单元.
3.命名变量:
一.字母,数字和下划线
二.不能与系统关键词重名
三.以小写字母开头
四.变量应该具有描述性质
五.驼峰
4.声明变量:
数据类型+变量名;
声明变量之后就可以将其赋值.
5.常量:
圆周率π
生命常量:
Const数据类型常量名字;
6.c#的数据类型
数据类型定义了数据的性质,表示,存储空间和结构.
C#数据类型可以分为值类型和引用类型
7.值类型的用来存储实际值,而引用类型用来存储对实际数据的引用.
值类型由简单类型,枚举类型和结构类型组成.
引用类型包括:
class,interface,array,string和delegate组成.
8.逻辑运算符和表达式
运算符
描述
!
非
&&
And短路
&
And非短路
||
Or短路
|
Or非短路
^
Xor异或
True和false
重载的时候使用
第四章条件语句
1.临时变量:
在程序代码中没有出现,没有名字
作用:
函数的返回型,参数的传递和值传递.
第五章面向对象
1.
2.
3.
试题
分析题
1、分析下列代码段:
staticvoidMain(string[]args)
{
String[]words=newstring[]{"a","b","c"};
foreach(stringwordinwords)
{
word="abc";
Console.WriteLine(word);
}
Console.ReadKey();
}
最终的运行结果是什么?
(C)
A.bcacab B.abcabcabc
C.不能正确编译 D.abc
Word为迭代变量,无法为它赋值.
2、分析下列程序代码:
usingSystem;
classProgram
{
staticvoidMain(string[]args)
{
stringtestString="VisualStudio2005";
stringnewString=string.Empty;
foreach(charchintestString)
{
if(ch=='i'||ch=='u')
continue;
newString+=ch.ToString();
}
Console.WriteLine(newString);
}
}
哪项的输出是正确的?
(C)
A.iuui B.V
C.VsalStdo2005 D.VisualStudio2005
分析下列类的定义:
publicclassBase
{
protectedBase()
{
Console.Write("Base!
");
}
}
publicclassMyClass:
Base
{
publicMyClass()
{
Console.Write("MyClass!
");
}
}
在Main中执行下列语句MyClassobj=newMyClass();后,Console的输出为(C).
A.MyClass!
B.Base!
C.Base!
MyClass!
D.MyClass!
Base!
分析下列程序:
publicclassclass4
{
privatestring_sData="";
publicstringsData
{
Set
{
_sData=value;
}
}
}
在Main函数中,在成功创建该类的对象obj后,下列哪个语句是合法的?
(A)
A.obj.sData="Itisfunny!
";
B.Console.WriteLine(obj.sData);
C.obj._sData=100;
D.obj.set(obj.sData);
5、分析下列类的定义:
publicclassBase
{
protectedBase(){Console.Write("Base!
");}
}
publicclassMyClass:
Base
{
publicMyClass(){Console.Write("MyClass!
");}
}
在Main中执行下列语句后,Console的输出为(C).
MyClassobj=newMyClass();
A.MyClass!
B.Base!
C.Base!
MyClass!
D.MyClass!
Base!
6、对下面的代码
publicclassDoor
{
}
publicclassHouse
{
publicHouse()
{
Doordoor=newDoor();
}
}
哪段描述是错误的?
(B)
A、Door是一个类。
B、House是一个从Door继承的类。
C、House的构造函数中声明了一个名为door的变量。
D、door是一个对象。
7、写出程序的输出结果
classClass1
{
privatestringstr=Class1.str;
privateinti=0;
staticvoidStringConvert(stringstr)
{
str=stringbeingconverted.;
}
staticvoidStringConvert(Class1c)
{
c.str=stringbeingconverted.;
}
staticvoidAdd(inti)
{
i++;
}
staticvoidAddWithRef(refinti)
{
i++;
}
staticvoidMain()
{
inti1=10;
inti2=20;
stringstr=“str”;
Class1c=newClass1();
Add(i1);
AddWithRef(refi2);
Add(c.i);
StringConvert(str);
StringConvert(c);
Console.WriteLine(i1); 10
Console.WriteLine(i2); 21
Console.WriteLine(c.i); 0
Console.WriteLine(str);
Console.WriteLine(c.str);
}
}
8、.写出程序的输出结果
publicabstractclassA
{
publicA()
{
Console.WriteLine('A');
}
publicvirtualvoidFun()
{
Console.WriteLine(A.Fun());
}
}
publicclassB:
A
{
publicB()
{
Console.WriteLine('B');
}
publicnewvoidFun()
{
Console.WriteLine(B.Fun());
}
publicstaticvoidMain()
{
Aa=newB();
a.Fun();
}
}
结果:
A
B
9、写出程序的输出结果:
publicclassA
{
publicvirtualvoidFun1(inti)
{
Console.WriteLine(i);
}
publicvoidFun2(Aa)
{
a.Fun1
(1);
Fun1(5);
}
}
publicclassB:
A
{
publicoverridevoidFun1(inti)
{
base.Fun1(i+1);
}
publicstaticvoidMain()
{
Bb=newB();
Aa=newA();
a.Fun2(b);
b.Fun2(a);
}
}
结果:
2
5
1
6
10、在下面的例子里
usingSystem;
classA
{
publicA()
{
PrintFields();
}
publicvirtualvoidPrintFields(){}
}
classB:
A
{
intx=1;
inty;
publicB()
{
y=-1;
}
publicoverridevoidPrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
当使用newB()创建B的实例时,产生什么输出?
结果:
1
0
11、下列语句是MyClass的一部分,obj是MyClass的一个对象。
privateclasssubclass
{
publicintdata;
}
voidchange(refintx){x=1;}
publicvoidtest()
{
subClasss=newsubClass();
s.data=100;
change(refs.data);
Console.WriteLine(s.data);
}
则调用obj.test()后。
控制台输出(D)。
A.100B.101 C.0 D.1
12、已知类Base、MyClass的定义如下
classBase
{
publicvoidHello()
{
System.Console.WriteLine("HelloinBase!
");
}
}
classDerived:
Base
{
publicvoidHello()//不用new也要隐藏但会警告
{
System.Console.WriteLine("HelloinDerived!
");
}
}
则下列语句在控制台中的输出结果为__B___。
Derivedx=newDerived();
x.Hello();
A.HelloinBase!
B.HelloinDerived!
C.HelloinBase!
D.HelloinDerived!
HelloinDerived!
HelloinBase!
13、下述代码用于重写Message方法。
请分析下述代码,并更正错误代码行。
1.interfaceIMsg
2.{
3.voidMessage();
4.}
5.publicclassMyClass:
IMsg
6.{
7.publicvirtualvoidMessage()
8.{
9. Console.WriteLine("MyClass");
10.}
11.}
12.publicclassMyDerivedClass:
MyClass
13.{
14.publicoverridevoidMessage()
15.{
16. Console.WriteLine("MyDerivedClass");
17.}
18.}
14、下面代码功能是对数组进行遍历,请分析下列代码段并在空白行补全C#代码。
(4分)
staticvoidMain(string[]argz)
{
string[]myString={"windows","form","dialog"};
foreach(stringstrinmyString)
{
Console.WriteLine(str);
}
}
15、下列程序执行的结果是输出(A)。
usingSystem;
classtest
{
staticvoidMain()
{
for(inti=0;i<=100;i++)
Console.WriteLine(i);
}
}
A、0到100之间的所有整数B、1到100之间的所有整数
C、0到100之间的所有偶数D、0到100之间的所有奇数
16、下列程序执行的结果是输出(C)。
usingSystem;
classtest
{
staticvoidMain()
{
for(inti=1;i<=100;i++)
{
if(i%2==0)
Console.WriteLine(i);
}
}
}
A、1到100之间的所有整数B、0到100之间的所有整数
C、1到100之间的所有偶数D、1到100之间的所有奇数
17、下列程序执行的结果是输出(C)。
usingSystem;
classtest
{
staticvoidMain()
{
ints=0;
for(inti=1;i<=100;i++)
{
if(i%2==0)
s=s+i;
}
Console.WriteLine(s);
}
}
A、1到100之间的整数之和B、0到100之间的所有整数
C、1到100之间的偶数之和D、1到100之间的奇数之和
18、下面的例子
usingSystem;
classA
{
publicstaticintX;
staticA(){
X=B.Y+1;
}
}
classB
{
publicstaticintY=A.X+1;
staticB(){}
staticvoidMain(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
结果:
1
2
19、读下面程序分析结果
usingSystem;
classtest
{
publicclassA
{
publicvirtualvoidfun1(inti)
{
Console.WriteLine(i);
}
publicvoidfun2(Aa)
{
a.fun1(3);
fun1(7);
}
}
publicclassB:
A
{
publicoverridevoidfun1(inti)
{
Console.WriteLine(i+1);
}
}
publicstaticvoidMain()
{
Aa=newA();
Bb=newB();
a.fun2(b);
b.fun2(a);
}
}
结果
4
7
3
8
一、单选题:
1、C#程序设计语言属于什么类型的编程语言(A)。
A.高级语言B.自然语言C.机器语言D.汇编语言
2、C#中声明一个命名空间的关键字是(A)。
A.namespaceB.nameplaceC.thisD.as
3、C#的数据类型有数值类型和(D)类型两种。
A.结构类型B.关系类型C.调用类型D.引用类型
4、对于在代码中经常要用到的且不会改变的值,可以将其声明为常量。
如圆周率PI始终为。
现在要声明一个名为PI的圆周率常量,下面哪段代码是正确的?
(B)
A.constfloatPI;PI=3.14f;B.constfloatPI=3.14f;
C.floatconstPI;PI=3.14f;D.floatconstPI=3.14f;
假设a不等于b,并且b不等于false,下列哪个表达式的运算结果为false。
(C)
A.a!
=b B.a=b C.a==b D.a<>b
6、下面有关虚方法的描述正确的是(C)。
A.虚方法能在程序运行时,动态确定要调用的方法,因而比非虚方法更灵活,更方便
B.在定义虚方法时,基类和派生类的方法定义语句中都要带上virtual修饰符
C.重写基类的虚方法时,为消除隐藏基类成员的警告,需要带上new修饰符
D.在重写虚方法时,需要同时带上override和virtual修饰符
7、下列关于继承说法中,哪个选项是正确的?
(A)
A.继承是指派生类可以获取其基类特征的能力
B.继承最主要的优点是提高代码性能
C.派生类可以继承多个基类的方法和属性
D.派生类必须通过base关键字调用基类的构造函数
用关于重载,以下叙述错误的是(D)。
A.重载是指在类的内部存在若干个方法名称一致但是参数列表不同的方法
B.方法重载是指创建多个名称相同的方法,其中每个方法都在某些方面具有唯一性,以便编译器能够正确区别它们
C.重载构造函数的方式与重载方法的方式相同
D.方法的重载允许两个方法的名称和参数列表相同,而返回类型不同
下列关于多态的说法中,那个是正确的?
(C)
A.虚方法是实现多态的唯一手段
B.重写虚方法时可以为虚方法指定别称
C.多态性是指以相似的手段来处理不相同的派生类
D.抽象类中不可以包含虚方法
1, 请你说说.NET中类和结构的区别?
答:
结构和类具有大体的语法,但是结构受到的限制比类要多。
结构不能申明有默认的构造函数,为结构的副本是又编译器创建和销毁的,所以不需要默认的构造函数和析构函数。
结构是值类型,所以对结构变量所做的改变不会影响其的原值,而类是应用类型,改变其变量的值会改变其原值。
申明结构用Struck关键字,申明类用class关键字,向方法传递结构是时是通过值传递的,而不是通过引用。
与类不同,结构的实例化可以不使用New关键字。
类可以实现接口。
2, 死锁的必要条件?
怎么克服?
答:
系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。
3, 接口是否可以继承接口?
抽象类是否可以实现接口?
抽象类是否可以继承实体类?
答:
接口是可以继承接口的,抽象类是可以实现接口的,抽象类可以继承实体类,但是有个条件,条件是,实体类必须要有明确的构造函数。
4,