快捷方式回顾:
1. 生成解决方案: Ctrl+Shift+B
2. 调试: F5
3. Console.WriteLine() : cw + Tab+Tab
4. 关于调试: F5 — 开始调试
Shlft+F5 --- 停止调试
F9 --- 设置或移除断点
F10 --- 单步调试
5. 方法提取:
6. 服务器资源管理器:Ctrl+Alt+S;
7. 封装字段: (Ctrl+R)+(Ctrl+E))
8. Asp.Net web应用程序从控制台输出的方法: System.Diagnostics.Debug.WriteLine(user.Name);
C#语法以及知识点回顾:
1. namespace 命名空间 java中为package
2. using 引用 相当于java中的import
3. class 类 java中为Class
4. Main 方法有四种形式:
Static void Main(string[] args){}
Static int Main(string[] args){}
Static void Main(){}
Static int Main(){}
5.C#中的数据类型: 大多数都与java中一样,
C#中的布尔类型为:bool java中为boolean
字符串类型:string 首字母小写
6.变量命名: 唯一的区别就是C#中不能以’$’开头
7.控制台输入和输出: ConsoleWriteLine(“soming”); string name = Console.ReadLine();
8.switch结构: 任何一句case都要加上break; 除非没有代码: 但是default后面一定要
break关键字
10.C#的数组声名只有一种方式: 数据类型[] 数组名 即: int[] array;
11.常用的字符串方法:
bool Equals(string value) | 比较一个字符串与另外一个字符串是否相等 |
Int Compare(stirng strA, string strB) | 比较两个字符串的大小关系 |
Int IndexOf(string value) |
|
Int LastIndexOf(string value) |
|
String Join(string separator. string[] value); |
|
String[] Split (char separator) | 用指定的分割符separator分割字符串,返回分割后的字符串组成的数组 |
String SubString(int startIndex, int length) |
|
String ToLower() |
|
String ToUper() |
|
Stirng Trim() | 去掉字符串两端的空格 |
**** string最常用的方法:
string name = ”小强”;
string msg = string.Format(“我的名字叫{0},我的年龄是{1}”, name, 18);
12.使用Convert类进行型转换:
方 法 | 说 明 |
Conver.ToInt32() | 转换为整型(int) |
ConverToSingle() | 转换为单精度浮点型(float) |
Convert.ToDouble() | 转换为双精度浮点型(double) |
Convert.ToString() | 转换为字符串类型(string类型) |
类型转换分为隐式类型转换和显示类型转换:
隐式类型转换:常用于数值之间,将范围较小的数值类型转换为范围大的数值类型
显示类型转换:常用于数值类型之间,将范围大的数值类型转换为数值范围较小的数值类型,使用小括号运算符;
Parse()方法: 将字符串转换为其他类型,用法为xxx.Parse(string)
Convert类: 任何基本类型之间的相互转换
需要注意的是: 使用Parse() 方法和Convert类进行转换的时候,如果转换没有意义,则可能会出错!
13. 在一个类中定义一个成员如果不屑访问修饰符,则默认的访问类型是private似有的
如果定义一个类,不写访问修饰符,则默认是internal访问类型
14. 在编码中快速创建属性: 在一个类中,定义一个字段,通常设定为似有,选中这个字段,右击,在弹出的快捷菜单中选择重构 à 封装字段命令(快捷键: (Ctrl+R)+(Ctrl+E))
15. 定义常量的关键字是: const
16. 枚举类型的使用:
1. 枚举的定义:
n public enum Genders
{
Male = 0, Female = 1
}
2. 枚举的使用:
n stu.Gender.ToString(); 输出的是: Male
3. 另外我们还可以从一个字符串中获取枚举的值:
n Stu.Gender = (Genders)(Enum.Parse(typeof(Genders),”Female”));
17. 结构的使用:
1. 结构的定义:
语法: 访问修饰符 struct 结构名
{
定义结构成员
}
2. 结构中可以有字段,也可以有方法
3. 在使用结构的时候,可以不用new, 直接定义就可以了, 但是必须为结构的成员赋值,直接哟个结构的名字就可以访问成员了
4. 类和结构的区别:
| 类 | 结构 |
不同点 | 引用类型 | 值类型 |
可以有属性 | 不可以有属性 | |
可以被继承 | 不能被继承 | |
可以有默认的构造函数 | 不可以有默认的构造函数 | |
可以添加无参的构造函数 | 可以添加构造函数,但是必须带参数 | |
创建对象必须使用new | 创建对象可以不用new | |
结构中给字段赋值是错误的 | 类中可以给字段赋值 | |
相同点 | 都可以包含字段,方法 | |
都可以实现接口 |
18. 索引的使用:
1. 索引的创建示例:
class MyClass
{
public MyClass(string name)
{
this.name = name;
this.students = new Student[3];
student[0] = new Student(“zhangsan”,18);
student[0] = new Student(“lisi”,28);
student[0] = new Student(“wangwu”,38);
}
// 班级名称
private string name;
public string Name
{
get{ return name; }
set{ name = value;}< /FONT >
}
// 学员集合
private Student[] students;
public Student[] Students
{
get{ return students; }
set{ students = value; }< /FONT >
}
// 创建索引
public Student this[int index]
{
get{ return student[index]; }
}
// 创建以名称索引
public Student this[string name]
{
get
{
int i;
bool found = false;< /FONT >
for( i = 0; i < students.Length; i++){< /FONT >
if(students[i].Name == name)
{
found = true;
break;
}
}
if(found)
{
return students[i];
}
else
{
Return null;
}
}
}
}
19. ArrayList 集合:
Add() 添加
RemoveAt(int index); 通过索引删除
Remove(obj); 通过对象删除
Clear() 移除所有元素
HashTable集合:
Add(object key, object value) 添加
Remove(key); 删除
// 遍历
foreach(object stuo in student.Values){
…..
}
泛型集合List<T>:
Add() 添加
RemoveAt(int index); 通过索引删除
Remove(t); 通过对象删除
Clear() 移除所有元素
泛型集合 Dictionary<K,V>:
Add(T key, T value) 添加
Remove(key); 删除
// 遍历
foreach(object stuo in student.Values){
…..
}
20. 文件读写:
If(String.IsNullOrEmpty(path) != true){< /FONT>
// 创建文件流
FileStream myFs = new FileStream(path, FileNode.Create);< /FONT >
// 创建写入器
StreamWriter mySw = new StreamWriter(myFs);< /FONT >
// 将录入的内容写入文件
mySw.Write(content);
// 关闭写入器
MySw.Close();
// 关闭文件流
MyFs.Close();
文件读入器:
// 创建文读入器
StreamReader mySr = new StreamReader(path);< /FONT >
Content = mySr.ReadToEnd();
}
21. 文件和目录操作
File类的方法
方 法 | 说 明 |
Exists(string path) | 用于检查制定文件是否存在,该方法返回一个布尔值 |
Copy(string SourceFilePath, string DestinationFilePath) | 将制定路径的源文件中的内容复制到目标文件中,如果目标文件不存在,则在制定路径中新建一个文件 |
Move(string sourceFileName, string destFileName) | 将制定文件移动到一个新的路径 |
Delete(string path) | 删除制定的文件 |
Directory类的方法
Exists(stirng path) | 用于检查指定文件夹在磁盘上是否存在 |
Move(string sourceDirName, string destDirName) | 用于将文件夹会哦目录及其内容移动到新位置 |
Delete(string, bool) | 删除制定目录,如果bool值为true,则删除子目录中的所有目录内容 |
|
|
22. XML文件解析
XmlDocument myXml = new XmlDocument();
myXml.Load(“Student.xml”); // 读取指定的XML文档
XmlNode student = myXml.DocumentElement; // 读取XML的跟节点
foreach(XmlNode nod in student.ChildNodes) // 对子节点进行循环
{
// 将每个节点的内容显示出来
Switch(node.Name)
{
Case “Name”:
…..打印出来
break;
Case “Age”:
…..打印出来
break;
}
}
操作XML的对象属性和方法
对 象 | 属性和方法 | 说 明 |
XmlDocument | DocumentElement属性 | 获取跟节点 |
ChildNodes属性 | 获取所有子节点 | |
Load()方法 | 读取整个XML的结构 | |
XmlNode | InnerText属性 | 当前节点的值 |
Nome属性 | 当前节点的名字 | |
ChildNodes属性 | 当前节点的所有子节点 |
23. base 关键字 : 它用于表示父类,可以用于访问父类的成员,例如可以调用父类的属性,调用父类的方法,调用父类的构造函数
public class Person{
private string name;
private int age;
public Person(stirng name, int age){
this.Name = name;
this.Gender = gender;
}
// 省略共有属性
}
public class Student:Person{
private Class class;
public Student(){}
public Student(string name, int age, Class class):base(name, age){
this.class = class;
}
}
常犯错误一: 这里常犯的错误是base()调用父类构造函数的时候,再次指定参数的类型,其实子类构造函数中已经定义了这些参数,在base()中只需制定变量名即可,这个变量名必须与父类中的构造函数中的一致.
常犯错误二: 如果子类的构造函数没有使用base关键字指明调用父类的那个构造函数,则父类必须提供一个默认的无参构造函数,因为子类构造函数在这种情况下会隐式调用父类的默认无参构造函数base().
24. 抽象类和抽象方法:
(1) 抽象方法是一个没有实现的方法,通过在定义方法时增加关键字abstract可以声明抽象方法;
语法:访问修饰符 abstract 返回类型 方法();
(2) 含有抽象方法的类必然是抽象类. 同样年工业用abstract关键字来定义一个抽象类
语法: 访问修饰符 abstract class 类名
注意: 抽象类中的方法并不一定都时抽象方法; 抽象类也可以容纳有具体实现的方法,或者称为具体方法,但是,含有抽象方法的类必然是抽象类,并且抽象类不能被实例化;
抽象类和抽象方法的使用:
1. 当一个抽象积累派生一个子类时,子类将集成积累的所有特征,包括它未实现的抽象方法,抽象方法必须在其子类中实现,除非它的子类也是抽象类,在子类中实现一个抽象方法的方式时使用override关键字来重写抽象方法.
语法: 访问修饰符 override 返回类型 方法()
示例: abstract public class Person // 抽象父类
{
// 省略了Person类中的属性
// ……………………………. //
// 添加的方法
Public abstract void SayHi();
}
public class Teacher : Person // 继承自抽象类的子类
{
// 省略其它成员
Pubic override void SayHi()
{
/// 方法的实现….
}
}
25. is 操作符的使用
Is 操作符用于检查对象是否与给定的类型相同. 主要的使用方法例如, 判断一个object是否是字符串类型
if ( obj is string ){
/// …. .
}
26. as操作符的使用
As 操作符用于两个对象之间的类型转换, 它类似于强制转换, 不同的是,当转换失败时,运算符将产生空,而不是引发异常;
27. 虚方法的使用:
1. 使用虚方法实现多态
在父类中定义虚方法, 然后在子类中可以重写虚方法,也实现了面向对象的多态.
虚方法时用virtual关键字修饰的,可以有方法体.
语法:
访问修饰符 virtual 返回类型 方法()
{
// 方法体
}
虚方法的实际应用:
// 重写Equals()方法 --- 比较两个对象是否相等
public override bool Equals(object obj){
// 将要比较的对象转换为当前类型
Student target = obg as Student;
// 如果为空, 类型不同
If(target == null){
Return false;
}
If(target.name == this.name&& target.age == this.age){
return true;
}
return false;
}
虚方法与抽象方法的区别
虚方法 | 抽象方法 |
用virtual 修饰 | 用abstract修饰 |
要有方法体, 哪怕是一个分号 | 不允许有方法体 |
可以被子类override | 必须被子类override |
除了密封类除外都可以写 | 之能在抽象类中 |
28. 面向对象的三大特性:
l 封装 – 保证对象自身数据的完整性, 安全性
l 继承 – 建立类之间的关系,实现代码的复用,方便系统的扩展
l 多态 – 相同的方法调用可以实现不同的实现方式
29. 接口:
接口是一组规范,一种标准,必须实现接口才能实现某种功能, 典型的应用就是将接口作为参数时,我们要传递一个实现接口的对象,另一个就是将接口作为返回值,实际上要返回的也是实现了接口的对象
抽象类与接口的区别
| 抽象类 | 接 口 |
不同点 | 用abstract定义 | 用interface定义 |
只能继承一个类 | 可以实现多个接口 | |
非抽象派生类必须实现抽象方法 | 实现接口的类必须实现所有成员 | |
需要override实现抽象方法 | 直接实现 | |
相似点 | 不能实例化 | |
包含未实现的方法 | ||
派生类必须实现未实现的非那根发 |
30. 特性: 例如:在类的上面加上[Serializable],
所谓特性就是为目标元素(可以是数据集,模块,类,属性,方法,甚至函数参数等)加入附加信息,类似于注释或者运行方式
31. 序列化: 序列化是将对象的状态存储到特定存储介质中的过程,也可以说是将对象状态转换为可保持或者传输的格式的过程,在序列化过程中,会将对象的共有成员,私有成员,包括类名,都转换成数据流的形式,存储到介质中,这里说的介质通常指的的是文件
语法: public void Serialize(Stream serializationStream, object graph)
这个方法的主要功能是将特定对象序列化到特定文件中,具体参数如下:
** serializationStream 是指定序列话过程的文件流
** graph是要保存的对象
示例: FileStream fileStream = null;
// 定义一个文件流
fileStream = new FileStream(“profile.bin”, FileMode.Create);
// 二进制方式
BinaryFormatter bf = new BinaryFormatter();
// 序列化保存配置文件对象Profile
Bf.Serialize(fileStream, Profile);
32. 反序列化: 顾名思义就是与序列化相反
语法: public object Deserialize(Stream serializationStream)
示例: public void Load()
{
FileStream fileStream = null;
fileStream = new FileStream(“profile.bin”, FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();
Profile = (Profile)bf.Deserialize(fileStream)
}
ADO.NET
l ADO.NET的主要组件:
n .NET.Framework 数据提供程序是专门为数据处理以及快速地进行只读访问数据而设计的组建,使用它,我们可以连接到数据库,执行命令和检索结果,直接对数据库进行操作
n DataSet是专门为独立于任何数据源的数据访问而设计的,使用它,我们可以不必直接和数据库打交到,可以大批量地操作数据,也可以将数据绑定在控件上
l .NET Framework数据提供程序的四个核心对象:
n Connection 建立与特性数据源的连接,不同的.NET数据提供程序都有自己的连接类
n Connection对象的主要属性和方法:
属 性 | 说 明 |
ConnectionString | 用于连接数据库的连接字符串 |
方 法 | 说 明 |
Open | n |
Close | n |
l 连接数据库一般分为三步:
n 第一步得到连接字符串:
1. 在VS中,选择菜单中的”视图”-à “服务器资源管理器”选项,快捷方式为Ctrl+Alt+S;
2. 添加新的连接
3. 右键属性,窗口里面就可以找到连接字符串了
n 第二步,创建Connection对象
u SqlConnection connection = new SqlConnection(connString);
n 第三步, 打开数据库的连接
u connection.Open()
n 最后记得关闭
n Command对象
u Command对象的主要属性和方法
属 性 | 说 明 |
Connection | Command对象使用的数据库连接 |
CommandText | 执行的SQL语句 |
方 法 | 说 明 |
ExecuteNonQuery | 执行不返回行的语句,如UPDATE等 |
ExecuteReader | 执行查询命令,返回DataReader对象 |
ExecuteScalar | 返回单个值,如执行COUNT(*) |
n DataReader对象
n 主要属性和方法
属 性 | 方 法 |
HasRows | 是否返回了结果,如果有查询结果返回True,否则返回false |
FieldCount | 当前行中的列数 |
方 法 | 说 明 |
Read | 前进下一行记录,如果读到记录返回True,否则返回false |
Close | 关闭DataReader对象 |
n 使用DataReader对象的步骤如下:
1. 创建Command对象
2. 调用Command对象的ExecuteReader()方法创建DataReader对象.
SqlDataReader dataReader = command.ExecuteReader();
3. 使用DataReader的Read()方法逐行读取数据
这个方法返回一个布尔值,如果能读到一行记录,就返回true,否则返回false
dataReader.Read();
4. 读取当前行的某列数据: (stirng)dataReader[“StudentName”];
5. 关闭DataReader对象,调用它的Close()方法
n DataSet对象
n 如何创建:
u 语法: DataSet 数据集对象 = new DataSet(“数据集的名称字符串”);
u 方法中的参数 数据集的名称字符串 可以有,也可以没有,如果没有参数,创建数据集的名称就默认为NewDataSet.例如:
DataSet myDataSet = new DataSet(); 或
DataSet myDataSet = new DataSet(“mySchool”);
n DataAdapter对象
n DataAdapter对象的作用就是将数据放到DataSet中
n 数据适配器从数据库读取数据,是通过一个Command命令来实现的,它是数据适配器的一个属性SelectCommand. 把数据放在数据集中,需要使用DataAdapter的Fill()方法(Fill:填充).反过来,要把DataSet中修改过的数据保存到数据空,需要使用Update()方法(Update:更新)
n 填充数据集的具体步骤如下:
1. 创建数据库连接对象(Connection对象)
2. 创建从数据库查询数据用的SQL语句
3. 利用上面创建的SQL语句和Connection对象创建DataAdapter对象
语法: SqlDataAdapter 对象名 = new SqlDataAdapter(查询用的SQL语句, 数据库连接);
4. 调用DataAdapter对象的Fill()方法填充数据集
语法: DataAdapter对象.Fll(数据集对象,”数据表名称字符串”);
n 如何保存数据集中的数据
1. 使用SqlCommandBuilder对象生成更新用的相关命令
语法: SqlCommandBuilder builder = new SqlCommandBuilder(已创建的DataAdapter对象);
2. 调用DataAdapter对象的Update()方法
语法: DataAdapter对象.Update(数据集对象,”数据表名称字符串”);
3. 例如:
SqlCommandBuilder builder = new SqlCommandBuilder(dataAdapter);
dataAdapter.Update(dataset, “Teacher”);
n DataSet的另一种创建方法:
u 通过手动编码自定义DataTable(数据表), DataColumn(数据列),DataRow(数据行),然后将数据表添加到DataSet中
u DataTable
l DataTable是内存中的一个关系数据表,可以独立创建使用,也可以作为DataSet的一个成员使用,
示例:
// 创建一个新的空班级DataSet
DataSet dsClass = new DataSet();
// 创建班级表
DataTable dtClass = new DataTable(“Class”);
// 将班级表添加到DataSet中
dsClass.Tables.Add(dtClass);
注意: 我们定义表名时一定要避免表名重复,如果提供的表名在DataSet中已经存在,就会引发异常
u DataColumn
l DataColumn是创建DataTable的基础,我们通过向DataTable中添加一个或多个DataColumn对象来定义DataTable的结构.DataColumn有一些常用属性用于对输入数据的限制,例如:数据类型,数据长度,默认值
l DataColumn的常用属性
属 性 | 说 明 |
AllowDBNull | 是否允许空值 |
ColumnName | DataColumn的名称 |
DataType | 存储的数据类型 |
MaxLength | 获取或设置文本列的最大长度 |
DefaultValue | 默认值 |
Table | 所属的DataTable的名称 |
Unique | DataColumn的值是否唯一 |
n 定义DataColumn的两种方法
n 第一种方法:
u DataColumn className = new DataColumn();
u className.ColumnName = “ClassName”;
u className.DataType = System.Type.GetType(“System.String”);
u className.MaxLength = 50;
n 第二种方法:
n DataColumn className = new DataColumn(“ClassName”,typeof(string));
n className.MaxLength = 50;
u DataRow
n DataRow表示DataTable中包含的实际数据,我们可以通过DataRow将数据添加到用DataColumn定义号DataTable中
u 自定义DataSet的步骤如下:
n 1. 创建DataSet对象
n 2. 创建DataTable对象
n 3. 创建DataColumn对象结构表结构
n 4. 将创建号的表结构添加到表中
n 5. 创建DataRow对象新增数据
n 6. 将数据插入列表中
n 7. 将表添加到DataSet中
n 示例:
// 创建一个新的空班级DataSet
DataSet dsClass = new Data();
// 创建班级表
DataTable dtClass = new DataTable(“Class”);
// 创建磅级名称列
DataColumn dcClassName = new DataColumn(“ClassName”,typeof(string));
className.MaxLength = 50;
// 创建年级ID列
DataColumn dcGradeID = new DataColumn(“GradeID”, typeof(int));
// 将定义好的列添加到班级表中
dtClass.Columns.Add(dcClassName);
dtClass.Columns.Add(dcClassID);
// 创建一个新的数据行
DataRow drClass = dtClass.NewRow();
drClass[“className”] = “AS0806”;
drClass[“gradeID”] = 12;
// 将新的数据行插入班级表中
dtClass.Rows.Add(drClass);
// 将班级表添加到DataSet中
dsClass.Tables.Add(dtClass);
u 获得DataSet中的数据方式
n 第一步, 通过表名, 从DataSet中获取指定的DataTable
n 第二步, 通过索引, 从DataTable中获取指定的DataRow
n 第散步, 通过列名, 从DataRow中获取指定列的数据
n
示例:
// 得到班级名称
dsClass.Tables[“Class”].Rows[0][“ClassName”];
命名规范:
1. 为控件命名:
Label为 lbl
TextBox为 txt
GridView dgv
CheckBox chb
RadioButton为rdo
类名 首字母大写
方法名 首字母大写