[1]C#/.NET傻瓜式基础快速入门课程
https://www.bilibili.com/video/av66807860
00. vs ide 基本介绍
00.1 使用 debug 与 release 的不同
调试文件夹中的文件内容,包括调试文件,编译文件以及配置文件
01. 命名空间、类、主方法
02. 注释
单行注释、多行注释、块注释
/***/多行注释
//单行注释
///<summary>
///</summary>文档注释
#region 测试方法集合
#endregion
03. 变量类型 与 数据结构
-
基本的数据类型
int 4个字节
double
float
char类型
-
拼接
字符与其他的类型的变量用+进行运算表示拼接
-
占位符
c#支持占位符
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _04数据类型 { class Program { static void Main(string[] args) { int roomNo; roomNo = 1; double price = 300.1; char sex = \'女\'; string roomType = "总统套房"; Console.WriteLine("房间类型:{0};价格:{1}", roomType, price); } } }
实际上,上述的程序还可以这样写
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _04数据类型 { class Program { static void Main(string[] args) { int roomNo; roomNo = 1; double price = 300.1; char sex = \'女\'; string roomType = "总统套房"; //Console.WriteLine("房间类型:{0};价格:{1}", roomType, price); Console.WriteLine($"房间类型:{roomType};价格:{price}" ); } } }
04. 变量的命名规则
-
pascal命名法 每个单词的首个字母大写
类名、方法名、接口、属性
-
canel驼峰命名法 从第二个单词开始,首字母大写
变量名
-
C#的命名只能是数字、下划线、和字母
但是不能使用数字开头
-
见名知义
05. 运算符的优先级及使用
-
算数运算符
+ - * / %
-
关系运算符
> < == != >= <=
-
逻辑运算符
|| && !
-
赋值运算符
=
06. 占位符的使用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _07占位符的使用
{
class Program
{
static void Main(string[] args)
{
string me;
me = Console.ReadLine();
string message;
message = string.Format("今天上班遇到了“{0}”", me);
Console.Write(message);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _07占位符的使用
{
class Program
{
static void Main(string[] args)
{
string me;
me = Console.ReadLine();
string message;
//message = string.Format("今天上班遇到了“{0}”", me);
message = $"今天上班遇到了“{me}”";
Console.Write(message);
}
}
}
07. 选择结构之if else
08. 选择结构之switch
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _09switch选择语句
{
class Program
{
static void Main(string[] args)
{
int age = 2;
switch (age)
{
case 1:
Console.WriteLine($"小朋友今年一岁了");
break;
case 2:
Console.WriteLine($"小朋友今年两岁了");
break;
default:
break;
}
}
}
}
09. 选择练习
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10银行账户系统
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("--------------------------------欢迎登录银行账户系统--------------------------------");
Console.Write("请输入帐号:");
string account = Console.ReadLine();
Console.Write("请输入密码:");
string passWord = Console.ReadLine();
if (account == "123456" && passWord == "abc")
{
Console.WriteLine("登录成功!");
Console.WriteLine("请选择服务菜单:1、查询余额;2、取款;3、存款;4转账");
int menuId = int.Parse(Console.ReadLine());
switch (menuId)
{
case 1:
Console.WriteLine("您的用户余额是:50000");
break;
case 2:
Console.WriteLine("请输入取款金额:");
break;
case 3:
Console.WriteLine("请输入存款金额:");
break;
case 4:
Console.WriteLine("请输入转账金额:");
break;
default:
break;
}
}
else
Console.WriteLine("密码或帐号错误,请重新输入!");
}
}
}
10. while循环
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _10while循环
{
class Program
{
static void Main(string[] args)
{
int count = 1;
while(count < 10)
{
Console.WriteLine($"张三简历{count} 姓名:张三");
count += 1;
}
}
}
}
11. do while 循环
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _11dowhile循环
{
class Program
{
static void Main(string[] args)
{
int score;
do
{
Console.WriteLine("请输入张三的成绩:");
score = int.Parse(Console.ReadLine());
if (score<60)
Console.WriteLine("考试不合格,重新补考");
} while (score < 60);
Console.WriteLine("考试通过!");
}
}
}
12. for循环
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _12for循环
{
class Program
{
static void Main(string[] args)
{
for (int i =1;i<=10;i++)
{
Console.WriteLine($"打印第{i}份");
}
}
}
}
13. 循环进阶部分
14. 九九乘法表
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _14九九乘法表
{
class Program
{
static void Main(string[] args)
{
for (int i = 0;i<9;i++)
{
for ( int j = 0;j<=i;j++)
{
Console.Write((j+1) + "x" + (i+1) + "=" + ((i+1)*(j+1)));
Console.Write("\t");
}
Console.Write("\n");
}
}
}
}
15. C# 基础数组的使用和理解
-
用于存储一组数据类型相同的数据,可以称之为数组
-
数组的四要素
数组标识符、数组元素、数组下标、数组类型
-
数组一旦初始化,就不能再修改数组长度
-
注意不要让数组下标越界
-
数组的长度等直接封装成方法了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _15数组的基本理解
{
class Program
{
static void Main(string[] args)
{
string name1 = "张三";
string name2 = "李四";
Console.WriteLine(name1 + name2);
// --------------------------------
string[] names = new string[30];
names[0] = "张三";
names[1] = "李四";
names[2] = name1;
Console.WriteLine(names[2]);
// --------------------------------
string[] names1 = new string[]{"张三","李四","王五"};
Console.WriteLine(names1[2]);
for (int i = 0;i<names1.Length;i++)
{
Console.WriteLine(names1[i]);
}
}
}
}
16. 类和对象
- 类 :抽象的(模板) 不占用内存空间
- 对象:具体的(真是存在的)对象占用内存空间
代码块1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _16类和对象
{
class Program
{
static void Main(string[] args)
{
//创建一个学生
Student student1 = new Student();
student1.Name = "张三";
student1.Age = 22;
student1.Sex = \'男\';
student1.Phone = "18889u9897987";
Student student2 = new Student();
student2.Name = "李四";
student2.Age = 212;
student2.Sex= \'女\';
student2.Phone = "188899897987";
Console.WriteLine($"姓名:{student2.Name}{student2.Age}");
Student[] students = new Student[] { student1, student2 };
for (int i =0;i<students.Length;i++)
{
Console.WriteLine($"学生姓名:{students[i].Name},学生性别:{students[i].Sex}");
students[i].xtxi();
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _16类和对象
{
public class Student
{
// 静态特征:用来描述
/// <summary>
/// 学生姓名
/// </summary>
public string Name;
/// <summary>
/// 学生年龄
/// </summary>
public int Age;
/// <summary>
/// 性别
/// </summary>
public char Sex;
/// <summary>
/// 电话
/// </summary>
public string Phone;
// 动态特征
/// <summary>
/// 学习(相当于功能 方法 动态特征)
/// </summary>
public void xtxi()
{
Console.WriteLine(this.Name+"正在看书");
}
}
}
17. 无参方法
如果没有返回值,就用void;如果有返回值,就用int、string等,但是返回的要与定义的类型相一致。
18. 带参方法
方法里面有参数,主要是可以将参数值直接传入方法或者函数中,这种较为常规
主函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _18带参方法
{
class Program
{
static void Main(string[] args)
{
Lamp lamp = new Lamp();
lamp.Open();
lamp.Close();
Zhazhiji zhazhi = new Zhazhiji();
string fruit = zhazhi.Zhazhi("苹果");
Console.WriteLine(fruit);
}
}
}
子函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _18带参方法
{
/// <summary>
/// 榨汁机类
/// </summary>
public class Zhazhiji
{
/// <summary>
/// 形成榨汁机
/// </summary>
/// <param name="fruit">水果</param>
/// <returns></returns>
public string Zhazhi(string fruit)
{
string result = fruit + "汁";
return result;
}
}
}
19. 流程控制关键字
-
break
可以用于switch while if 中
-
continue
循环中
-
return
通常是在方法中使用
静态方法中不能调用非静态的任何成员?
结束当前方法、可以返回计算结果 都是用来控制整个程序运行过程中的命令
20. 访问修饰符
private 属性和方法默认的是这个 只能自己类的内部访问
protected 可以被继承
internal 类默认是这个 在同一个命名空间可以使用 或者说在同一个项目中可以使用
public 可以随便调用
继承之后 用 base.Name
主程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using testProject;//引用另外一个项目
namespace _20访问修饰符
{
class Program
{
static void Main(string[] args)
{
// --------------------------------教师类实例化
Teacher tea1 = new Teacher();
tea1.Test();
// --------------------------------学生类实例化
Student stu1 = new Student();
stu1.StudentName="张x三";
Console.WriteLine(stu1.StudentName);
}
}
}
同命名空间 类1 基类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20访问修饰符
{
/// <summary>
/// 定义雇员类
/// </summary>
class Employee
{
protected string Name;
}
}
同命名空间 类2 子类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20访问修饰符
{
/// <summary>
/// 定义继承于雇员的教师类
/// </summary>
internal class Teacher:Employee
{
/// <summary>
/// 定义公有方法,test
/// </summary>
public void Test()
{
Name = "张三";
Console.WriteLine(Name);
}
}
}
其他命名空间 引用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace testProject
{
/// <summary>
/// 定义学生类
/// </summary>
public class Student
{
public string StudentName;
}
}
21. vs调试运行
F5调试运行
F10逐步调试
F11逐句调试 如果有方法,会直接调入到方法之中
22. 引用类型和值类型
值类型一般都是基于两个基类,分别是System.ValueType和Object
-
System.ValueType
值类型:int short long float double decimal char bool enum struct
注意:在声明变量的时候,编译器始终会给他分配内存空间 存储于栈
-
Object
引用类型:object string Array(int[]) class interface 委托delegate
注意:在声明或者定义变量的时候,编译器会存储一个地址,地址存放于栈 在信息存储于堆
主函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _22引用类型和值类型
{
class Program
{
static void Main()
{
Dog dog = new Dog();//实例化
dog.age = 8;
ChangeDogAge(dog);
Console.WriteLine(dog.age);
int age = 19;
ChangeAge(age);
Console.WriteLine(age);
Console.Read();
}
public static void ChangeAge(int age)
{
age = 20;
}
public static void ChangeDogAge(Dog dog2)
{
dog2.age = 5;
}
}
}
同命名空间的子类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _22引用类型和值类型
{
class Dog
{
public string Name;
public string Color;
public int age;
public void Read()
{
Console.WriteLine($"{this.Color}的{this.Name}在学习");
}
}
}
23. 引用传参
对于值类型,其在方法中传递的时候,通常是值传递,如果想要变成地址传递,则需要在前面加上ref ,从而实现地址传递
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _23引用传参
{
class Program
{
static void Main(string[] args)
{
int num1 = 1;
int num2 = 2;
Console.WriteLine($"交换前:{num1}-{num2}");
Swap(ref num1, ref num2);
Console.WriteLine($"交换后:{num1}-{num2}");
Console.Read();
}
public static void Swap(ref int num1,ref int num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
}
}
24. 类型转换
-
数字类型之间的转换
包括隐式转换和显示转换,其中隐式转换也成为自动转换,显示转换称之为强行转换
-
字符串转换为数字类型 Parse TryParse
-
将任意类型转换为指定类型
Convert.ToInt32()可以实现将任何类型转换为该类型
-
字符类型
char类型可以直接转换为数字
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _24类型转换
{
class Program
{
static void Main(string[] args)
{
// --------------------------------数字类型之间的相关转换
//int price1 = 100;
//double price2 = price1;// 隐式转换
//int price3 =(int) price2;// 显式转换
// --------------------------------字符串类型转换为数字类型
//Console.Write("请输入一个学生的年龄:");
//int age = int.Parse(Console.ReadLine());
//Console.WriteLine($"学生的年龄是:{age}");
// --------------------------------字符串类型转换为数字类型 异常捕获
//Console.Write("请输入一个学生的年龄:");
//int age;
//bool result = int.TryParse(Console.ReadLine(),out age);
//if (result)
// Console.WriteLine($"学生的年龄是:{age}");
//else
// Console.WriteLine("输入的不是数字!");
//--------------------------------将任意类型转换为指定类型
object str = "123";
int money = Convert.ToInt32(str);
Console.WriteLine(money);
//--------------------------------将字符串转换为时间类型
object str1 = "1993年1月12日";
DateTime money1 = Convert.ToDateTime(str1);
Console.WriteLine(money1);
}
}
}
25. 字符串的处理方法
主要是字符串的一些封装好的方法
.IndexOf() // 从前面开始找
.LastIndexOf() // 从后面开始找
.Substring(index) //从指定的数字之后的字符串
.ToLower() //转换为小写
.ToUpper() // 转换为大写
判断对比的时候 == 对比的是地址 equals 对比的是值
如果是引用类型的话,两个是一样 字符串和对象 最好用equals
.Join() // string 的函数,按照指定的连接方式,将字符串数组进行连接
.Split() //作用于数组,将数组按照指定的字符进行分割
.Trim() // 去掉两端的空格
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _25字符串的处理方法
{
class Program
{
static void Main(string[] args)
{
// -------------------------------- 获取指定的字符所在的index
// 字符串的处理方式
// IndexOf()
string email = "mrxiuhong@163.com";
int index = email.LastIndexOf(\'@\');
//int index = email.IndexOf(\'d\');
if (index < 0)
System.Console.WriteLine("所查找的字符不存在!");
else
System.Console.WriteLine($"@所在的位置是{index}");
string substring = email.Substring(index + 1);
Console.WriteLine(substring.ToUpper());
// --------------------------------字符的对比
if (email.Equals("mrxiuhong@qq.com"))
Console.WriteLine("值相等");
else
Console.WriteLine("值不相等");
// -------------------------------- 数组连接
string[] newStr = new string[] { "abc", "edf" };
string str = string.Join("-",newStr);
Console.WriteLine($"数组连接{str}");
// -------------------------------- 数组分割
string[] newStr1 = str.Split(\'-\');
for (int i =0;i<newStr1.Length;i++)
Console.WriteLine($"数组分割{newStr1[i]}");
// -------------------------------- 空格的问题
string myStr = Console.ReadLine();
if (myStr.Equals("mrxiuhong"))
{
Console.WriteLine("正确");
}
else
{
Console.WriteLine("错误");
}
// -------------------------------- Trim() 把 两端的空格去掉
if (myStr.Trim().Equals("mrxiuhong"))
{
Console.WriteLine("正确");
}
else
{
Console.WriteLine("错误");
}
}
}
}
26. 对象数组
数组可以存放一组相同类型的数据
对象数组可以存放不同类型的数据
所谓的对象数组就是将类 构成一个数组 这个数组中,可以包括不同类型的属性
Program 类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _26对象数组
{
class Program
{
static void Main(string[] args)
{
// -------------------------------- 常规的数组类型--------------------------------
string name = "张三";
string[] names = new string[] { "张三", "李四", "王五" };
int[] ages = new int[] { 12, 15, 23 };
// -------------------------------- 对象数组 --------------------------------
Student[] students = new Student[30];
// --------------------------------学生1
Student stu1 = new Student();
stu1.StuName = "张三";
stu1.ClassName = "一年级";
stu1.Age = 14;
stu1.StuNum = "S12090414";
// --------------------------------学生2
Student stu2 = new Student();
stu2.StuName = "李四";
stu2.ClassName = "二年级";
stu2.Age = 20;
stu2.StuNum = "22090414";
// -------------------------------- 将学生放置于数组之中
students[0] = stu1;
students[1] = stu2;
// -------------------------------- 学生数组的打印
for (int i = 0; i < students.Length; i++)
{
Student stu = students[i];
if (stu!=null)
Console.WriteLine($"{students[i].StuName}的年龄是{students[i].Age},在{students[i].ClassName},学号是{students[i].StuNum}");
}
}
}
}
Student类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _26对象数组
{
class Student
{
/// <summary>
/// 编号
/// </summary>
public string StuNum;
/// <summary>
/// 姓名
/// </summary>
public string StuName;
/// <summary>
/// 年龄
/// </summary>
public int Age;
/// <summary>
/// 班级
/// </summary>
public string ClassName;
}
}
27. 构造方法
构造方法与常规的方法的差别在于:
- 构造方法的名称与类的名称一致(如果写了一个构造方法,则原有的构造方法将被销毁)
- 构造方法是没有返回值的
- 当手动定义构造方法的时候,默认的构造方法自动覆盖
- 构造方法在构造的时候,默认执行
构造方法通常为初始化使用
Program类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _27构造方法
{
class Program
{
static void Main(string[] args)
{
// -------------------------------- 常规的数组类型--------------------------------
string name = "张三";
string[] names = new string[] { "张三", "李四", "王五" };
int[] ages = new int[] { 12, 15, 23 };
// -------------------------------- 对象数组 --------------------------------
Student[] students = new Student[30];
// --------------------------------学生1
Student stu1 = new Student();
stu1.StuName = "张三";
stu1.ClassName = "一年级";
stu1.Age = 14;
stu1.StuNum = "S12090414";
// --------------------------------学生2
Student stu2 = new Student();
stu2.StuName = "李四";
stu2.ClassName = "二年级";
stu2.Age = 20;
stu2.StuNum = "22090414";
// --------------------------------学生3
Student stu3 = new Student("S16020279","韩秀虹","研16-3班",26);
// -------------------------------- 将学生放置于数组之中
students[0] = stu1;
students[1] = stu2;
students[2] = stu3;
// -------------------------------- 学生数组的打印
for (int i = 0; i < students.Length; i++)
{
Student stu = students[i];
if (stu != null)
Console.WriteLine($"{students[i].StuName}的年龄是{students[i].Age},在{students[i].ClassName},学号是{students[i].StuNum}");
}
}
}
}
Student类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _27构造方法
{
class Student
{
public Student()
{
}
public Student(string stuNum,string stuName,string className,int age)
//public Student()
{
this.StuName = stuName;
this.StuNum = stuNum;
this.Age = age;
this.ClassName = className;
}
public void XueXi()
{
}
public string StuNum;
public string StuName;
public string ClassName;
public int Age;
}
}
Dog类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _27构造方法
{
class Dog
{
public string Name;
public string Color;
public int Age;
public bool Run()
{
System.Console.WriteLine($"{this.Color}的{this.Name}跑起来");
bool result = true;
return result;
}
}
}
28. 方法重载
定义:在同一个类中,方法的名称相同,参数的个数或者类型不同(返回值不参与定义讨论)
Program类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _28方法重载
{
class Program
{
static void Main(string[] args)
{
// -------------------------------- 常规的数组类型--------------------------------
string name = "张三";
string[] names = new string[] { "张三", "李四", "王五" };
int[] ages = new int[] { 12, 15, 23 };
// -------------------------------- 对象数组 --------------------------------
Student[] students = new Student[30];
// --------------------------------学生1
Student stu1 = new Student();
stu1.StuName = "张三";
stu1.ClassName = "一年级";
stu1.Age = 14;
stu1.StuNum = "S12090414";
// --------------------------------学生2
Student stu2 = new Student();
stu2.StuName = "李四";
stu2.ClassName = "二年级";
stu2.Age = 20;
stu2.StuNum = "22090414";
// --------------------------------学生3================================
Student stu3 = new Student("S16020279","韩秀虹","研16-3班",26);
stu3.XueXi(stu3.StuName);
// -------------------------------- 将学生放置于数组之中
students[0] = stu1;
students[1] = stu2;
students[2] = stu3;
// -------------------------------- 学生数组的打印
for (int i = 0; i < students.Length; i++)
{
Student stu = students[i];
if (stu != null)
Console.WriteLine($"{students[i].StuName}的年龄是{students[i].Age},在{students[i].ClassName},学号是{students[i].StuNum}");
}
}
}
}
Dog类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _28方法重载
{
class Dog
{
public string Name;
public string Color;
public int Age;
public bool Run()
{
System.Console.WriteLine($"{this.Color}的{this.Name}跑起来");
bool result = true;
return result;
}
}
}
Student类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _28方法重载
{
class Student
{
public Student()
{
}
public Student(string stuNum,string stuName,string className,int age)
//public Student()
{
this.StuName = stuName;
this.StuNum = stuNum;
this.Age = age;
this.ClassName = className;
}
public void XueXi()
{
Console.WriteLine("开始学习");
}
public void XueXi(string name)
{
Console.WriteLine($"{name}开始学习");
}
public string StuNum;
public string StuName;
public string ClassName;
public int Age;
}
}
29. ArrayList集合
在使用前,应该 using System.Collections
与数组的差别在于,集合的长度是可以变化的,并不像数组一样,都是固定的
-
添加
.Add();
注意:在设置集合的时候,集合中的元素为集合的类型 , 需要通过强制转换将元素转换为实际的类型 -
删除
.RemoveAt(index);
主程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace _29ArrayList集合
{
class Program
{
static void Main(string[] args)
{
Student stu1 = new Student("S16020279","韩秀虹","研1603班",26);
Student stu2 = new Student("S16020278","冯伟","研1603班",26);
ArrayList arrayList = new ArrayList();
arrayList.Add(stu1);
arrayList.Add(stu2);
Console.WriteLine("----修改前----");
for (int i =0;i<arrayList.Count;i++)
{
Student stu = (Student) arrayList[i];
System.Console.WriteLine(stu.ClassName+\'-\'+stu.StuName);
}
// --------------------------------修改↓
Student fengWei = (Student)arrayList[1];
fengWei.Age = 22;
fengWei.StuName = "李四";
fengWei.ClassName = "理科实验班4班";
// --------------------------------修改↑
Console.WriteLine("----修改后----");
for (int i = 0; i < arrayList.Count; i++)
{
Student stu = (Student)arrayList[i];
System.Console.WriteLine(stu.ClassName + \'-\' + stu.StuName);
}
// -------------------------------- 删除
arrayList.RemoveAt(1);
Console.WriteLine("----删除后----");
for (int i = 0; i < arrayList.Count; i++)
{
Student stu = (Student)arrayList[i];
System.Console.WriteLine(stu.ClassName + \'-\' + stu.StuName);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _29ArrayList集合
{
class Student
{
public Student()
{
}
public Student(string stuNum,string stuName,string className,int age)
//public Student()
{
this.StuName = stuName;
this.StuNum = stuNum;
this.Age = age;
this.ClassName = className;
}
public void XueXi()
{
Console.WriteLine("开始学习");
}
public void XueXi(string name)
{
Console.WriteLine($"{name}开始学习");
}
public string StuNum;
public string StuName;
public string ClassName;
public int Age;
}
}
30. Hashtable集合
需要调用System.Collections;
哈希表,无序,通过键值对的方式进行使用
.Add() //添加键值对
.Remove()//删除键
取值:Student stu = (Student) ht[“keys”];
foreach (val obj in ht.Values)
{
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace _30Hashtable集合
{
class Program
{
static void Main(string[] args)
{
Hashtable ht = new Hashtable();
Student stu1 = new Student("S1", "张三", "三班", 16);
Student stu2 = new Student("S2", "李四", "四班", 16);
Student stu3 = new Student("S3", "王五", "五班", 16);
ht.Add("学生1", stu1);
ht.Add("学生2", stu2);
ht.Add("学生3", stu3);
// -------------------------------隐式转换类型
foreach (Student stu in ht.Values)
{
Console.WriteLine(stu.StuName);
}
// --------------------------------显式转换类型
foreach (Object obj in ht.Values)
{
Student stu = (Student)obj;
Console.WriteLine(stu.StuName);
}
// -------------------------------key
foreach (string stu in ht.Keys)
{
Console.WriteLine(stu);
}
//--------------------------------取值
Student myStu =(Student) ht["学生1"];
Console.WriteLine(myStu.StuName);
}
}
}
31. 泛型集合list
需要实现调用:using System.Collections.Generic;
List 可以直接形成T类型的数组
可以不用进行类型转换,就直接是T类型
- 省了 装箱拆箱、类型转换,可以大幅提高性能
- 数据操作比较安全
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Collections;
namespace _31泛型集合list
{
class Program
{
static void Main(string[] args)
{
/*
* List泛型集合
*
* 数组:用于存放一组数据类型相同的值,缺点是,长度不可变
*
* ArrayList:长度可变,缺点:存放的值是Object类型,Object是许多类型的基类;可以存放任意的值
*/
// -------------------------------- arraylist 如果在集合中添加了一个其他类型的数组,其实也可以添加,但是读取的时候就麻烦了
ArrayList studentList = new ArrayList();
studentList.Add(new Student("S1", "张三", "三班", 16));
studentList.Add(new Student("S2", "李四", "三班", 16));
studentList.Add(new Student("S3", "王五", "三班", 16));
foreach (Student stu in studentList)
{
Console.WriteLine(stu.StuName);
}
// -------------------------------- 数组 数组不可以添加其他类型的元素 数组长度不可变
// -------------------------------- List类型
List<Student> stuList = new List<Student>();
stuList.Add(new Student("S1", "张三", "三班", 16));
stuList.Add(new Student("S2", "李四", "三班", 16));
stuList.Add(new Student("S3", "王五", "三班", 16));
for (int i =0;i<stuList.Count;i++)
{
Console.WriteLine(stuList[i].StuName);
}
}
}
}
32. 泛型字典集合Dictionary
using System.Collections.Generic;
这个与hashtable的差别就是
Dictionary<string, Student> dict = Dictionary<string, Student> ();
差别在于避免了装箱拆箱
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace _32Dictionary泛型字典集合
{
class Program
{
static void Main(string[] args)
{
/*
* arraylist
* hashtable
* list<t>
* dictionary<t,k>
* */
Student stu1 = new Student("S1", "张三", "三班", 16);
Student stu2 = new Student("S2", "李四", "四班", 18);
Student stu3 = new Student("S3", "王五", "五班", 20);
Dictionary<string, Student> dict = new Dictionary<string, Student>();
dict.Add("学生1", stu1);
dict.Add("学生2", stu2);
dict.Add("学生3", stu3);
Student stu = dict["学生1"];
Console.WriteLine(stu.StuName);
}
}
}
33. sqlServer的安装与使用
下载sqlServer2014 网址
安装步骤:网址
安装成功之后,使用SQL Server 2014 Management Studio打开
34. SQL配置详解
登录
登录的时候,可以选择本地登录或者远程登录,身份验证的方式有两种,分别是windows管理员和用户密码登录
第一次登录,需要在安全性中对登录名进行设置,最大权限是sysadmin
开启混合登录
开启TCP/IP协议
只有开启tcp/ip协议,才能进行远程数据库连接
35. 数据库基本概念
(1)基本信息
区别:数据库与数据库工具
基本概念:
- 持久化:永久保存在物理磁盘
- 临时存储:存储在内存中
记事本、word、excel、ppt等都是无序的,数据库是有序的
网上的数据都是从数据库中动态读取的
建立数据库:相当于建立一个数据仓库
.mdf文件为存放数据的文件
数据库的删除:
数据库的附加
(2)表
为了避免重复,要设置ProductNum为主键
编辑的时候,可以往里面添加相关的数据
手动添加的非常少,一般来说都是通过脚本进行操作:增、删、改、查
36. 使用T-SQL脚本
主键
use JINGDONGDB
go
— 注释
-- 添加 T-SQL
insert into Product(ProductNum,ProductName,ProductImage,ProductPrice)
values(1003, \'华为MATE20\',\'/IMAGE/MATE20.JPG\',9000)
-- 删除 delete from可以删除 数据永久更新操作
delete from Product
where ProductNum=1002
-- 修改 update 其中 where是条件,在每个地方都可以使用
update Product
set ProductName = \'mate30\',ProductImage = \'/huawei.new.jpg\'
where ProductNum = 1003
-- 查询 常见的有三种,一条、多条、聚合函数
-- select * from Product -- 其中 * 表示所有的字段
select ProductNum,ProductName from Product
-- where ProductNum > 1000
where ProductNum > 1000 or ProductPrice >5000
-- and
-- or
--
37. 数据的关联性
- 构建一个表
- 在原表中添加列名
- 设置主键表与外键表之间的对应
- 关系
通过上述三个步骤,可以将数据进行关联
38. 表联接查询
表的联接方式分为几种,分别是内联接、左外联接、右外联接
- 内联接
-- 内联接 inner join
select ProductNum, ProductName, ProductImage, ProductPrice, Product.typeId,ProductType.typeName
from Product inner join ProductType
on(Product.typeId = ProductType.typeId) -- 主要是通过主表和值表的联接的id进行联接 对于其中的主表中的其他的id都没有显示
-- 内联接 inner join 无限扩充
select ProductNum, ProductName, ProductImage, ProductPrice, Product.typeId,ProductType.typeName
from Product
inner join ProductType
on(Product.typeId = ProductType.typeId) -- 主要是通过主表和值表的联接的id进行联接 对于其中的主表中的其他的id都没有显示
inner join brand
on (Product.brandId = brand.brandId)
-- 内联接 的第二种方式 inner join 在原理上 以及 性能上 基本上一样
select ProductNum, ProductName, ProductImage, ProductPrice, Product.typeId,ProductType.typeName
from Product , ProductType
where Product.typeId = ProductType.typeId -- 主要是通过主表和值表的联接的id进行联接 对于其中的主表中的其他的id都没有显示
- 左外联接
-- 左外联接 left join 以左表为基准进行显示,如果匹配到了,则显示,否则不显示
select ProductNum, ProductName, ProductImage, ProductPrice, Product.typeId,ProductType.typeName
--from Product left join ProductType
from ProductType left join Product
on(Product.typeId = ProductType.typeId) -- 主要是通过主表和值表的联接的id进行联接 对于其中的主表中的其他的id都没有显示
- 右外联接
-- 右外联接 right join
select ProductNum, ProductName, ProductImage, ProductPrice, Product.typeId,ProductType.typeName
from Product right join ProductType
--from ProductType right join Product
on(Product.typeId = ProductType.typeId) -- 主要是通过主表和值表的联接的id进行联接 对于其中的主表中的其他的id都没有显示
- 利用as进行简化
-- 利用 as 进行简化
select ProductNum as 编号, ProductName, ProductImage, ProductPrice, Product.typeId,ProductType.typeName
from Product right join ProductType
--from ProductType right join Product
on(Product.typeId = ProductType.typeId) -- 主要是通过主表和值表的联接的id进行联接 对于其中的主表中的其他的id都没有显示
- 利用 a b 进行简化
-- 利用 a b 进行简化
select ProductNum , ProductName, ProductImage, ProductPrice, a.typeId,b.typeName
from Product a right join ProductType b
--from ProductType right join Product
on(a.typeId = b.typeId) -- 主要是通过主表和值表的联接的id进行联接 对于其中的主表中的其他的id都没有显示
39. 聚合函数的使用
-- 聚合函数(count,avg,sum,max,min)
-- ================================count================================
-- count 统计记录条数 伪列 count(1) 其中1表示伪列 因为根本没有1这个列 伪列是绝对不能为空的
-- 列的值为NULL不参与统计
-- 使用主键进行查询
select count(ProductNum) from Product
-- 使用所有字段进行查询
select count(*) from Product
-- 使用伪列进行查询 性能最好
select count(1) as _count from Product
select 1,* from Product
-- ================================avg================================
-- 求平均 数字 日期
select AVG(ProductPrice) as _avg from Product
-- ================================sum================================
-- 求总和
select SUM(ProductPrice) as _sum from Product
where typeId = 1 -- 只求手机
-- ================================max================================
select MAX(ProductPrice) as _max from Product