【满满干活】【适合收藏点赞系列】数据结构第二章编程基础
1.1C#程序组成
原程序一般包括以下部分:名称空间的引用名称,空间的声明,类的声明,main方法,所有语句都以分号结束。
类中包含了程序所要用到的数据和所要执行的方法的定义。所有的内容都在类中,类中可以有:变量(字段,date field)声明,构造方法(函数),方法,属性,事件。
2.1C#数据类型
基本知识
class,interface,delegate,array
类(class)类型用来定义新的数据类型。
C#中定义了两个特殊的类类型object和string。object是C#中所有类型(包括所有的值类型和引用类型)从其继承的根类。string类型是一个密封类型(不能被继承),其实例表示用Unicode编码的字符串。
接口(interface)类型定义一个有关一系列方法的合同。
委派(delegate)类型是一个指向静态或实例方法的签名,类似于C/C++中的函数指针。
接口和委派实际上都是类的某种形式的包装。
所有引用类型的缺省值为null。
引用类型
value type:变量本身包含他们的数据。包括结构类型和枚举类型,结构类型包括简单类型和自定义类型。对一个值类型变量的操作不会影响其他变量。
reference type:变量包含的是实际数据的引用或者叫句柄,即它是对真正包含数据的内存块的指向。包括类,接口,数组,委派。对一个引用类型变量的操作会影响另一个变量所引用的同一对象。
值类型(简单类型)
![](https://img.haomeiwen.com/i24250691/1b2b9df3af4ba6d3.jpg)
值类型(结构类型struct)
把一系列相关的变量组织成为一个单一实体类型称为结构类型;每一个变量称为结构的成员。结构和类的区别:struct是值类型,而class是引用类型。结构用于创建小型的对象。
值类型(枚举类型enum)
把一系列相关的符号常量组织成为一个单一类型称为枚举类型。
enum 枚举类型名{数据1,数据2,……}
值类型和引用类型的区别
![](https://img.haomeiwen.com/i24250691/e0c4431f7d25bb6f.jpg)
类型转换
隐式类型转换是系统默认的、不需要任何声明就可以进行的转换,它是由编译器根据不同类型数据间转换规则自动完成的,又称为自动转换。例如:
bytea=100;
floatc=a;//“小类型”到“大类型”隐式转换
显式类型转换就是强制执行从一种数据类型到另一种。显式类型转换就是强制执行从一种数据类型到另一种数据类型的转换,也称为强制类型转换。例如:
int i,h;
float j=4.5;
i=(int)j;//不同类型显式转换
装箱与拆箱:值类型和引用类型间的转换
(1)装箱就是将值类型变量隐式地转换为引用类型变量。具体过程是:把一个值类型装箱,就是创建一个object对象类型的实例,并把该值类型的值复制给该实例。例如:
int i=1000;
object o=i; //装箱,将i的值复制给o
int i=123;
objecto=i; //i被装箱
(2)拆箱是装箱的逆过程:先确认object类型实例的值是否为给定值类型的装箱值,然后将这个实例的值复制给新的给定值类型的变量。例如:
int val=1000;
object aObj=val; //装箱
int val1=(int)aObj; //拆箱
当装箱时,不需要显式地进行强制类型转换;当拆箱时,必须显式地进行类型转换。
2.2C#的操作符与表达式
基本知识
new运算符:new操作符用于创建某类型的一个新实例。它有两种形式:对象创建表达式和数组创建表达式。
例:
class A{};
A a=new A();
int[]b=new int[10];
操作符
C#从C/C++中继承了几乎所有的操作符,主要分为4类:算术操作符,位操作符,关系操作符,逻辑操作符。
分隔符的优先级最高,表中“左→右”表示从左向右的操作次序(结合性)。
![](https://img.haomeiwen.com/i24250691/38f2b642c7cc7516.jpg)
表达式
为完成一个计算结果的一系列操作符和操作数的组合称为表达式。和C++一样,C#的表达式可以分为赋值表达式和逻辑表达式两种。
2.3C#的流程控制
按程序的执行流程,程序的控制结构可分为3种:顺序结构,分支结构和循环结构。
![](https://img.haomeiwen.com/i24250691/5aff100efbb97a3e.jpg)
3.面向对象技术
3.1类与对象
类与对象是面向对象编程的灵魂。
类class:描述所属对象的蓝图。
对象object:根据蓝图生成的具体实例
(要使用对象,必须先定义类,然后再创建类的对象(实例))。
对象的创建和使用
对象是类的实例,属于某个已知的类。
对象声明的格式为:<类名><对象名>;
new操作符用来创建新的对象,并为之分配内存。它调用类的构造方法来初始化对象。
<类名><对象名>=new<类名>(<参数列表>);
如 Stack s=new Stack();
通过对象引用类的成员变量:<对象名>.<成员名>
通过对象调用成员方法:<对象名>.<方法名>(<参数列表>)
对象在建立时分配内存并初始化:使用new保留字要求系统分配内存;使用构造函数初始化数据。
在C#中,程序员只需创建所需对象,而不需显式地销毁它们。.NET的垃圾回收(gc)机显式地销毁它们。.NET的垃圾回收(gc)机制自动销毁不再使用的对象,收回对象所占的资源。
.NET在适当的时候自动启动gc,检测没有被
引用的对象并销毁之。将分配给对象的内存归还给系统堆(Heap)。
类的声明
在C#中使用class定义类,一般格式为:
<访问修饰符>class<类名称>{
数据成员
构造方法
方法成员
……
}
C#的类是一种封装包括数据成员,方法成员等多种成员的自定义类型(数据结构)。
数据成员:常量和域。
方法成员:方法,属性,索引器,事件,操作符,构造方法。
类的定义=类声明+类主体
类声明:[<访问修饰符>]class<类名>[:<基类名>]
域:[<修饰符>][static]<变量类型><变量名>
方法:[<修饰符>][static]<返回值类型><方法名>(<参数列表>){<方法体>}
构造方法:具有与类名相同的名字,用于对类的实例进行初始化。
属性:提供对类的某个特征的访问
(一个属性可以有2个访问操作符,分别是get和set,它们分别指定属性读取或写入新值的方式)
实例成员和类成员
当创建类的一个对象时,每个对象拥有了一份自己特有的数据成员拷贝。这些为特有的对象所持有的数据成员称为实例数据成员,没有用关键字static修饰的成员就是实例成员。
不为特有的对象所持有的数据成员称为类数据成员,或称为静态数据成员,在类中用static修饰符声明。
C#中静态数据成员和静态方法成员只能通过类名引用获取
类成员的访问权限控制
C#用多种访问修饰符来表达类中成员的不同访问权限,以实现面向对象技术所要求的抽象、信息隐藏和封装等特性。将类设计成一个黑匣子。
![](https://img.haomeiwen.com/i24250691/b22fc1e4a9e04519.jpg)
属性Property与索引Indexer
属性:是用来封装类数据的极佳选择,常见的属性有对象名、字体、颜色等,属性的另一个好处是使应用程序看起来更直观。
属性的用处:可以限制外部对类中成员变量的存取权限。
使用索引的原因是很多对象都是由许多子项
目组成的,如ListBox是由一系列字符串组成。
索引(Indexer)则允许让对象以类似数组的
方式来存取,让程序更为直观,更容易编写。
C#的数组
C#支持一维数组、多维数组(矩形数组)和数组的数组(交错的数组)。C#中的数组都是继承自抽象基类型System.Array,因此数组实际上是对象。
一维数组:
声明数组格式:<类型>[]数组名
例:int[] a;
使用new创建数组的格式:
<数组名>=new<类型>[<长度>]
例:a=new int[10];
声明数组的同时进行初始化
例如:int[]a={1,2,3,4,5};
多维数组:
声明数组格式:int[,]items=new int[5,4];
声明数组的同时进行初始化
例如:int[,]numbers=new int[,]{{1,2},{3,4},{5,6}};
C#的字符串(string)类型
string表示一串不可变的字符。
例如:stringmyString=“sometext“;
myString+=”andabitmore”;
第二行的myString实际上返回的是一个新String实例。
如果需要真正修改类似字符串的对象的内容,可以使用System.Text.StringBuilder类。
如果要得到string中的某个字符,可以使用类似下面的办法:
char chFirst=myString[2];//结果为m
当比较两个字符串是否相等时,可以直接使用“==”比较操作符。
当比较两个字符串大小时,可以使用string.Compare方法,其返回值有‐1,0,1三种可能。
可以使用Format方法将字符串表示为规定格式。规定格式的一般形式为:
{N[,M][:formatCode]}
其中:
N是从零开始的整数,表示第几个参数。
M是一个可选整数,表示最小宽度。若该参数的长度小于M,就用空格填充。
例如:s1=string.Format("thevalueis{0,7:d}",i);
如果M为负,则左对齐;
如果M为正,则右对齐。
如果未指定M,则默认为零。
formatCode是可选的格式化代码字符串。
必须用“{”和“}”将格式与其他字符分开。如果恰好在格式中也要使用大括号,可以用连续的两个大括号表示一个大括号,即:“{{”或者“}}”。
常用格式举例
(1)int i=12345;
this.textBox1.Text=i.ToString();//结果12345
(this指当前对象,或叫当前类的实例)
this.textBox2.Text=i.ToString("d8");
//结果00012345
(2)int i=123;
double j=123.45;
strings1=string.Format("thevalueis{0,7:d}",i);
strings2=string.Format("thevalueis{0,7:f3}",j);
this.textBox1.Text=s1;//结果the value is123
this.textBox2.Text=s2;//结果the value is123.450
(3)double i=12345.6789;
this.textBox1.Text=i.ToString("f2");
//结果12345.68
this.textBox2.Text=i.ToString("f6");
//结果12345.678900
(4)double i=12345.6789;
this.textBox1.Text=i.ToString("n");
//结果12,345.68
this.textBox2.Text=i.ToString(“n4”);
//结果12,345.6789
(5)double i=0.126;
strings=string.Format("thevalueis{0:p}",i);
this.textBox1.Text=i.ToString("p");//结果12.6%
this.textBox2.Text=s;//结果the value is12.6%
(6)DateTime dt=new DateTime(2003,5,25);
this.textBox1.Text=dt.ToString("yy.M.d");
//结果03.5.25
this.textBox2.Text=dt.ToString(“yyyy年M月”);
//结果2003年5月
(7)int i=123;
double j=123.45;
strings=string.Format("i:{0,-7},j:{1,7}",i,j);
//-7表示左对齐,占7位
this.textBox1.Text=s;//结果i:123,j:123.45
3.2类的继承
1)类的继承
从现有类出发定义一个新类,称新类继承了现有的类。
基类(baseclass)或父类
派生类(derivedclass)或子类。
除object之外的每个类都有基类,如果没有显式地标明基类,则隐式地继承自object类。
派生类名
class <派生类名>:<基类名>
public class A{
……
}
public class B:A{
……
}
2)隐藏和重写,虚方法
隐藏:派生类继承基类中所有可被派生类访问的成员,当派生类成员与基类成员同名时,称派生类成员将基类同名成员隐藏,这时应在派生类成员定义中加上new关键字。
虚方法与重写:派生类可以重写基类中声明的虚方法,即为方法提供新的实现。这些方法在基类中用virtual声明,而在派生类中,将被重写的方法用override声明。
3)this,base引用/嵌套类
对象可以通过this引用访问自身的成员,通过base引用访问基类的成员。
一个类可以嵌套定义于另一个类中,称为嵌套类。与一般的类相同,嵌套类可以具有成员变量和成员方法通过建立嵌套类的对象,可以存取其成员变量和调用其成员方法。
4)object类
C#中所有类都直接或间接继承自object类。它们都继承了object类的公共接口。
System.Object=object
public class Object{
public static bool Equals(object objA,object objB){}
public static bool ReferenceEquals(object objA,object objB){}
public Object(){}
public virtual bool Equals(object obj){}
public virtual int GetHashCode(){}
public TypeGetType(){}
public virtual string ToString(){}
protected virtual void Finalize(){}
protected object MemberwiseClone(){}
}
3.3C#的抽象类和密封类
1)抽象方法与抽象类
2)密封类
抽象方法与抽象类
当需要定义一个抽象概念时,可以声明一个抽象类,该类只描述抽象概念的结构,而不实现每个方法。抽象类可以作为一个基类被它的所有派生类共享,而其中的方法由每个派生类去实现。
当声明一个方法为抽象方法时,则不需提供该方法的实现,但这个方法必须被派生类实现。
声明抽象方法:abstract void f1();
任何包含抽象方法的类必须被声明为抽象类。
抽象类不能直接被实例化。
声明抽象类:abstract class AC1{…}
抽象类的派生类必须实现基类中的抽象方法,或者将自己也声明为抽象的。
这是我自己上个学期整理的笔记。
整理不易,如果对你有所帮助的话,欢迎点赞+转发。
最后附上我的公众号,目前是关于文学方面的(主要是诗歌) ,里面有一些资源无偿分享,感兴趣的朋友可以关注一下。
![](https://img.haomeiwen.com/i24250691/9d9ed1d10f0aba4d.jpg)