C#
- 第一章 C# 基础
- C# 代码组成部分
- 引用库 using sys.
- 命名空间 namaspace
- 函数 index.cs pogram.cs Main 程序入口
- 数据类型和数据类型转换
- 分类: 引用类型和值类型,引用类型数据存放在堆上,值类型存放在栈上
- 引用类型字节大小不固定: string, object,
- 引用类型在栈上存放的是堆的地址
- 值类型引用类型图片解析
- 类和类的实例内存分布。
- 值类型大小固定:
- short int 2字节, int 4字节,long int 8字节
- char 字符类型 2字节
- float f=123.12f 浮点 4 字节
- double 双精度浮点 8 字节
- decimal 金融数据 8字节
- struct 声明时候固定大小
- 枚举类型 enum
- bool 1 字节
- 引用类型 string object, Int32.Paerse(). ToString()
- int float string 相互转换
- 数组[]:int[30],string[5],
- 数组长度, 数组访问遍历
- Student[10] 学生数组构成班级
- 二维数组[i][j] :数组的成员是数组。班级数组构成年级。
- 三维数组p[i][j][k],年级数组构成学校。
- 代码执行和流程控制
- if(){} else if{} else{} : 条件判断
- while(条件){}do{}
- return 跳出整个程序集
- break 跳出本次循环
- for(条件){}
- swich case, 条件执行, 和枚举, 枚举做case条件
- 流程控制和输入字符 数字字母统计:Ctrl+Z(-1)
- a-z:97-122(asic码值)
- A-Z: 65-90(asic码值)
- 0--9:48-57(asic码值)
- int --(char)(): asic 码值转换成字母
- 类和类的成员, 类的集合
- 类的修饰:
-
- 访问级别修饰
- public :公共类, 可以被类继, 可以new出来
- private: 私有,class 内部访问, class 默认的访问级别。并不能继承
- protected: 受保护类,calss 内部和继承类可以访问
- internal: 只能在当前程序集, 别的程序集不能访问, 类的方法成员的默认访问级别。
- partial: 局部类型, 局部类型允许我们将一个class、struct或interface分成几个部分,分别实现在几个不同的.cs文件中。
- sealed :密封类,不能被继承
- abstract: 抽象类
- 类的成员:
- 字段(类有什么):小写; public string/int/float XX;用构造函数或者属性暴露字段。
- 属性(赋值)大写,属性可以将字段暴露。本质是两个方法 set{} get{}, 属性是字段的扩展,用来对字段进行灵活的访问。
- 方法/函数(做什么):大写,方法可以将字段暴露。由方法的签名和代码块{}组成,方法签名包括:访问级别(public/private/),修饰关键字(static/abstract/void、virtual),方法名称(+参数)
- 构造函数:与class 类同名且没有返回值的方法,实例化(new)一个class 时候会调用,用于创建类的事例对象,当调用构造函数实例化一个对象时, 构造函数会为对象分配空间,并初始化类的成员。(事例构造函数和静态构造函数,静态构造函数兼有静态成员和构造函数的特点)
- 静态构造函数:
-
- 不能有访问级别修饰 public.private.
- 不能有参数
- static 关键字修饰
- 不能实例化实例变量
- 调用时机,类被实例化或者静态成员被调用时。所以只执行一次
- 一个类只能有一个静态构造函数
- static 修饰的class成员: 静态成员:直接与类相关连,类创立的时候就有。 而不是和new、实例化的出来的(对象,变量)相关联,所以不new类也能直接类点操作符也可以直接访问。
- 没有 static 修饰的 成员是实例实例成员, 需要new出来class 变量、对象才能使用该实例成员。
-
- 函数重载, 函数重写override
- class 的两个或者多个同函数名不同参数列表(参数个数,参数类型, 参数顺序)的函数形成重载,横向的平等级别之间的关系
- override 重写: 基类由virtual 修饰的虚方法,子类在继承基类的时候可以用override 修饰,来重写基类方法。纵向关系, 父类和子类的关系。
- 基类身份声明的变量可以用子类对象赋值,先在自已身上扫描,如果有,并且是用virtual关键字修饰的,就转而向下扫描子类,如果子类中有同名的并且用override关键字修饰的方法就调用子类的方法,如果子类中没有这个方法或是子类有这个方法,但没有用override修饰就返回来调用基类身上的方法
- override重写:基类由 abstract修饰的成员由 abstract 修饰的抽象类抽象方法没有方法体,继承类必须重写,继承类必须有overide修饰。
- Interface接口成员的重写: 横向的多态。
- 第二章 Winform
- 控件
- 新建 visual->新建项目->wondows 窗体-> windows窗体应用程序
- 控件:listBox,checkBox,combineBox, button, text, datagrideView.LIistView,pannel,menu, 工具条,数据绑定, 重新命名属性.
- 控件属性.
- 面向对象和面向对象特征
- 设计思想,c语言是面向流程的开发语言, c# s是面向对象的开发语言
- 面向流程和面向对象并不是完全无关, 在面向对象设计中也有流程的思想
- 面向对象的特性:
- 封装: int可以代表天下的全部int 类型数据、把学生做成一个student类,有效的对外隐藏class 的内部数据,从而避免数据损坏(篡改..删除...;)
- 继承:子类可以继承基类pubic和protected成员,(private成员只在class 的内部能访问,sealed class 密封类不可以被继承), 子类初始化顺序, 字段-->基类(没指明基类则调用最终类 object), 纵向的继承关系。
- 多态:子类继承父类可以覆写基类的方法, 实现子类特有的行为。Cat<--Animal-->Dog, cat 和dog有不同叫声, 横向的比较关系。普通类继承基类形成的多态, 抽象类抽象方法的实现的多多态。实现接口成员的类的多态-- 横向的。
- 抽象基类(abstract 修饰的class)多态
- abstract 抽象类天生被继承, 不能new直接呢我抽象类(实例化,具体实现)。
- 抽象类的声明的变量 a 必须用子类赋值 Animal a = new Dog().
- abstract class 内部可以有实抽象成员(abstract 修饰的),纯虚成员,只能有声明,没有具体的实现,没有方法体。所以要在继承类中去具体实现, 必须在继承类override 重写。
- abstract class 内部可以有实例成员(非abstract 修饰的成员), 可以有方法体,可以通过子类访问。
- 多个不同的子类对抽象基类 abstract class abstract 的抽象成员的重写, 形成横向的多态。
- 接口 Interface (class 或者食物的标准), 纯抽象类 abstract
- Interface 接口也是一种类。
- 纯抽象类不能有任何实例成员。
- 和抽象类的声明的变量 a 必须用子类赋值 Animal a = new Dog().同理。 接口声明的变量必须用实现了该接口的类赋值。
- 接口的成员是方法的声明,接口成员没有方法体, 没有具体实现。必须要在继承类实现接口的全部成员。
- 接口成员默认 public, 所以不用再显示的加 public 关键字修饰 .
- 对于实现了两个接口的类, 若两个接口有同名的成员, 要
- 在实现类显示的加上对应接口做前缀。
- 继承接口的两个或者多个类, 都对接口成员方法重写, 形成横向的多态。接口实现 的多态。
- 继续。。。。
- 三层架构 经典: 通常意义上的 三层架构是: UI 界面层,BLL业务逻辑层,DAL数据房访问层。
- 新建类库 三层架构 ->
- Model 模型层,DAL database access layout,数据访问层,BLL business logic layout,业务逻辑层,
- Model层不知道其他层的存在,不用引用其他层。
- DAL 引用Model 层,知道对应的数据数据库放在哪儿。
- BLL 引用MOdel层和 DAL层。
- DAL sqlHelper助手类: 连接数据库 conString = "server=.;database=数据库名;UId= sa; pwd = sasa"; SqlConnection con = new SqlConnection(conString)
- SQLHelper: SQlCommad cmd = new SqlCommand("执行语句",con)
- SQLHelper:cmd.CommandType = CommandType.StoreProcedure /存储过程
- SQLHelper:con.Open()
- SQLHelper:SqlDataReader reader = cmd.ExecuteReader
- SQLHelper:DataTable table= new DataTable()
- SQLHelper:tavble.load(reader)
- object result = cmd.ExecuteScalar()
- int effectedRows = cmd.ExecuteNonQuery();
- Power Designer 建模
- 继续。。。
- 第三章 C#2.0
- C#2.0 新特性 : 泛型 ,委托,事件,匿名方法,迭代起器、分部类型、空属性, 静态类,
- 泛型:定义,通过参数化类型实现类型的抽象化,从而得到更好的面向对象体验。
- 语言层面机制:C#泛型 由CLR在运行时支持,C#泛型在编译成中间语言IL代码或者元数据时候是一个占位符号,JIT(just-in-time)时候才会实例化泛型类型。两轮编译。
- Visual Studio 可以将多种编程语言转换为IL, IL 能在不同的平台转换为二进制代码。
- C#泛型采用“基类,接口,构造器,值类型,引用类型" 四种约约束来对类型参数的”显示约束".
- 泛型语法:声明注意点1):如果基类是泛型类型,他的参数要么已经实例化,要么子类要负责实例化。class
G:C<U,V>{} 非法. 泛型类型的参数化。- 泛型类型成员:
- 泛型接口:泛型接口的类型参数要么已经实例化,要么来源于实现接口的类。
- 泛型方法:
- 泛型约束:
- 泛型类型或者泛型方法的类型参数的任意假设,都要基于“显示约束”。
- 约束由 where 表达, 有基类,接口,构造器,引用类型、值类型四种约束。
- 若没有指定泛型的约束, 泛型类型的参数将只能访问object 中的共有方法。
-
class A { public void F1() { } }
class B { public static void F2() { } }
class C<S, T>
where S : A,new()
where T : B
{
public void FF()
{
S s = new S();
s.F1(); // 继承A1基类的F1方法
T.F2(); // 继承B1基类的F2方法
}
}
- 委托 delegate: 将方法签名相同的类方法参数化,使得方法作为参数传递。
- 委托是由 delegate 修饰, 没有成员的类。
- 方法的返回类型和委托要一致。
- 方法的方法签名,即是参数类型参数个数参数顺序一致。
- 委托是很多方法的集合。委托代表很多方法。代表同一命名空间内,所有返回类型和参数列表相同的方法。方法参数化,横向提取。
- 声明:delegate void GreetingPeopleDelegate(string name); 代表一众 没有返回值,输入参数为 string 的方法。
- 使用委托变量可以new 出来使用或者直接赋值委托变量
- 用 += 或者 -= 可以增加或减少委托挂载的方法集合。
- 委托和观察者模式
- 事件 event 和观察者模式
- 事件 Event: 事件是被 event 关键字修饰的委托。
- 被 event 关键字修饰的委托,在类的外部只能 出现在 += 或者 -= 的左侧,即不能new,只能挂载。
- event 最好和 委托一起理解。
- 事件是一个特殊的多路广播。
- 匿名方法(没有方法名的方法): 方法的声明和实例一块完成,代码直接与委托实例关联,(匿名方法定义委托的实现)
- 匿名方法对委托和事件的简化
- 匿名方法的参数列表:若在delegate 后面指定了参数列表,则必须和事件的委托类型相同。
- 匿名方法的返回值:必须和为委托的返回值兼容。
- 匿名方法的外部变量: 指的是匿名方法使用的局部变量或参数。
- btn.Click += delegate { MessageBox.Show("这是一个匿名的无参的方法"); }: 匿名方法可以在delegate 后面跟一个参数列表, 其后的代码快可以访问这些参数。也可以不指定参数.
- 方法里面只有一句代码, 不先声明方法。 这句代码直接与委托实例关联,没有专门声明方法名。匿名!
- 无参数 delegate 参数声明的 括号都省略了。
- 如果有参那就一定要和当前修饰的委托 的签名要求的参数类型和个数相匹配
- delegate int AddDelegate(int a, float b);
AddDelegate ad = delegate(int aa, float bb)
{
return aa + (int)bb;
}; - 静态方法中的匿名方法。
- 实例方法中的静态方法。
-
- 迭代器 foreach
- yield rerurn 产生枚举元素
-
for(int i = count -1;i>=0;--i)
{
yield return imtes[i];
if(????????)
yield break;
}
- IEnumerable 接口调用了 IEnumerator 接口, IEnumerator 接口 实现了
- IEnumerator 接口:Object Current 方法返回元素,bool MoveNext 指向下一个, Void reset 创建枚举数后资源被修改
- 在调用 MoveNext 或 Reset 之前,Current 返回同一对象。MoveNext 将 Current 设置为下一个元素。
- foreach本质上是这样调用的,
IEnumerator myrator = peopleList.GetEnumerator();
myrator.Reset();
while (myrator.MoveNext())
{
Person p = (Person)myrator.Current;
Console.WriteLine(p.firstName + " " + p.lastName);
} - 支持对非泛型集合的简单迭代。
IEnumerator 是所有非泛型枚举数的基接口。
- 分部类型 partial:允许在不同的cs文件定义同一个class /类
- partial 只有 和 calss struct interfsace 放在一起时,才做 分部关键字来理解。其他地方,partial做变量名 也OK。
- 一个分部式的类,其各个部分要在同一个命名空间内。
- 分部是在编译之前的分部, 程序编译是会把各个部分组合当成把一个类来处理。
- 各个分部的访问级别,修饰返回类型擦描述形式等不能彼此冲突。
- 如果一个局部修饰 是 sealed 密封类或者 abstract 抽象类, 那么整个都是 密封或者抽象的。
- 局部类型的基类或接口,指定的基类必须一致。
-
各个分部类指定实现了不同个数和功能的基类,则这个类指定实现的基类个数和种类的基类的最大组合叠加。
- 空属性: 允许一个值类型具有空值的意义。
- Int ? X =I, 表示 x 有两大组成, int 集合和空值。
- 三元运算符: (条件表达式)?执行表达式1:执行表达式2 条件表达式成立, 执行表达式1, 不成立执行表达式2.
- 静态类:只用于包含静态成员的类型, 即静态类的成员都是静态成员。既不能实例化(new), y也不能被继承,相当于abstract sealed 的类。
- Const 修饰: 限定一个变量不可以被改变
- 静态类不能 有实例构造器,即能不new
- 静态类不能有实实例成员。
- 静态类成员不能有 preotected 、 protected intenal 修饰.
- 相当于 mabstrat sealed , 不能在用 abstract 和 sealed 修饰。
- 默认继承自 sy.Object, 不能显示指定其他基类。
- 不能指定任何接口
- 属性访问器保护级别变化: c# 2.0 允许对一个属性的 set get 访问设置不同的访问修饰
-
•C#2.0允许我们对一个属性的get和set访问器使用不同的访问修饰符:•public string Name // 已经是public的,其成员至少有一个是可以访问的, 不能所有成员属性都和public冲突。
{
get{return this.name;}
private set{this.name=value;}
}
-
- 命名空间限定: C# 2.0 允许使用命名空间别名限定符 ::。避免不同命名空间中类型名称冲突的问题。库级别特性
- 继续
- 迭代器 foreach
- C# 3.0 特性
- 局部类型、空属性类型、静态类
- Lin
- 第四章 C# 3.0特性
- 隐含类型局部便变量 var
- var 隐藏类型局部变量 与c# 是强类型语言并不冲突,因为在编译得出时候, 能知道var ju具体指代是什么类型。编译时候推断
- var 在 foreach (var i in ListA) {}迭代时, 可以指代不同的类型的变量。
- var 声明仅局限于 局部变量, 不能放在字段里面。
- 扩展方法: 本质会转换为对非泛型静态类中的静态方法的调用: static class{ static Method(){}}
- 静态class没有构造函数吗,不能new
- 扩展方法允许我们在不改变源代码的情况下扩展(添加)类型中的实例方法。扩展方法参数要带 this 关键字
- 静态方法通过点操作符号点出来。
- 集合初始化器
- 匿名类型 :可以用 new 关键字调用匿名初始化器创建一个匿名类型的对象。匿名类型直接继承Sys.Object
- Lambda 表达式:
- 扩展方法传递命名方法(写好的方法名)-->--匿名方法-》传递匿名委托实例--》
- Lamda表达式的参数类型可以忽略, 因为可以通过上下文推断
- lambda表达式 : 可以被转换为委托类型 如下。
- var ShortWordsByLambda =
words
//.Where(delegate(string w) { return w.Length <= 5; }) // 匿名方法, 方法实例和声明一起。
.Where(w => w.Length <= 5) // Where(参数1, 参数2) 参数1是实现IEnumerable接口的可迭代项, 参数2是是返回bool值的委托。
.Select(word => word); // 直接参数 Select(参数1, 参数2) 参数1是实现IEnumerable接口的可迭代项, 参数2是是返回bool值的委托。 - 。。。
- Linq 实际就是Lambda 表达式。
- Linq-To-Sql: DataContext 是 Connection Command 的合体。
- Linq-To-Xml : XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("books"); - 表达式树: & | 按位与 按位或
- IEnumerable<T> : 数组均实现了这个接口,IEnumerable<T> 接口是Linq 的核心。
- Linq 的标准操作查询操作符 where select order orderBy 等都要使用IEnumerebe 类型对象作为参数。这是标准操作符都是扩展方法。
- 在 Linq 中, 序列是指所有实现了IEnumerable 接口的对象。
- 迭代器允许我们访问集合中的每一个元素,在。Net 叫做迭代器, 在python 叫生成器, 在 数据库相关的叫做游标。迭代器实质上是对 index 的操作。foreach 实质是对 current h和moveNext 的调用。
- 查询操作符本质是查询上下文中使用的一系列扩展方法的集合。
- 常用的查询操作符: where select orderBy GroupBy distinct
- Linq -Sql 生成的是 sql 查询语句, 只有在把结果集Tolist 或者 foreach 迭代的时候才会抓出结果。
- Linq-To-Xml :查询结果生成Xml数据。
- foreach 跌带的时候才会去计算 比如 数学计算方法 加减乘除。 在linq语句里面只是一个查询语句。
- ToList ToArray 立即查询, 会将查询转换为静态的结果集合。
- Linq-To-Object
-
查询表达式并没有能够一 一对应查询操作符, 操作符能完成更多功能
- 第五章 MVC设计模式: Model View Controller
- MVC 理论
- MVC 不同于三层架构,MVC是表现模式,三层架构是架构模式。 View 和Controller 同属于UI界面层。
- Model f负责从数据库中取得数据。并转换成对象
- Controller 调用Model 选择在哪个View 渲染给用户看。
- MVC 最核心的原则是分离程序各个部分的关注点
- MVC 自带的增删查该
- View前端向用户显示数据和结果。
- Linq-EF 实体模型建立数据库.
- Razor:
- Razor,通过理解标记的结构来实现代码和标记之间尽可能顺畅的转换
- 主要的转换标记:@ at符号, 用作标记和代码的转换字符。主要是代码表达式和代码块。
- @ViewBag.term, 代码表达式
- 没有转义的需要时候,做字面量@()
- @@来表示 @ 符号
- 代码块 @{}
- @foreach(){}
- 向 View 页面传值的方式:
- Controller向View 层,ViewBag=要传输的数据 ViewData, href
- ViewBag只是把暴露ViewData简单包装成一个dynamic动态属性
- 任何引用ViewData 字典取值的代码可以修改成ViewBag
- ViewBag.name="张三",可以把与主要视图模型无关的值用Viewbag传递。ViewBag.term=term//a 标签href 解析传递的值;
- ViewData["name"]="张三";
- Controller 控制器 Return View(数据集合Model/ViewMode视图模型)
- View 向 Controler 控制器的传值 a 的href 传递
- <img src=@Url.Content("~/head.jpg")> ,会在渲染成Html代码成对应的路径
- @Html.AcctionLink("HomePage",Index,"Home"),会在html页面渲染成
- <a href="Index/Home">HomePage</a>
- View-Model 传值
- 模板页继承页分布式布
- 第六章 Asp.net
- Http 协议: 请求完就断开
- 状态管理:Cookie 在客户端保存值。
- 试图状态:本页面多次请求间保持状态。ViewState 本页面传值。配合 IsPostBack 可以存储 本页面的前一次请求的值。Page_PreRender 页面预呈现事件。
- Request.Form["UserName"]-- 服务器端和客户端传值。 Input type= UserName
- Request.QueryString["userName"]-- 服务器断客户端传值 <a href="xxx.aspx?username=ghz"></a>
- Session[""] 保存在服务器端。
- runat= server 的控件传值到服务器端。
- 将数据绑定显示到 GrideView 控件。DataSource=XX; DataBind();
- 页面跳转 重定向: Response.Redirect(url) --url = xxx。aspx?xx
- Server.Transfer, 页面跳转。Server.Transfer("CrossPage2.aspx",true); PreviousPage.Title
- 控件 Repeater literral
- 页面跳转页面传值