本文文档下载:C#.md
Solution——针对客户需求的总的解决方案
Project——项目,解决具体的某个问题
类库引用
DLL引用——黑盒引用,无源代码
项目引用——白盒引用,有源代码
依赖关系
类(或对象)之间的耦合关系
高内聚,低耦合
UML(通用建模语言)类图
类(Class)
现实世界实物的模型,对现实事物进行抽象所得结果。(现实事物--物质、实体)(抽象--运动、逻辑)
对象=实例
实例化——依照类创建对象(new ___)
引用变量与实例
...
Form myForm1;
Form myForm2;
myForm1 = new Form();
myForm2 = myForm1; //同一实例
myForm1.Text="my Form";
myForm2.ShowDiaLog();
---------------------------------------
输出结果:--------------------------
| my Form |
----------------------------
属性(Property):存储数据,组合表示类/对象当前状态。
方法(Method):相当于C中函数function。
事件(Event):类/对象通知其它类/对象的机制。
模型类/对象重属性 例:Entity Framework(操作数据库)
工具类/对象重方法 例:Math
通知类/对象重事件 例:Timer
静态(Static)成员——类的成员。
Console.WriteLine("Hello!");
实例(非静态)成员——对象的成员。
Form form = new Form(); form.text = "Hello"; form.ShowDiaLog();
“.”操作符——成员访问
绑定(Binding)——编译器如何把一个成员与类或对象关联起来。
类最基本的成员
字段——成员变量——数据
方法——成员函数——算法
堆、栈
栈——方法、局部变量
栈溢出
堆——实例
内存泄漏
数据类型
C#数据类型包含信息
存储此变量所需内存大小
此类型值可表示最大、最小范围
此类型包含的成员(如方法、属性、事件等)
此类型由何基类派生而来
程序运行时,此类型变量分配在内存的什么位置(栈or堆)
此类型所允许的操作(运算)
Object
引用类型(Reference Type)
类(Classes) 例:Window,Form,Console,String
接口(Interfaces)
委托(Delegates)
值类型(Value Type)
结构体(Structures) 例:Int32,Int64,Single,Double
枚举(Enumerations)
指针类型
引用类型变量存储的数据是对象的内存地址。
值类型没有实例。
常量:const int x=100;
装箱&拆箱
装箱——值类型转换为引用类型
拆箱——引用类型转换为值类型
类型转换
隐式(implicit)类型转换
不丢失精度的转换
子类向父类转换
装箱
多态
namespace Demo
{
class Program
{
static void Main(string[] args)
{
Teacher t = new Teacher();
Human h = t; //由子类向父类进行的隐式类型转换
Animal a = h; //由子类向父类进行的隐式类型转换
}
}
class Animal
{
public void Eat()
{
Console.WriteLine("Eating...");
}
}
class Human : Animal
{
public void Think()
{
Console.WriteLine("Who am i?");
}
}
class Teacher : Human
{
public void Teach()
{
Console.WriteLine("I teach programming");
}
}
}
显式(explicit)类型转换
有可能丢失精度(甚至发生错误)的转换,即cast
拆箱
使用Convert类
ToString方法与个数据类型的Parse/TryParse方法
//cast
namespace Demo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(ushort.MaxValue);
uint x = 65536;
ushort y = (ushort)x;
Console.WriteLine(y); //显式类型转换
}
}
}
输出:65535
0
------------------------------------------------------------
//wpf程序
...
private void btn_Click(object sender,RoutedEventArgs e)
{
//double x = System.Convert.ToDouble(tb1.Text);
//double y = System.Convert.ToDouble(tb2.Text);
double x = double.Parse(this.tb1.Text); //输入格式不正确时产生异常--FormatException
double y = double.Parse(this.tb2.Text);
double result = x + y;
this.tb3.text = result.ToString();
}
自定义类型转换操作符
namespace Demo { class Program { static void Main(string[] args) { Stone stone = new Stone(); stone.Age = 5000; Monkey wukongSun = (Monkey)stone; //隐式不用加(Monkey) Console.WriteLine(wukongSun.Age); } } //理解:显式类型转换操作符就是一个目标类型的实例构造器, // 但是这个构造器不是写在目标数据类型里面, // 而是写到被转换的这个数据类型里面去。 class Stone { public int Age; public static explicit operator Monkey(Stone stone) //隐式将explicit换为implicit { Monkey m =new Monkey(); m.Age = stone.Age/500; return m; } } class Monkey { public int Age; } }
变量
用于存储数据。
表示存储位置。
每个变量都有一个类型,以决定什么样的值能够存入变量。
以变量名所对应的内存地址为起点,以其数据类型所要求的存储空间为长度的一块内存区域。
静态变量
实例变量(成员变量、字段)
数组元素
值参数
引用参数
输出参数
局部变量(狭义:方法体内声明的变量)
var:声明一个隐式类型的局部变量。
声明时初始化,类型一旦确定不可更改,仅限局部变量。
方法
当一个函数以类的成员的身份出现时称之为方法(Method)。
C#中函数不可能独立于类(或结构体之外);C++中可以,称“全局函数”。
方法(函数)目的:
隐藏复杂逻辑
大算法分解为小算法
复用(重用)
方法名
动词 / 动词短语作名字
java-驼峰法;C#-首字母全大写
构造函数
狭义的构造器——实例构造器(intance constructor)
构造函数没有返回值。
public 类名(){
}
public 类名(参数1,参数2,..){
}
//快捷键 cotr+tab键双击
方法的重载
方法签名(method signture)由方法的名称、类型形参的个数和它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。
方法签名不包含返回类型。
实例构造函数签名由它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。
重载决策(到底调用哪一个来重载):用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用。
参数种类(3种)
传值
传引用(ref)
输出(out)
形参(parameter)——变量
实参(argument)——值
操作符
本质:方法的简记。
基本操作符
x.y:
f(x):
a[x]:
x++(x--):先赋值,再自加。
x = 100; y = X++; ------------------- 输出:x = 101; y = 100;
typeof:查看一个类型的内部结构。
default:获取一个类型的默认值。
new(作操作符):
在内存中创建一个类型的实例并立刻调用其实例构造器。
得到实例的内存地址并将这个地址通过赋值符号交给负责访问这个实例的变量。
可调用实例的初始化器。
new Form(){ Text = "Hello" }.ShowDiaLog(); ----------------------------------------------------------- //为匿名类型创建对象并且用隐式类型变量来引用这个实例。 var person = new { Name = "Mr.Okey" , Age = 34 };
new非必要勿多用
原因:当前类与创建类紧耦合
改善策略:设计模式——依赖注入
new(作修饰符):子类继承父类时重写父类方法(不常用)
checked:检查一个值在内存中是否有溢出。(需放在不安全代码块)
unchecked:不检查一个值在内存中是否有溢出。
delegate:
sizeof:
->:
一元(单目)操作符
&x:取址。
*x:指针 / 取引用(只能操作结构体类型,不能操作引用类型)
+:正数
-:求相反数(实质:按位取反再加1)
~:对一个值在二进制级别按位取反。
!:非(只能操作布尔类型)
++x(--x):先自加,再赋值。
x = 100; y = ++x; ----------------- 结果:x = 101; y = 101;
(T)x:类型转换
await:
算术运算符
+, - , * , / , %
浮点数乘法表
浮点数除法表
namespace Demo { class Program { static void Main(string[] args) { double x = 5 / 4; Console.WriteLine(x); Console.WriteLine(x.GetType().FullName); double y = (double)5 / 4; //类型提升,先将5转成double类型 Console.WriteLine(y); Console.WriteLine(y.GetType().FullName); double z = (double)(5 / 4); //将5/4结果int类型的1转成double类 Console.WriteLine(z); Console.WriteLine(z.GetType().FullName); } } } --------------------------------------------------------- 结果: 1 System.Double 1.25 System.Double 1 System.Double
浮点数取余
namespace Demo { class Program { static void Main(string[] args) { double x = 3.5; double y = 3; Console.WriteLine(x%y); } } } -------------------------- 结果:0.5
浮点数加法表
浮点数减法表
移位操作符
左移无论正负,用0补位。
右移正数最高位补0,负数最高位补1.
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int x = 7;
int y = x << 2; //不溢出的情况下左移x位就是乘2^x
string strX = Convert.ToString(x, 2).PadLeft(32, '0');
string strY = Convert.ToString(y, 2).PadLeft(32, '0');
Console.WriteLine (strX) ;
Console.WriteLine (strY) ;
Console.WriteLine (y);
}
}
}
-----------------------------------------------------------
结果: 00000000000000000000000000000111
00000000000000000000000000011100
28
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int x = 7;
int y = x >> 2; //不溢出的情况下右移x位就是除以2^x
string strX = Convert.ToString(x, 2).PadLeft(32, '0');
string strY = Convert.ToString(y, 2).PadLeft(32, '0');
Console.WriteLine (strX) ;
Console.WriteLine (strY) ;
Console.WriteLine (y);
}
}
}
---------------------------------------------------------------
结果: 00000000000000000000000000000111
00000000000000000000000000000001
1
关系运算操作符
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int x = 5;
double y = 4.0;
var result = x >= y;
Console.WriteLine(result.GetType().FullName);
Console.WriteLine(result);
}
}
}
-----------------------------------------------------------
结果: System.Boolean
True
namespace Demo
{
class Program
{
static void Main(string[] args)
{
char char1 = 'a';
char char2 = 'A';
var result = char1 > char2;
Console.WriteLine(result);
}
}
}
----------------------------------------------
结果: True
97
65
namespace Demo
{
class Program
{
static void Main(string[] args)
{
String str1 = "abc";
String str2 = "Abc";
Console.WriteLine(str1==str2);
Console.WriteLine(str1.ToLower()==str2.ToLower());
}
}
}
-------------------------------------------------
结果: False
True
类型检验操作符
is
namespace Demo
{
class Program
{
static void Main(string[] args)
{
Teacher t1 = new Teacher();
var result1 = t1 is Teacher;
Console.WriteLine(result1.GetType().FullName);
Console.WriteLine(result1);
Teacher t2 = null;
var result2 = t2 is Teacher;
Console.WriteLine(result2);
Console.WriteLine(t1 is Human);
Console.WriteLine(t1 is Animal);
Human h = new Human();
Console.WriteLine(h is Teacher);
Car car = new Car();
Console.WriteLine(car is Animal);
Console.WriteLine(car is Object);
}
}
class Animal
{
public void Eat()
{
Console.WriteLine("Eating...");
}
}
class Human : Animal
{
public void Think()
{
Console.WriteLine("Who am i");
}
}
class Teacher : Human
{
public void Teach()
{
Console.WriteLine("Teach Programing");
}
}
class Car
{
public void Run()
{
Console.WriteLine("running");
}
}
}
---------------------------------------------------
结果:
System.Boolean
True
False
True
True
False
False
True
as
namespace Demo
{
class Program
{
static void Main(string[] args)
{
Object o = new Teacher();
Teacher t = o as Teacher;
if (t != null)
{
t.Teach();
}
}
}
class Animal
{
public void Eat()
{
Console.WriteLine("Eating...");
}
}
class Human : Animal
{
public void Think()
{
Console.WriteLine("Who am i");
}
}
class Teacher : Human
{
public void Teach()
{
Console.WriteLine("Teach Programing");
}
}
}
------------------------------------------
结果: Teach Programming
逻辑
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int x = 7;
int y = 28;
int z1 = x & y; //逻辑与(AND),同真则真
string strX = Convert.ToString(x,2).PadLeft(32,'0');
string strY = Convert.ToString(y,2).PadLeft(32,'0');
string strZ = Convert.ToString(z1,2).PadLeft(32,'0');
Console.WriteLine(strX);
Console.WriteLine(strY);
Console.WriteLine(strZ);
int z2 = x | y; //逻辑或(OR),有真则真
Console.WriteLine(Convert.ToString(z2,2).PadLeft(32,'0'));
int z3 = x ^ y; //逻辑异或(XOR),同假异真
Console.WriteLine(Convert.ToString(z3, 2).PadLeft(32, '0'));
}
}
}
---------------------------------------------------
结果:
00000000000000000000000000000111
00000000000000000000000000011100
00000000000000000000000000000100
00000000000000000000000000011111
00000000000000000000000000011011
关系
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int x = 5;
int y = 4;
int a = 100;
int b = 200;
if( x > y && a < b) //同真则真
{
Console.WriteLine("Hello");
}
if( x < y && a < b)
{
Console.WriteLine("NoHello");
}
if (x < y || a < b) //有真则真
{
Console.WriteLine("Hello");
}
}
}
}
---------------------------------------------
结果: Hello
Hello
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int x = 3;
int y = 4;
int a = 3;
if(x > y && a++ > 3) //短路效应(第一个表达式为假,结果一定假,第二个表达式不执行)
{
Console.WriteLine("Hello");
}
Console.WriteLine(a);
if (x > y || ++a > 3)
{
Console.WriteLine("Hello");
}
Console.WriteLine(a);
}
}
}
--------------------------------------------------------
结果: 3
Hello
4
namespace Demo
{
class Program
{
static void Main(string[] args)
{
int x = 5;
int y = 4;
int a = 3;
if(x > y && a++ > 3) //后置++先赋值后自加,3>3为假,Hello不打印
{
Console.WriteLine("Hello");
}
Console.WriteLine(a); //a++执行过,a变为4
if (x > y || a++ > 3)
{
Console.WriteLine("Hello");
}
Console.WriteLine(a);
}
}
}
----------------------------------------------------------------
结果: 4
Hello
4
null合并
异常
FormatException:格式错误异常
DivideByZeroException:除零异常
OverflowException:当检查的上下文中的算术、强制转换或转换操作导致溢出时引发的异常。