- 面向对象与面向过程编程语言的区别:
- 面向过程: 是一种以过程为中心的编程思想。它是一种基础的顺序思维方式,是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响;特性: 模块化、流程化;常见的 面向过程编程语言 有: C语言、COBOL 语言、Fortran语言 等。(优点: 性能比面向对象高,面向对象类调用需要实例化,消耗资源)
- 面向对象: 是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。它是直接把所有事物都当作独立的对象,处理问题过程中所思考的不再主要是怎样用数据结构来描述问题,而是直接考虑重现问题中各个对象之间的关系。(面向对象方法的基础实现中也包含面向过程思想);特性: 抽象 封装 继承 多态;常见的支持面向对象的编程语言有:C++ 语言、C# 语言、Java 语言、Python等。(优点: 有封装、继承、多态的特性,故而易维护、易复用、易扩展)
1. .NET与C#的关系:
2. .NET Framework 与 .NET Core的关系:
更多内容:详见.NET Framework 与 .NET Core 的区别与联系
C# 的类型一共分为两类,一种是值类型(Value Type),一类是引用类型(Reference)。
更多内容:详见C#的两种类据类型:值类型和引用类型
1. 变量与常量
2. 注释
1. 数组
2. 集合
※ 装箱与拆箱的概念:(装箱 与 拆箱 的过程会产生较多的性能损耗)
※ 集合与数组小结:
- 集合与数组比较类似,都用于存放 一组值;
- 集合中提供了特定的方法能直接操作集合中的数据,并提供了不同的集合类型来实现特定的功能;
- 集合简单来说,就是数组的升级版,他可以动态的对集合的长度(即集合内最大元素的个数)进行定义和维护;
- List泛型的好处指,通过允许指定 泛型类或方法 操作的 特定类型,减少类型 强制转换 的需要和运行时错误的可能性,泛型提供了类型安全,但没有增加开销。
3. 字典
1. 分支语句:
if(/*判断语句*/)
{
//代码
}
if(/*判断语句*/)
//代码
else if(/*判断语句*/)
//代码
else if(/*判断语句*/)
//代码
else
//代码
switch (变量)
{
case 值:
{
//代码段
}
break;
case 值2:
//代码句
break;
default:
{
代码段
}
break;
}
2. 循环语句:
while(condition)
{
statement(s); //代码块
}
for (int a = 10; a < 20; a = a + 1)
{
Console.WriteLine("a 的值: {0}", a);
}
int[] fibarray = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 };
foreach (int element in fibarray)
{
System.Console.WriteLine(element);
}
/* do 循环执行 */
do
{
Console.WriteLine("a 的值: {0}", a);
a = a + 1;
} while (a < 20);
1. 定义方法:
<Access Specifier> <Return Type> <Method Name>(Parameter List)
{
Method Body
}
2. 参数传递:
当调用带参数返回的方法时,需要向方法传递参数;C#中,有三种参数传递方式:值参数传递、引用参数传递、输出参数传递。
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void swap(int x, int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 temp 赋值给 y */
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部变量定义 */
int a = 100;
int b = 200;
Console.WriteLine("在交换之前,a 的值: {0}", a);
Console.WriteLine("在交换之前,b 的值: {0}", b);
/* 调用函数来交换值 */
n.swap(a, b);
Console.WriteLine("在交换之后,a 的值: {0}", a);
Console.WriteLine("在交换之后,b 的值: {0}", b);
Console.ReadLine();
}
}
}
==>结果:(结果表明,即使在函数内改变了值,值也没有发生任何的变化。)
在交换之前,a 的值:100
在交换之前,b 的值:200
在交换之后,a 的值:100
在交换之后,b 的值:200
namespace CalculatorApplication
{
class NumberManipulator
{
public void swap(ref int x, ref int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 temp 赋值给 y */
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部变量定义 */
int a = 100;
int b = 200;
Console.WriteLine("在交换之前,a 的值: {0}", a);
Console.WriteLine("在交换之前,b 的值: {0}", b);
/* 调用函数来交换值 */
n.swap(ref a, ref b);
Console.WriteLine("在交换之后,a 的值: {0}", a);
Console.WriteLine("在交换之后,b 的值: {0}", b);
Console.ReadLine();
}
}
}
==>结果:(结果表明,swap 函数内的值改变了,且这个改变可以在 Main 函数中反映出来。)
在交换之前,a 的值:100
在交换之前,b 的值:200
在交换之后,a 的值:200
在交换之后,b 的值:100
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void getValues(out int x, out int y )
{
Console.WriteLine("请输入第一个值: ");
x = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入第二个值: ");
y = Convert.ToInt32(Console.ReadLine());
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部变量定义 */
int a , b;
/* 调用函数来获取值 */
n.getValues(out a, out b);
Console.WriteLine("在方法调用之后,a 的值: {0}", a);
Console.WriteLine("在方法调用之后,b 的值: {0}", b);
Console.ReadLine();
}
}
}
==>结果:(结果取决于用户输入)
请输入第一个值:
7
请输入第二个值:
8
在方法调用之后,a 的值: 7
在方法调用之后,b 的值: 8
※ 辨析:out 和 ref 的区别:
- out 修饰的参数必须在方法内修改,ref可以修改也可以不修改;
- out 在传入参数的时候,参数是局部变量的话,可以不用赋值;
- ref 修饰的参数,在实参必须有初始值才能调用。(因为ref修饰的不一定会给它赋值)
类和对象是面向对象编程的两个核心概念。
※ 类与对象的关系:
- 类是模板,对象是根据 类 这个模板创建出来的,应该是 先有类,再有对象;
- 类只有一个,而对象可以有很多个;(不同对象之间属性的具体方法可能各不相同)
- 类中定义了什么 属性和方法,对象 中就有什么属性和方法,不可能多,也不可能少
内容详见:《C# 语言入门详解(刘铁锰) - 学习笔记 - 委托》
内容详见:《C# 语言入门详解(刘铁锰) - 学习笔记 - 泛型》
内容详见:《C# 语言入门详解(刘铁锰) - 学习笔记 - 接口与抽象类》
内容详见:《C# 语言入门详解(刘铁锰) - 学习笔记 - 类的继承 之 重写与多态、密封类与密封方法》
内容详见:《C# 语言入门详解(刘铁锰) - 学习笔记 - 枚举类型/结构体》
内容详见:《C# 语言入门详解(刘铁锰) - 学习笔记 - Lambda表达 / Linq查询》