c# 数据类型
int 整型
double 浮点类型
string 字符串
bool 布尔类型
DataTime 时间类型
字符串
字符串常用方法
字符串查找
indexOf() 找到第一个匹配项所在的位置 如果找到则为索引位置否则-1
string email=“xioadasd@qq.com”
int position =email.indexOf(’@’);
Equals 分为值类型比较和应用类型比较
字符串截取
Substring 从指定位置截取一定长度的字符串
输出字符串
Format https://www.cnblogs.com/fanweisheng/p/11432181.html
Trim() 去掉前后多余空格
ToUpper() 转成大写
ToLower()转成小写
LastIndexOf(string value) 找到最后一个匹配项所在的索引(位置)
StringBuilder类的使用
StringBuilder myBuilder =new StringBuilder()
方法 说明
Append 在结尾追加
insert 在指定位置插入指定字符串
Remove 移除指定字符串
数组
声明数组 int[] scores; 告诉计算机数据类型是什么,不规定长度
分配空间 scores =new int[5]; 告诉计算机分配几个连续的空间
赋值 scores[0]=67; 向对应的空间中存放数据
处理数据 scores[0]=scores[0]+5 使用对应空间的数据
数组声明同时初始化的三种情况
int[] netScore1=new int[3]{67,89,78};方括号中的数字决定数组长度
int[] netScore new int[]{67,89,78}; 数组元素直接决定长度
int[] netScore3={67,89,78};
遍历数组
for
foreach
foreach(元素类型 变量名 in 集合或者数组名)
{
}
类的使用
根据声明来编写类?
软件的需求与设计问题 软件的功能需求分析和总体设计
类包含哪些内容?
类的基本组成结构问题 包括属性方法
类的编写有什么具体方法和技巧?
面向对象的基本原则问题
类之间的关系如何确定?
软件和软件之间的配合问题 不同的软件,有不同的设计模式
程序运行时类会怎样变化?
对象的创建与使用问题 类是模板,程序运行时都是对象
理解面向对象的三大特性
封装
隐藏内部实现细节,模块开发者只关心内部实现和接口要求,模块调用者只关心接口调用
好处:安全保证(避免代码外漏)、快速应用(直接应用),团队协作(多人同时工作)
应用:类是程序的基本单元,也是封装的基本单元,但是类可以同样被模块封装
继承
复用现有代码
好处:一处更新,处处更新;弊端:关联容易复杂
应用:object,From…
多态
让一个对象的接口可以根据不同的请求,做成不同的响应
好处:程序扩展容易、维护方便
应用:继承多态,接口多态(简单工厂、抽象工厂)
OOP原则
单一职责原则(对象职责明确原则)
要求:一个对象只做好一件事情,必须专注,职责过多容易引起变化的原因就多,程序就不稳定(高内聚,低耦合的延伸)
开放封闭原则(核心原则)
要求:需求变化时尽量少的修改类的设计,而是通过扩展类来完成。即封闭修改,开放扩展
依赖倒置原则(OOP精髓)
要求:基于接口编程,高层模块调用接口,底层模块实现接口,防止底层变化直接影响高层
里式替换原则
要求:在继承关系中子类可以替换父类,虚拟机可以根据父类变量动态的找到具体的子类对象,从而实现多态。
字段
字段又称为:“成员变量” ,一般在类的内部做数据交互使用 ,一般使用private修饰。
字段命名规范:字段命名一般采用camel命名法。
字段可以赋值,也可以取值。
当字段需要为外部提供数据的时候,请将字段封装为属性,而不是使用共有字段,这是面向对象所提倡的。
属性
作用:在面向对象设计中主要使用属性描述对象静态特征。
要求:一般采用Pascal命令法,数据类型和字段要一致,使用public修饰。
方法
数据库sqlserver
实体(对象):客观存在的事物都是实体
实体数据的存储要求:必须按照一定的分类和规律存储
数据库:专门用于存储这些实体的信息的数据集合
数据库的特点
海量存储数据、数据检索非常方便
保持数据信息的一致、完整、并实现数据的共享和安全
通过组合分析,产生新的有用信息
SQL与T-SQL
T-SQL =Transach SQL
T-SQL是SQL的加强版
对功能进行了补充:如变量说明、流程控制、功能函数
T-SQL的组成
DDL(数据定义语言)
用来建立数据库、数据库对象和定义其列
CREATE TABLE DROP TABLE等
DML(数据控制语言)
用来控制存储许可、存取权限等
GRANT、REVOKE等
变量说明、流程控制、功能函数
定义变量、判断、分支、循环结构等
日期函数、数学函数、字符函数、系统函数
数据库中的数据要确保存储在数据库中数据的准确性和一致性 解决方法 采用数据库约束SQL Server中的六种约束:主键约束,外键约束,唯一约束,非空约束,检查约束,默认约束
查询的基本语法构成
select <列名>
from <表名>
where <查询条件表达式>
order by <排序的列名>[ASC或DESC]
查询全部行和列
select * from Students
查询部分行
select StudentName,Gender,Birthday,Age,StudentidNo
from Studebts
where Age>24
查询出来更改数据表项的列名
select StudentName as 姓名,Gender as 性别,出生日期=birthday
from Students where Gender=‘男’
插入一条数据到数据表
insert into ScoreList(StudentId,CSharp) values(100009,78)
查询表中某列为null的值
select * from ScoreList where SQLServerDB is null
限制固定行数
select top 5 StudentName,Gender,Birthday
from Students
返回百分之多少行
select top 20 percent StudenName,Gender,Birthday
from Students
升序排序
select StudentId,(CSharp+5) as C#,DB=SQLServerDB
from ScoreList where (CSharp+5)>90
order by CSharp ASC
降序排序
select StudentId,(CSharp+5) as C#,DB=SQLServerDB
from ScoreList where (CSharp+5)>90
order by CSharp DESC
按多列排序
select StudentId,CSharp as C#,DB=SQLServerDB
from ScoreList where (CSharp+5)>90
order by CSharp DESC,SQLServerDB ASC
link 模糊查询
模糊查询右边模糊
select 列1,列2 from Students
where StudentAddress link ‘天津%’
模糊查询左右模糊
select 列1,列2 from Students
where StudentAddress link ‘%小%’
between 模糊查询
select * from ScoreList
where CSharp between 80 and 90
select StudentName,studentAddress,Birthday from Students
where Birthday between ‘1987-01-01’ and ‘1988-01-01’
in 模糊查询 (匹配括号内)
select StudentName,Birthday,Age from Students
where Age in (21,22,23)
select StudentName,Birthday Age from Students
where StudentName in (‘啊’,‘哦’,‘额’)
聚合函数
求和
select SUM(CSharp) as C#总成绩 from ScoreList
求条数
select 总人数=COUNT(*) from Students
求最大值、最小值、平均值
select MAX(CSharp) as c#最高分,MIN(CSharp) as c#最低分
from SeoreList
select c#平均分 =AVG(Csharp),DB平均分=AVG(SqlserverDB)
from ScoreList
多表连接查询
内连接查询主外键关系
1、需要连接的表
2、两个表连接的条件(主外键)
3、两个表中相同的字段,必须说明来自哪两个表
select Students.StudentId,StudenName,StudentClass,ClassName,c#成绩=Csharp
from Students
inner join ScoreList on Students.StudentId=ScoreList.StudentId
inner join StudentClass on Students.ClassId=StudentClass.ClassId
where CSharp>80
多表连接查询:只需要使用inner join将多个表按连接条件连接即可。
左外连接查询
select StudentId,StudentName,Gender
from Students
left outer join ScoreList on Students.StudentId=ScoreList.StudentId
where Gender=‘男’
查询的结果包括两个表所有满足连接条件的记录
以及左表所有不满足条件的其他记录,这些不满足的左表记录,在结果的右边位置,全部填上NULL值。
右外连接查询
select Students.StudentId,StudentName,ClassName
from Students
right outer join StudentClass on Students.ClassId=StudentClass.ClassId
查询的结果包括两个表所有满足连接条件的记录
以及右表所有不满足条件的其他记录。这些不满足的右表记录,在结果的左边位置,全部填上Null
分组查询
where子句
从数据源中去掉不符合其搜索条件的数据
group by子句
搜索数据行到各个组中,统计函数为各个组计算统计值
having子句
在分组结果中,去掉不符合其搜索条件的各组数据行
数据库操作的基本方法
1、创建Connection对象
2、创建SQL语句(Insert,Update,Delete,Select)
3、Command对象
ExecuteScalar() 返回单一结果
ExecuteNonQuery()返回影响的行数
ExecuteReader()返回一个或多个结果集 读取数据 关闭读取器。
动态类型dynamic总结
可用于类型的字段、方法参数、方法返回值、泛型类型参数。
可以赋值或被赋予任何类型,并且不需要类型转换。
var 匿名数据类型
var i=0;
是int类型 它编译的时候就会自动帮你改成int 它会自动把var替换成这个i变量应有的类型
var总结
只能用于"局部变量",不能用于字段,方法参数。。。
变量类型在编译时就确定了。
linq
简单扩展方法的应用
不带参数的扩展方法定义
static 方法名 (this 目标类型 目标类型参数)
带参数的扩展方法定义
static 方法名 (this 目标类型 目标类型参数, 参数类型1,参数类型2…)
扩展方法使用中应该注意的问题
扩展方法必须定义在静态类中,扩展方法本身也是静态方法
如果扩展方法和对应的类位于不同的命名空间,使用时应引入扩展方法所在静态类的命令空间
当类本身的方法与扩展方法重名时,类本身的方法被优先调用。
扩展方法不要过多使用
{
/// <summary>
/// 扩展方法类
/// </summary>
static class ExtendMethod
{
public static int GatAvg(this int sum)
{
return sum / 5;
}
public static string Stuinfo(this string name)
{
return string.Format("{0},您好,您的5门平均成绩为:", name);
}
}
}
public class Program
{
public static void Main(string[] args)
{
string stuName = "小张";
int scoreSum = 460;
Console.WriteLine("{0},{1}", stuName.Stuinfo(), scoreSum.GatAvg());
}
}
委托
委托是一种新的面向对象语言特性,运行在.net平台上
基于委托,开发事件驱动的应用程序非常简单
使用委托可以大大简化多线程编程的难度
委托,也可以看成是一种数据类型,可以用于定义变量,但他是一种特殊的变量。
委托定义的变量能接收的数值只能是一个方法(函数),可以理解成委托就是一个方法(方法)的指针。
public class Program
{
//1申明委托(定义一个函数原型;返回值+参数类型和个数)
public delegate int CalculatorDelegate(int a, int b);
public static void Main(string[] args)
{
//3创建委托对象关联具体方法
CalculatorDelegate objCal = new CalculatorDelegate(Add);
//4通过委托调用方法而不是直接调用方法
int result= objCal( 20, 30);
//根据需要变化委托指向
objCal -= Add;//断开当前委托所关联的方法(加法)
objCal += Sub;//重洗关联一个新的方法(减法)
result = objCal(50, 30);
Console.WriteLine(result);
Console.Read();
}
//2根据委托定义具体方法(加法)
static int Add(int a,int b)
{
return a + b;
}
static int Sub(int a,int b)
{
return a - b;
}
}
匿名方法
方法没有具体名称,只有委托关键字,方法体,所以称为匿名方法
匿名方法允许代码块(方法体部分)通过委托变量作为参数传递,以代替单独定义的方法。
CalculatorDelegate nim = delegate (int a,int b){
return a+b;
};
lambda表达式
lambda表达式本身就是匿名方法
lambda表达式的参数允许不指明参数类型,而匿名方法的参数必须明确指明参数类型
lambda表达式方法允许由单一表达式或者多条语句组成,而匿名方法不允许单一表达式形式
CalculatorDelegate objCal = new CalculatorDelegate(Add);
CalculatorDelegate objCala = (a,b)=> { return a * b; } ;
CalculatorDelegate objCala = (a,b)=> { return a * b; } ;
int resulte = objCala(10, 20);
Console.WriteLine(resulte);
LINQ中的select
获取数据:扩展方法selsect()
select()是一个泛型扩展方法
select()使用的时候,要求传递一个委托实例(委托实例就是一个方法)
select()方法里面是一个lambda表达式,返回值是一个迭代器(数组、泛型集合都可以使用扩展方法select)
//linq select()方法
int[] nums = { 1, 7, 2, 6, 8, 4, 2 };
var list = nums.Select(item => item * item);
foreach (var item in list)
{
Console.WriteLine(item);
}
Console.Read();
LINQ中的where
筛选数据where()方法
where()方法是一个扩展泛型方法
where()方法使用的时候要求传递一个委托实例,但该实例是一个判断条件,因此返回的类型必须是bool类型
//linq where()方法
int[] nums = { 1, 7, 2, 6, 8, 4, 2 };
var listwhere = nums
.Where(item => item % 2 == 0)
.Select(i => i * i);
foreach (var item in listwhere)
{
Console.WriteLine(item);
}
Console.Read();
linqOrderBy()方法
排序数据:OrderBy()
OrderBy()是一个扩展方法;
OrderBy()里面的参数要求传递一个排序字段,默认按照升序排序
如果想要降序排序则可以使用OrderByDescending方法
//linq OrderBy()方法
string[] linqnums = { "张三", "李四", "王五", "成龙", "啥玩意" };
var ordebylist = linqnums
.Where(item => item.Length == 2)
.Select(item => item)
.OrderBy(item => item.Substring(0, 1));
foreach (var item in ordebylist)
{
Console.WriteLine(item);
}
linqGroupBy()方法
GroupBy()是一个扩展方法
GroupBy()里面的参数要求传递一个分组的字段
string[] linqGroupBy = { "张勇", "刘静", "阿斯达", "昆仑决", "结构", "屁哦" };
var GroupBylist = linqGroupBy
.Where(item => item.Length == 2)
.Select(item => item)
.GroupBy(item => item.Substring(0, 1));
foreach (var item in GroupBylist)
{
Console.WriteLine(item.Key);
foreach (var res in item)
{
Console.WriteLine(res);
}
}
linq查询时机
1、获取数据源 定义查询 执行查询
定义查询之后,查询并没有立即执行,而是直到需要枚举结果(遍历)时才被真正执行
这种方法称为"延迟执行"
2、使用"聚合扩展方法" 返回单一结果,强制查询立即执行。
Count,Max/Min,Average
查询表达式
是一种用查询语法表示的表达式有一组用类似于sql的语法编写的句子组成
每一个子句可以包含一个或多个c#表达式
linq查询表达式包含的子句
from子句 :指定查询操作的数据源和范围变量
where子句:筛选元素的逻辑条件,返回值是一个bool类型
select子句:指定查询结果的类型和表现形式
orderby子句:对查询结果进行排序(升序或降序)
group子句:对查询结果进行分组
into子句:提供提个临时标识符,该表示可充当对join/group/select子句结果的引用
join子句:连接多个查询操作的数据源
let子句:引入用于存储查询表达式中的子表达式结果的范围变量
ThenBy 提供复合排序条件
分区类查询
Take提取指定数量的项
Skip跳过指定数量的项并获取剩余的项
TakeWhile只要满足指定的条件,就会返回序列的元素,然后跳过剩余的元素
SkipWhile 只要满足指定的条件,就跳过序列中的元素,然后返回剩余元素。
集合类查询Distinct
去掉集合中的重复项
生成类查询
Range生成一个整数序列
Repeat生成一个重复项的序列
注意:Reange/Repeat不是扩展方法,而是普通的静态方法
Range只能产生整数序列
Repeat可以产生泛型序列
所有的查询方法都存放在System.Linq.Enumerable静态类中。
可选参数
用法:
(1)在方发声明时,为可选参数制定一个默认值。
(2)可选参数的默认值必须是一个常量。
(3)可选参数必须出现在所有必须参数之后,否则编译器报错。(如图)
事实上,在调用方法时,编译器会按顺序把实参依次赋值给形参,若实参的个数少于形参,则未被赋值的形参会取默认值。
class Program
{
static void Main(String[] args)
{
int i = Add(4);
Console.WriteLine(i);
i = Add(1, 2);
Console.WriteLine(i);
}
public static int Add(int x, int y = 5, int z = 6)
{
return x + y + z;
}
}
输出为:
15
9
命名参数
用法:
(1)调用方法时,显式地说明实参所对应的实参的名字。
(2)不必按顺序输入参数。
(3)调用方法时,若某个参数命名,则之后的所有参数都需要命名。否则编译器会报错。
命名参数的主要作用是,对于某些参数繁多的方法,可以增加代码可读性,避免参数顺序的错误。
示例:
1 class Program
2 {
3 static void Main(String[] args)
4 {
5 int i = Add(5, secondInt: 6);
6 Console.WriteLine(i);
7 }
8 public static int Add(int firstInt,int secondInt)
9 {
10 return firstInt + secondInt;
11 }
12 }