1. Form() 和 Form_Load()函数
Form() | 构造函数 | 先启动 | 这个是加载你界面上所有控件等等的东东 |
Form_Load() | 窗体加载函数 | 后启动 | 这个是加载你自定义的东东 |
(1): public Form():程序入口,它的InitializeComponent()
做了许多初始化的工作,所以Load才能成为一个事件,InitializeComponent为你的程序作了必要的初始化工作
(2) Form_Load():装载窗口事件, 是窗体启动时触发的事件
总的来讲:
程序先执行InitializeComponent(); 后执行Form_Load()
InitializeComponent()是进行一系列的初始化
Form_Load()是在窗体装载时发生的一个事件。
一般写程序你把自己要初始化的东东可以放在Form_Load中,当然也可以在InitializeComponent中,那就要重载InitializeComponent了。
来自 <Form 与Form_load_kunpeng146的博客-CSDN博客>
2. 在任何 C# 程序中的第一条语句都是:
using System;
来自 <C# 基本语法 | 菜鸟教程>
3. @字符串
C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待,
比如:
string str = @"C:\Windows";
等价于:
string str = "C:\\Windows";
- @ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。
来自 <C# 数据类型 | 菜鸟教程>
4. 整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:
- 0x 或 0X 表示十六进制,
- 0 表示八进制,
- 没有前缀则表示十进制。
整数常量也可以有后缀,可以是 U 和 L 的组合,其中,
- U 和 L 分别表示 unsigned 和 long。
- 后缀可以是大写或者小写,
- 多个后缀以任意顺序进行组合。
来自 <C# 常量 | 菜鸟教程>
5. 访问修饰符
- public:所有对象都可以访问;
- private:对象本身在对象内部可以访问;
- protected:只有该类对象及其子类对象可以访问
- internal:同一个程序集的对象可以访问;
- protected internal:访问限于当前程序集或派生自包含类的类型。
Internal 访问修饰符允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。换句话说,带有 internal 访问修饰符的任何成员可以被定义在该成员所定义的应用程序内的任何类或方法访问。
来自 <C# 封装 | 菜鸟教程>
6. 函数(方法)
当定义一个方法时,从根本上说是在声明它的结构的元素。在 C# 中,定义方法的语法如下:
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
Method Body
}
下面是方法的各个元素:
- Access Specifier:访问修饰符,这个决定了变量或方法对于另一个类的可见性。
- Return type:返回类型,一个方法可以返回一个值。返回类型是方法返回的值的数据类型。如果方法不返回任何值,则返回类型为 void。
- Method name:方法名称,是一个唯一的标识符,且是大小写敏感的。它不能与类中声明的其他标识符相同。
- Parameter list:参数列表,使用圆括号括起来,该参数是用来传递和接收方法的数据。参数列表是指方法的参数类型、顺序和数量。参数是可选的,也就是说,一个方法可能不包含参数。
- Method body:方法主体,包含了完成任务所需的指令集。
来自 <C# 方法 | 菜鸟教程>
7. 参数传递
- 按值传递参数
- 按引用传递参数
在 C# 中,使用 ref 关键字声明引用参数。下面的实例演示了这点:
public void swap(ref int x, ref int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 temp 赋值给 y */
}
swap(ref a, ref b);
- 按输出传递参数
return 语句可用于只从函数中返回一个值。但是,可以使用 输出参数 来从函数中返回两个值。输出参数会把方法输出的数据赋给自己,其他方面与引用参数相似。
public void getValues(out int x, out int y )
{
Console.WriteLine("请输入第一个值: ");
x = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入第二个值: ");
y = Convert.ToInt32(Console.ReadLine());
}
int a , b;
n.getValues(out a, out b);
8. 单问号?和Null合并运算符??
单问号?
? 单问号用于对 int、double、bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 Nullable 类型的。
Null 合并运算符( ?? )
目的:为了防止可空类型为null
语法:如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。
double? num1 = null;
double? num2 = 3.14157;
double num3;
num3 = num1 ?? 5.34; // num1 如果为空值则返回 5.34
来自 <C# 可空类型 | 菜鸟教程>
9. 基类的初始化
using System;
namespace RectangleApplication
{
class Rectangle
{
// 成员变量
protected double length;
protected double width;
public Rectangle(double l, double w)
{
length = l;
width = w;
}
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("长度: {0}", length);
Console.WriteLine("宽度: {0}", width);
Console.WriteLine("面积: {0}", GetArea());
}
}//end class Rectangle
class Tabletop : Rectangle
{
private double cost;
public Tabletop(double l, double w) : base(l, w)
{ }
public double GetCost()
{
double cost;
cost = GetArea() * 70;
return cost;
}
public void Display()
{
base.Display();
Console.WriteLine("成本: {0}", GetCost());
}
}
来自 <C# 继承 | 菜鸟教程>
10. 接口(Interface)
C# 不支持多重继承。但是,您可以使用接口来实现多重继承。
比如一个会飞的人(穿上飞行装备的人):
如果是多重继承,那就继承People的基础类,加上Bird的基础类,那不成“鸟人”了,怎么也觉得不好理解。
如果是接口的话,那就继承People的基础类,外加一个Fly的interface,Fly只是定义了一些列飞行相关的接口,你需要在FlyPeople这个类里面去实现所有定义的这些接口。
来自 <C# 之 抽象类(Abstract Class) vs 接口(Interface) - 知乎>
11. 命名空间(Namespace)
命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。
来自 <C# 命名空间(Namespace) | 菜鸟教程>
12. 委托(Delegate)
委托(Delegate)特别用于实现事件和回调方法。
C# 中的委托(Delegate)类似于 C 或 C++ 中函数模板。
委托声明决定了可由该委托引用的方法。委托可指向一个与其具有相同标签的方法。
例如,假设有一个委托:
delegate int NumberChanger(string str);
上面的委托可被用于引用任何一个带有一个单一的 string 参数的方法,并返回一个 int 类型变量。
delegate int NumberChanger(int n); //得到函数类型
class TestDelegate
{
static int num = 10;
public static int AddNum(int p) //同类型函数
{
num += p;
return num;
}
public static int MultNum(int q)//同类型函数
{
num *= q;
return num;
}
static void Main(string[] args)
{
NumberChanger nc1 = new NumberChanger(AddNum); // 创建委托实例nc1
NumberChanger nc2 = new NumberChanger(MultNum);// 创建委托实例nc2
nc1(25);/ /相当于AddNum(25)
nc2(5);/ /相当于AddNum(5)
}
}
13. 事件(Event)
13.1 显示委托的事件
显示声明委托通过委托声明事件
首先声明该事件的
委托类型函数类型。例如:public delegate void NumManipulationHandler();
然后,在发布类中声明事件(把事件当成函数,调用该函数时会触发订阅类的方法)本身,使用 event 关键字:
// 基于上面的函数类型定义事件
public event NumManipulationHandler ChangeNum;
注册一个普通类(在此称作订阅器类)的方法到事件
subscribEvent v = new subscribEvent(); /* 实例化对象 */
e.ChangeNum += new EventTest.NumManipulationHandler( v.printf ); /* 注册 */
事件发布对象.触发事件 += new 事件触发类.委托(事件订阅对象.方法) //注册
调用事件函数
e.ChangeNum();
即可调用subscribEvent类的v对象的printf()函数
13.2 泛型委托的事件
直接用泛型委托定义事件
直接用Action(无返回值)和Func(有返回值)的泛型委托定义事件
private event Action<int, int> testEvent= null;
13.3 注册方式
事件发布对象.触发事件 += new 事件触发类.委托(事件订阅对象.方法) //注册
事件 += 函数
13.4 调用方法
调用 事件发布对象.触发事件() 可以触发 事件订阅对象.方法
14. 委托和事件的区别
事件(Event)是委托(Delegate)的实际应用,思想设计模式中的观察者模式
event只能出现在"+="或"-="左边,不能显示调用事件发布对象.触发事件()
而委托可以显示调用委托发布对象.触发事件()