C#程序设计基本知识点.docx
- 文档编号:4043371
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:15
- 大小:52.75KB
C#程序设计基本知识点.docx
《C#程序设计基本知识点.docx》由会员分享,可在线阅读,更多相关《C#程序设计基本知识点.docx(15页珍藏版)》请在冰豆网上搜索。
C#程序设计基本知识点
绪论:
通过前几个学期对java编程语言的学习,加上这学期对C#开发语言的了解,发现java和c#之间有很多想通之处,所以对C#也能很快的上手,实现简单的编程。
实现简单的代码开发和维护。
一下是自己几周课的学习内容总结和自己学习这门课的心得体会。
一、向对象的理解
一、对象的概念:
客观存在的世界中的一切事物都是对象。
面向对象。
二、在编程中的理解
(1)面向对象就是把现实世界中事物实例模型化,把现实中的事例用一组属性和方法及表示他的事件来表示,并且用面向对象的编程语言转化正计算机可执行的工作,并模拟现实的操作来实现实际的应用。
(2)面向对象在编程中还实现数据和操作的分离,不同方法和事件分离,以及把具有相同属性和方法的对象集合起来达到内聚。
这就利于程序的可读性,可维护性好,也方便程序移植,可复用高了,就减轻了程序的而开发难度,从而提高了程序设计的效率。
客
观
世
界
二、C#中的类基本知识点总结
1.C#中的类只支持单继承。
2.对类成员的访问:
1.公有成员。
Public,允许外部访问。
2.私有成员。
Private,只允许类中的成员访问。
派生类都不能访问。
3.保护成员。
Protected.方便派生类的直接访问,同时又希望对外部是隐藏的。
4.内部成员。
Internal.对于同一包内的程序或库是透明的。
而对于包外是隐藏的。
5.类中的成员要么是静态要么是非静态。
一般来说,静态成员是属于类所有,非静态成员则属于类的实例-对象。
访问的时候:
静态:
类名.成员名;非静态:
实例名.成员名(this.成员名)static
6.关键字const用于声明常量,后跟数据类型的声明。
例:
publicconstdoublex=1.0;
7.构造函数不声明返回类型,构造函数用于执行类的实例的初始化。
8.折构函数在类的实例超出实用范围时,我们希望收回它所占的存储时使用。
析构函数跟类名相同,只是在前面加上一个符号:
~
9.值参数:
使用值参数时,初调用的方法不会修改内存中实参的值。
引用型参数:
引用型参数并不开辟新的内存区域。
当利用引用型参数向方法传递形参时,编译程序将把实际参数所在内存中的地址传递给方法。
10.substring(0,i)从此实例检索子字符串。
子字符串从指定的字符位置开始且具有指定的长度。
String.indexof(char)报告指定Unicode字符在此字符串中的第一个匹配项的索引.
11.输出型参数:
输出型参数也不开辟新内存,跟引用型参数一样,只是引用型参数在使用的时候不用需要对变量进行初始化,引用型参数用于传递方法的返回数据。
12.如果形参中包含了数组参数,那么它必须在参数表中位于最后。
另外,参数只允许一维数组。
13.静态方法可以访问类中的静态成员,但不能访问非静态成员。
但可以将类的实例当作参数传递给方法使用,指明具体的调用对象,这时就可以操作实例的静态和非静态成员了。
14.类的方法的重载:
方法的名字相同,但参数个数或类型不同,编译器就能知道在什么时候调用什么方法。
15.C#中,操作符重载总是在类中声明,并且通过调用类的成员方法来实现。
操作符重载可以适用于类的实例的操作。
16.静态域的声明用static修饰符。
无论建立多少个该类的实例,内存中只存在一个静态数据拷贝。
域相当于简单成员变量。
在另一个类对静态域的访问可以通过对静态域所在类的public方法进行访问。
17.简单地说:
const型表达式的值在编译时形成,而只读域staticreadonly表达式的值在程序运行时才形成。
这种方法有利于版本的控制。
18.对于静态域,类在装载时对其进行初始化;对于非静态域,在类的实例创建时进行初始化。
19.虽然域和属性语法类似,但不能把属性当作变量那样使用。
也不能把属性当作引用型参数或输出型参数进行传递。
在属性的访问声明中,对属性的值的访问用get关键字标出。
对属性的值的写操作用set标出。
20.不直接操作类的数据内容,而是通过访问器进行访问,它借助get和set对属性值进行读写。
三C#面向对象编程的程序结构解析:
实例说明:
usingSystem;//命名空间
namespace_space
{
classProgram
{
staticvoidMain(string[]args)//程序主函数,也是入口
{
studenta=newstudent();//实例化一个对象a
a.name="xiaoli";
}
}
publicclassstudent//定义一个student类
{publicstringname;
publicintname
{
get{returnname;}//属性
}
privatestringID;
publicstudent(intid,stringname)//给student定义一个方法
{
}
}
publicclassgrender:
student//student类的重载
{
}
}
四、类和对象的关系
从概念上来讲:
具有相同数据结构和相同操作的对象的集合
例如:
publicclasspeople
{
publicfloatname;//peoplel类的name字段
publicstringbrithday;
privatestringbrithday
{set{returnbrithday;}}//brithday字段的只写的属性。
达到保护别人生日隐私功能
publicvoidage(stringi,stringbrithday)//计算年龄的方法
{
//age=this.data()-brithday;
}
}
人,是一个大类,人都有姓名和生日这一组属性,可以通过age这个反法来计算每个人的年龄,这就是类。
概念:
对象就是现实生活中的一个个的实体,类是人们对现实生活动现实存在的对像不断认识而产生的抽象。
C#类的概念本质上是现实生活中类的概念相同的。
接下来我们看在C#当中如何定义一个类,比如我们搞个DNF游戏当中的角色类。
Codeclass 角色
{
private int 血值;
public int 血量值
{
get { return 血值; }
set { 血值 = value; }
}
public void 攻击()
{
Console.WriteLine("攻击");
}
}
我们定义了角色类之后,再看一下如何把C#类实例化为对象:
class Program
{
static void Main(string[] args)
{
//把角色类实例化一个“战士”的对象,并为战士的血量值属性赋值,使用战士的攻击方法。
角色 战士 = new 角色();
战士.血量值 = 1000;
战士.攻击();
//同样,我们还可以用角色类实例化不同的对象如“法师”
角色 法师 = new 角色();
法师.血量值 = 400;
法师.攻击();
}
}
从以上内容我们可以看到,C#类其实就是定义了一个模板,在模板里刻画好我们需要的属性与行为,然后再用模板印刷出一张张的纸,每张纸都是一个对象,是独立存在的。
在C#中我们把“模板印刷为纸张”的过程称为实例化。
以上例子通过类——角色实例化一个对象——战士。
并且把属性血量复值,从而调用攻击的方法。
五、C#基本知识点补充
1、C#具有所有面向对象的语言的所有特性:
封装,继承,多态。
在C#系统中,所有的类型都可以看作一个对象。
C#只允许单继承,即一个类不会有多个基类,C#不会有全局函数,不会有全局变量,不会有全局常数,所有的一切只能封装在一个类中。
2、.net包括四个部分:
vos类型系统;元数据;公用语言规范;虚拟执行系统。
3.usingsystem表示导入名称空间。
4.让我们从第一个程序开始就记得:
每个东西都必须属于一个类,类里面的方法总是为我们完成某件工作的。
在C#中,程序的执行总是从main()方法开始的,一个程序中不允许出现两个或两个以上的5.main()方法。
对于习惯学C控制台程序的读者,必须要牢记:
main()方法必须包含在一个类中。
6.利用string可以方便地对字符串进行连接或剪切。
例:
strings=”good”+”morning”;charx=s[3]字符串可以通过下标进行索引,得到一个字符。
7.我们可以用//进行单行标注,/**/进行多行标注。
在C和C++中,任何非0值都表示真,在C#中,任何非0值都不能代替true.在其它类型的整型值和布尔值之间不存在任何的转换,将整型转换成布尔型是不合法的。
。
8.把一系列相关的变量组织成单一实体的过程称为生成结构的过程。
这个单一实体的类型叫结构类型,每一个变量就是结构的成员。
9.结构类型包含的成员类型可以相同,也可以不同。
我们甚至可以把一个结构类型当作另一个结构成员的类型。
10.枚举实际上是为一组在逻辑上密不可分的整数值提供便于记忆的符号。
结构类型变量的值由各个成员的值组合而成。
而枚举则不同,枚举类型的变量在某一时刻只能取枚举中某个元素的值。
按照系统的设定,每个元素的类型都为整型。
且第一个元素的值为0,后面的每个元素梯加1,也可以直接赋值。
如把前面第一个元素的值设为1,后面的元素不用设,系统自动将后面元素的值递加1.
11.C#中另一大数据类型是引有类型。
其含义是该类型的变量不直接存储所包含的值,而是指向它所要存储的值。
也就是说引用类型存储实际数据引用值的地址。
12.类是面向对象编程的基本单位,是一种包含数据成员,函数成员和嵌套类型的数据结构。
类和结构都包含了自己的成员,但它们的区别是:
类是引用类型,而结构是值类型。
13.如果我们对某个类定义了一个变量,则我们就将它称为类的一个实例。
14.我们常用到的类:
object类。
这个类是其它所有类的基类,其它类型可以直接或间接地从object类中继承。
因此,对一个object类的变量可以赋于任何类型的值。
15.代表?
在声明代表时,只需要指定代表指向的原型的类型,它不能有返回值,也不能带有输出类型的参数。
如:
delegateintMydelegate().在使用的时候:
Mydelegated=newMydelegate(p.instanceMethod).为什么不用delegated=newMydelegate(p.instanceMethod)呢?
原因是delegate相当于class需要一个名字,classmyclass{…}这个class的名字是myclass而且它包含有其它元素、常数或者函数,变量等。
跟chara=a不同,它不包含有其它的元素,a就是一个变量。
而myclass不是变量,它只一个名字。
而myclassa=newmyclass();a才是变量,是类的一个实例。
在这里,这个delegate的名字是Mydelegate,也并不是一个变量。
16.变量从用户角度来说,是存储信息的基本单元,从系统角度来说,变量就是计算机内存中的一个储存空间。
17.静态方法不能用类的实例来访问,必须用类名来访问。
18.数组的声明:
数组的类型[数组的元素个数]数组的名字;数组个数可以通过数组名加圆点加Length获得。
如arr.Length表示arr数组的个数
19.在进行批量处理数据的时候,我们要用到数组.数组是一组类型相同的有序数据.
20.数组的初始化:
int[]a1=newint[]{1,2,3};为什么是newint[],而不是newa1呢:
因为int[]是类型,a1是int[]类型的一个实例.而且a1所代表的是{1,2,3},并不是函数.与delegateintMyclass();不同,Myclass()虽然是一个名字,但它可以代表一个函数,不是常数.原则:
类型后面的名字如果可以代表函数,则这个名字就是一种类型.如果类型后面的名字代表常数,则这个名字不是一种类型,只是类型的一个变量.或者可以用另一种说法:
如果名字后面含有(),{},[]则在赋值或设定实例的时候new后面要用该名字作为类型.
21.变量名不能与C#中的关键字名称相同;变量名不能与C#中库函数名称相同。
22.静态变量:
staticinta;一旦静态变量所属的类被加载,直到包含该类的程序运行结束前它将一直存在。
23.稳性数据转换实际上就是从低精度的数据转换成高精度的的数据类型。
如:
ushort转换成int.
24.隐式枚举转换允许把十进制数0转换成任何枚举类型,对其它整数则不存在这种隐式转换。
25.从元素类型为TS的数组类型S到元素类型为Tt的数组类型T转换,如果元素类型为值类型,则不能进行隐式转换。
26.有一个元素类型为int的枚举类型E,则当执行从E到byte的显示枚举类型转换时,实际上作的是从int到byte的显示数字转换;当执行从byte到E的显式枚举转换时,实际上是执行byte到int的隐式数字转换。
如:
Weekdayday;day=(Weekday)3;实际上是E到byte的显示枚举类型转换。
如何使用枚举:
enumColor
{
red=0,yellow,blue,green,purple
};
Colorcolor_arr=newColor();
Color_arr=(Color)2;
Console.WriteLine(“Color_arr{0}”,Color_arr);
..则其输出结果为blue.
27.赋值操作符(=)和条件操作符(?
:
)按照右结合的原则,即操作从右到左的顺序执行。
Y=(x>10?
0:
1).
28.枚举类型的加法:
Weekdayday1=Weekday.Sunday;Weekdayday2=Weekday.Saturday;Weekdayday3=day1+6;枚举型加法实际上枚
29.位运算符就是对数按二进制位进行运算的操作符。
位运算中的异或运算,当两个位相同时,异或运算结果为0,不相同时异或运算为1.移位运算,左称位将操作数向左位移,高位被抛弃,低位顺序补0.右移运算时,如果X为非负数,最高位设为0;如果X为负数,最高位设为1,即最大为-1.
30.自增自减操作符:
自增自减操作符有前缀和后缀之分。
对于前缀操作符,遵行的原则是“先增减,后使用”,后缀则相反,“先使用,后增减”。
31.new操作符:
new操作符用于创建一个新的类型实例。
它有三种形式:
1,对象创建表达式。
2,数组创建表达式。
3代表创建表达式。
32.typeof操作符用于获得系统原型对象的类型。
六、流程控制知识点概括和注意事项
1.C#提供的选择语句有if和switch语句。
2.如果if或else语句包含的嵌套语句只包含一条执行语句,则嵌套部分的大括号可以省略。
3.每一条else与离它最近且没有其它else与之配对的if相搭配。
4.if语句仅允许布尔数据类型的结果。
例:
if(args.length=0)是正确的。
而if(args.length)是不正确的。
args.length返回一个整形数(integer)。
5.switch语句是只能有一个default标签。
6.C#中它要求每个case标签项后使用break语句或中转语句goto,即不允许从一个case自动遍历到其它case.如果想遍历其它语句,则可以加入下面两条跳转语句:
gotocaselable:
跳至标签语句执行。
Gotodefault:
跳至default标签执行。
7.数组的初始化:
int[]a1=newint][]{1,2,3,4,5}
8.在事先知道循环次数的条件下,用for循环是比较方便的。
9.while语句中允许使用break语句来结束循环。
也可以使用continue语句来停止内嵌语句的执行,继续进行while循环。
10.可以使用break和continue语句来控制循环的表达。
如:
要求打印除7以外的0到9的语句,只需要在到打印7的时候,跳出打印语句就可以了。
For(inti=0;i<9;i++){ifi==7continue;console.write(i);}
11.foreach(MyintxinPrime){
12.预编译和条件编译都是以#开头的。
可以帮助我们在程序执行过程中发出编译的错误或警告。
13.溢出的处理用checked来检测。
14.预处理指令如果出现在其它输入输出元素中间就不会被执行。
中writeLine或Readline等中间。
七、事件和委托以及索引指示器
事件所声明的类型必须是一个代表类型(delegate),代表类型应预先声明。
在编写类的时候,我们可以编写事件向客户说明发生了什么事情。
事件可以在类的属性或域中加以说明,但事件的类型必须是代表型的。
我们可以预订事件确保事件初触发或撤消触发。
索引指示器为我们象使用数组那样为类或类的实例添加路径列表,通过下标进行访问类中的信息。
事件的声明格式:
例:
publiceventeventhandlerclick;这个省略了事件访问声明。
publiceventeventhandlerclick{。
。
。
}这个没有省略事件访问声明。
大多数情况下不用事件访问声明。
索引指示器:
IPaddress[]m_arrayips;publicvoidIPaddressthis[intnindex]{get{returnm_arrayips[intnindex]}};this代表实例,我们象使用数组那样为类或类的实例添加路径列表.实例[i]实际上代表的是类中的属性或域的信息列表。
实例[i].
在C#中,事件的实现依赖于delegate,因此我们有必要先了解一下delegate的概念。
一、Delegate概念介绍
delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。
delegate既可以引用静态函数,又可以引用非静态成员函数。
delegate是面向对象、类型安全。
runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。
二、实现delegate的步骤:
实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate:
1.声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
2.创建delegate对象,并将你想要传递的函数作为参数传入。
3.在要实现异步调用的地方,通过上一步创建的对象来调用方法。
三、实例说明
下面是一个简单的例子:
usingSystem;
publicclassMyDelegateTest
{
//步骤1,声明delegate对象
publicdelegatevoidMyDelegate(stringname);
//这是我们欲传递的方法,它与MyDelegate具有相同的参数和返回值类型
publicstaticvoidMyDelegateFunc(stringname)
{
Console.WriteLine("Hello,{0}",name);
}
publicstaticvoidMain()
{
//步骤2,创建delegate对象
MyDelegatemd=newMyDelegate(MyDelegateTest.MyDelegateFunc);
//步骤3,调用delegate
md("sam1111");
}
}
输出结果是:
Hello,sam1111
参考C#中的委托:
有许多人问的,.Net中的委托以及事件处理。
我拿简单的例子说明一下,是现实中的例子:
比如说一个公司(场景),你是老板,手下有两个员工,小张和小王。
你命令小王,如果小张玩游戏,则小王扣去小张500元钱。
这就是现实中的委托。
实际上,在写程序中,程序员就是老板,小张和小王就是两个对象。
小张玩游戏是一个方法,小张还有一个游戏事件,他玩游戏激发这个事件。
而小王就是事件处理对象,他负责把小张的钱扣除500。
所以,委托有如下几个要素:
1 激发事件的对象--就是小张
2 处理对象事件的对象--就是小王
3 定义委托,就是你让小王监视小张。
如果这三个要素都满足的话,则你就写出了一个完整事件的处理。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceTestCsharp
{
// 定义委托处理程序
//publicdelegatevoidPlayGameHandler(objectsender,System.EventArgse);
publicclass场景
{
[STAThread]
publicstaticvoidMain(string[]args)
{
Console.WriteLine("场景开始了....");
// 生成小王
小王w=new小王();
// 生成小账
小张z=new小张();
// 指定监视
z.PlayGame+=new小张.PlayGameHandler(w.扣钱); //委托实例化后绑定到事件,注意我们用的是+=而不是=;这是因为委托是特殊的对象,它可以引用多个对象(在这里是指它可以引用多个函数)。
// 开始玩游戏
z.玩游戏();
Console.WriteLine("场景结束...");
Console.ReadLine();
}
}
// 负责扣钱的人
publicclass小王
{
public小王()
{
Console.WriteLine("生成小王
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 程序设计 基本 知识点