/*
*文章未优化完成,我会尽快维护
*/
目錄
一、类库:图书馆,命名空间:书架,类:书籍,方法:目录
1、类库的引用:
2、初识类与名称空间:
3、依赖关系:
4、类与对象的关系:
5、类的三大成员:
6、静态成员与实例成员:
二、C#语言的基本元素、类型、变量、方法、算法:
1、构成C#语言的基本元素:
2、简要介绍类型、变量和方法:
3、算法简介:
三、类型
1、什么是类型(Type)
2、类型在C#语言中的作用
3、C#语言的类型系统
四、变量、对象与内存
1、什么是变量:
2、值类型的变量
3、引用类型的变量和实例
4、局部变量是在stack(栈)上分配内存
5、变量的默认值
6、常量(值不可改变的变量)
7、装箱与拆箱(Boxing & Unboxing)
五、方法的定义、调用与调试:
1、方法的由来:
2、方法的定义与调用:
3、构造器(一种特殊的方法):
4、方法的重载:
5、如何对方法进行Debug
6、方法的调用与栈(*难点)
六、操作符
1、操作符概述
2、操作符的本质
3、操作符的优先级
4、同级操作符的运算顺序
5、基本操作符
6.一元操作符
七、表达式和语句
1、表达式的定义
2、各式表达式概览
3、语句的定义
4、语句详解
八、字段、属性、索引器、常量
1、字段
2、属性:
3、索引器
4、常量
九、传值/输出/引用/数组/具名/可选参数,扩展方法
1、传值参数
2、输出参数
3、引用参数
4、数组参数
5、具名参数
6、可选参数
7、扩展方法(this参数)
十、委托
1、什么是委托
2、委托的声明(自定义委托)
3、委托的使用
十一、事件
1、初步了解事件
2、事件的应用
3、深入理解事件
4、事件的声明
5、问题辨析
一、类库:图书馆,命名空间:书架,类:书籍,方法:目录
1、类库的引用:
(1) 类库引用是使用名称空间的物理基础
不同技术类型的项目会默认引用不同类型的类库。
(2) DLL引用(黑盒引用,无源代码)
NuGet简介(DLL服务器)
(3) 项目引用(白盒引用,有源代码)
2、初识类与名称空间:
(1) 类(class)是构成程序的主体【初学者需要知道的定义】。
(2) 类(class)是最基础的C#类型。类是一个数据结构,将状态(字段)和操作(方法和其他函数成员)组合在一个单元中。类为动态创建的类实例(instance)提供了定义,实例也称为对象(object)。类支持继承(inheritance)和多态性(polymorphism),这是派生类(derived class)可用来扩展和专用化基类(base class)的机制【C#语言文档的定义】。
(3) 类(class)是现实世界事物的模型;
类是对现实世界事物进行抽象所得到的结果;
[1]事物包括“物质”(实体)与“运动”(逻辑);
[2]建模是一个去伪存真、由表及里的过程(将程序中用到的东西留下;“表” 就是看得到的接口,“里”就是看不到的封装的逻辑。)。
名称空间(namespace):以树型结构组织类(和其他类型),例如:Button和Path类。
命名空间保证同名的类不冲突。
3、依赖关系:
(1) 类(或对象)之间的耦合关系;
(2) 优秀的程序追求“高内聚,低耦合”;
高内聚:将类放到该放的类库中;
低耦合:类与类之间的关系尽量低依赖;
教学程序往往会违反这个原则;
(3) UML(通用建模语言)类图;
【*依赖关系是软件质量的关键。】
4、类与对象的关系:
(1) 对象也叫实例,是类经过“实例化”后得到的内存中的实体;
Formally “instanc” is synonymous with “object”——对象和实例是一回事;
“飞机”与“一架飞机”有何区别?天上有(一架)飞机——必须是实例飞,概念是不能飞的;
有些类是不能实例化的,比如“数学”(Math Class),我们不能说“一个数学”。
(2) 依照类,我们可以创建对象,这就是“实例化”;
现实世界中常称“对象”,程序世界中常称“实例”,二者并无太大区别,常常混用。
(3) 实例化:使用new操作符创建类的实例,后面加上()构造器。
(4) 引用变量与实例的关系;
孩子与气球;
气球不一定有孩子牵着;
多个孩子可以使用各自的绳子牵着一个气球,也可以都通过一个绳子牵着气球。
namespace ClassAndInstance
{
class Program
{
static void Main(string[] args)
{
Form myForm; //创建引用变量
myForm = new Form(); //将new出来的实例Form,赋值给引用变量myForm
myForm.Text = "MyForm"; //给Form的标题命名为MyForm
myForm.ShowDialog(); //显示输出窗口
}
}
}
5、类的三大成员:
(1) 属性(Property)
存储数据,组合起来表示类或对象当前的状态
(2) 方法(Method)
由C语言中的函数(function)进化而来,表示类或对象“能做什么”
工作中90%的时间是在与方法打交道,因为它是“真正做事”、“构成逻辑”的成员
namespace EventSample
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//*实例化
DispatcherTimer timer = new DispatcherTimer();
//*给属性值
//间隔多长时间触发一次Tick(这里是一秒钟)
timer.Interval = TimeSpan.FromSeconds(1);
//*挂接事件处理器
//事件“Tick”通过“+=”将函数“timer_Tick”挂接,这个事件触发时,下面的函数就会执行。
//所以这个方法叫做事件处理器。
timer.Tick += timer_Tick;
//*方法调用
//让时钟开始
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
//事件触发时,执行下面方法
//访问当前时间(时钟)
this.timeTextBox.Text = DateTime.Now.ToString();
}
}
}
(3) 事件(Event)
类或对象通知其它类或对象的机制,为C#所特有(Java通过其他办法实现这个机制)
善用事件机制非常重要
(4) 使用MSDN文档
(5) 某些特殊类或对象在成员方面侧重点不同
模型类或对象重在属性,如:Entity Framework
工具类或对象重在方法,如:Math,Console
通知类或对象重在事件,如各种Timer
6、静态成员与实例成员:
(1) 静态(Static)成员在语义上表示它是“类的成员”
(2) 实例(非静态)成员在语义表示它是“对象的成员”
namespace StaticSample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello!"); //*静态:WriteLine隶属于Console,由Console直接调用
Form form = new Form(); //*实例:实例化,定义变量form
form.Text = "Hello!"; //通过变量form来调用实例的方法“Text”
form.ShowDialog();
}
}
}
(3) 绑定(Binding)指的是编译器如何把一个成员与类或对象关联起来
不可小觑的“.”操作符——成员访问
(类.类成员,实例.实例成员)
二、C#语言的基本元素、类型、变量、方法、算法:
1、构成C#语言的基本元素:
(1)关键字(Keyword)
MSDN文档:Visual C#->C#Reference(所有关键字)
(2)操作符(Operator)
Visual C#->C#Reference->C#Operators(所有运算符)
(3)标识符(Identifier)
合法的标识符(阅读语言定义文档)
大小写规范(变量名用驼峰命名法,类、方法用Pascal命名法[所有单词首字母大写])
命名规范
int inForm = 100; //驼峰命名法
Console.WriteLine(inForm); //Pascal命名法
(4)标点符号
(5)文本(字面值)
整数(多种后缀)
int z = 10;
long h = 10L;
实数(多种后缀)
float X = 10.0F;
double Y = 20.0D;
字符
char c = ‘a’;
字符串
string str = “abcde”;
布尔
bool b = true;
bool b2 = false;
空(NULL)
(6)注释与空白
单行
多行(块注释)
2、简要介绍类型、变量和方法:
(1)初识类型(Type)
亦称数据类型(Data Type)
var v = 3L;
Console.WriteLine(v.GetType().Name); //INT64
(2)变量是存放数据的地方,简称“数据”
变量的声明
变量的使用
(3)方法(旧称函数)是处理数据的逻辑,又称“算法”
方法的声明
方法的调用
namespace Identifiers
{
class Program
{
static void Main(string[] args)
{
Calculator c = new Calculator();
int x = c.Add(2,3);
Console.WriteLine(x);
Calculator d = new Calculator();
string str = d.Today();
Console.WriteLine(str);
Calculator a = new Calculator();
a.PrintSum(4,5);
}
}
class Calculator
{
public int Add(int a, int b)
{
int result = a + b;
return result;
}
public string Today()
{
int day = DateTime.Now.Day;
return day.ToString();
}
public void PrintSum(int a, int b)
{
int result = a + b;
Console.WriteLine(result);
}
}
}
(4)程序=数据+算法
3、算法简介:
(1)循环体验
(2)判断体验
namespace Identifiers
{
class Program
{
static void Main(string[] args)
{
Calculator x = new Calculator();
x.PrintXTo1(10);
}
}
class Calculator
{
//public void PrintXTo1(int x) //循环输出
//{
// for (int i = x; i > 0; i--)
// {
// Console.WriteLine(i);
// }
//}
public void PrintXTo1(int x) //判断输出(自己调用自己)
{
if (x == 1)
{
Console.WriteLine(x);
}
else
{
Console.WriteLine(x);
PrintXTo1(x-1);
}
}
}
}
(3)1~100相加
namespace Identifiers
{
class Program
{
static void Main(string[] args)
{
Calculator x = new Calculator();
int result = x.SumFrom1ToX(100);
Console.WriteLine(result);
}
}
class Calculator
{
//public int SumFrom1ToX(int x) //循环
//{
// int result = 0;
// for (int i = 1; i < x + 1; i++)
// {
// result = result + i;
// }
// return result;
//}
//public int SumFrom1ToX(int x) //递归
//{
// if (x==1)
// {
// return 1;
// }
// else
// {
// int result = x + SumFrom1ToX(x-1);
// return result;
// }
//}
public int SumFrom1ToX(int x)
{
return (1 + x) * x / 2;
}
}
}
【*注:ctrl+k+c:所选部分注释; ctrl+k+u:所选部分解除注释。】
三、类型
1、什么是类型(Type)
(1)又名数据类型(Data Type)
A data type is a homogeneous collection of values,effectively presented,equipped presented,equipped with a set of operations which manipulate these values.
是数据在内存中存储时的“型号”。
小内存容纳大尺寸数据会丢失精准度、发生错误。
大内存容纳小尺寸数据会造成浪费。
编程语言的数据类型与数据的数据类型不完全相同。
namespace StrongTyped
{
class Program
{
static void Main(string[] args)
{
int x; //int:32个bit,4字节
x = 100;
long y; //long:64个bit位,8个字节
y = 100L;
x = 100L; //int型的x,放不了100L
bool b;
b = 100; //识别不了数值
if( x = 200 ) //因为x被赋值200,不是布尔值,就输出不了
{
Console.WriteLine("It's OK!");
}
}
}
}
(2)强类型语言与弱类型语言的比较
强类型语言:受数据类型影响较大,弱类型语言则相反。
C语言示例:if条件。
JavaScript示例:动态类型。
C#语言对弱类型/动态类型的模仿。
int _tmain(int argc, _TCHAR* argv[])
{
int x = 100;
if( x = 200 ) //在if语句中被重新赋值为200,会输出结果。因此常被写作 200==x
{
printf("It's OK!\n");
}
return 0;
}
2、类型在C#语言中的作用
(1)一个C#类型中所包含的信息有:
[1]存储此类型变量所需的内存空间大小。
[2]此类型的值可表示的最大最小值范围。
[3]此类型所包含的成员(如方法、属性、事件等)。
[4]此类型由何基类派生而来。
namespace TypeSample
{
class Program
{
static void Main(string[] args)
{
Type myType = typeof(Form);
PropertyInfo[] pInfo = myType.GetProperties(); //PropertyInfo:属性的信息
MethodInfo[] mInfo = myType.GetMethods(); //MethodInfo:方法的信息
//foreach(var p in pInfo)
//{
// Console.WriteLine(p.Name);
//}
foreach(var m in mInfo)
{
Console.WriteLine(m.Name);
}
Console.WriteLine(myType.Name);
Console.WriteLine(myType.FullName);
Console.WriteLine(myType.BaseType);
Console.WriteLine(myType.BaseType.BaseType.FullName);
}
}
}
[5]程序运行的时候,此类型的变量在分配在内存的什么位置:
Stack简介(栈),
Stack overflow,
Heap简介(堆),
使用Performance Monitor查看进程的堆内存使用量,
关于内存泄漏;
/*栈*/
namespace StackOverflow
{
class Program
{
static void Main(string[] args)
{
BadGuy bg = new BadGuy(); //先创建实例
bg.BadMethod(); //调用方法
}
}
class BadGuy
{
public void BadMethod()
{
int x = 100;
this.BadMethod(); //递归:不断的调用自己,最后栈会爆掉
}
}
}
namespace StackOverflow
{
class Program
{
static void Main(string[] args)
{
unsafe
{
int* p = stackalloc int[9999999]; //在栈上面切内存,只要足够大就会爆掉
}
}
}
}
/*堆*/
namespace HeapSample
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
List<Window> winList; //变量,声明在函数之外,Window占用内存高
private void Button1_Click(object sender, RoutedEventArgs e)
{
winList = new List<Window>(); //创建List实例,可以装Window
for (int i = 0; i < 15000; i++ )
{
Window w = new Window(); //引用变量w,牵着Windows()实例
winList.Add(w); //加入队列
}
}
private void Button2_Click(object sender, RoutedEventArgs e)
{
winList.Clear(); //清除内存
}
}
}
[6]此类型所允许的操作(运算)。
namespace