一、简介
C#是一种现代的、面向对象的编程语言,由微软公司开发。它最初发布于2002年,是为了取代微软早期的编程语言Visual Basic和C++而开发的。C#语言在设计时考虑到了很多新的编程范式和技术,因此它既具备了C++语言的高效性和灵活性,又具备了Java语言的跨平台性和安全性。
C#语言主要应用于Windows平台的开发,特别是.NET平台上的开发。.NET平台是微软的一个开发平台,它包括了一个庞大的类库和各种工具,可以用来开发Windows应用程序、Web应用程序和服务端应用程序等。C#语言和.NET平台紧密结合,因此在.NET平台上使用C#语言进行开发是非常方便和高效的。
C#语言的语法相对简单易学,特别是对于熟悉C++或Java语言的程序员来说。它支持面向对象编程、泛型编程、事件驱动编程、异步编程等多种编程范式,可以应用于各种类型的应用程序的开发。
C#语言是一种强类型语言,这意味着变量必须先被声明为某种数据类型,然后才能被使用。C#语言支持多种数据类型,包括整型、浮点型、布尔型、字符型、字符串型等等。此外,C#语言还支持数组、枚举、结构体和类等复合数据类型。
C#语言的语法规范由ECMA(欧洲计算机制造商协会)和ISO(国际标准化组织)联合发布,目前最新版本为C# 10.0。C#语言的开发工具主要有Visual Studio和Visual Studio Code,这些工具提供了强大的调试、测试、部署和版本控制等功能,可以大大提高开发效率和代码质量。
C#语言在Windows平台上的应用非常广泛,它可以用于开发各种类型的桌面应用、Web应用和服务端应用等。此外,C#语言还可以用于开发游戏、机器学习、大数据处理等领域的应用程序。总的来说,C#语言是一种功能强大、易学易用的编程语言,适合各种类型的应用程序的开发。
二、编译
-
语法分析(Parsing):C#源代码在被编译之前,需要进行语法分析,将源代码转换成语法树。语法分析器会检查源代码是否符合C#语言的语法规范,如果有语法错误,则会发出编译错误提示。
-
语义分析(Semantic analysis):在语法和词法分析完成后,编译器会进行语义分析,检查源代码是否符合C#语言的语义规范。语义分析器会检查变量的类型、作用域、函数调用等等,如果存在语义错误,则会发出编译错误提示。
-
代码优化(Code optimization):在语义分析完成后,编译器会进行代码优化,使生成的目标代码更加高效和优化。代码优化包括删除死代码、常量折叠、函数内联等等。
-
代码生成(Code generation):最后一步是代码生成,编译器会将优化后的中间代码转换成目标代码(通常是机器码),并将目标代码输出到磁盘上的可执行文件中。这些步骤中的前三个是编译过程中最为重要的部分,它们保证了程序的正确性和可靠性,同时也为后面的代码优化和生成提供了必要的信息。
三、创建C#工程
开始使用 -> 创建新的项目 -> 模板选择:控制台应用(.Net Framework) -> 创建
1.注释
-
单行://xxxxx
-
多行: /* */
-
三个斜杠: /// 用在方法前、类前,作解释说明
2.打印
Console.Write(); //输出不换行
Console.WriteLine(); //输出换行
//背景颜色
Console.BackgroundColor=ConsoleColor.Green;
Console.WriteLine("Hello, World!");
//字体颜色
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Hello, World!");
//发出蜂鸣的声音(频率,时间)
Console.Beep(1000,10000);
// 用户控制台输入
Console.ReadLine();
3.标识符
1.组成
字母,数字,下划线
2.规则
-
数字不能开头
-
严格区分大小写
-
不能和C#关键字,类库名重名,命名规范: 1.简洁明了 2. 小驼峰
int studentNum; // 定义
studentNum = 45; // 赋值
Console.WriteLine("学生个数:" + studentNum); // 使用
int roomNum = 6;
Console.WriteLine("教室个数:" + roomNum + "。");
4.二进制
-
1字节(Byte)代表8位(bit),即 1Byte=8bit
-
区分存储的数的正负, 首位 0表示正数,1表示负数
-
练习
-
8位,最大正数是127 -> 0 111,1111 + 1 = 1000,0000
-
8位,最小负数是-128 -> 1000,0000
-
四、数据类型
在 C# 中,变量分为以下几种类型:
-
值类型(Value types)
-
引用类型(Reference types)
-
指针类型(Pointer types)

1.值类型(Value types)
简单类型
值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。
值类型直接包含数据。比如 int、char、float,它们分别存储数字、字符、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。
| 类型 | 描述 | 范围 | 默认值 |
|---|---|---|---|
| int | 32 位有符号整数类型 | -2,147,483,648 到 2,147,483,647 | 0 |
| short | 16 位有符号整数类型 | -32,768 到 32,767 | 0 |
| long | 64 位有符号整数类型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L |
| float | 32 位单精度浮点型 | -3.4 x 10^38 到 + 3.4 x 10^38 | 0.0F |
| double | 64 位双精度浮点型 | (+/-)5.0 x 10^-324 到 (+/-)1.7 x 10^308 | 0.0D |
| char | 16 位 Unicode 字符 | U +0000 到 U +ffff | '\0' |
| bool | 布尔值 | True 或 False | False |
| byte | 8 位无符号整数 | 0 到 255 | 0 |
| decimal | 128 位精确的十进制值,28-29 有效位数 | (-7.9 x 10^28 到 7.9 x 10^28) / 10^(0 到 28) | 0.0M |
| sbyte | 8 位有符号整数类型 | -128 到 127 | 0 |
| uint | 32 位无符号整数类型 | 0 到 4,294,967,295 | 0 |
| ulong | 64 位无符号整数类型 | 0 到 18,446,744,073,709,551,615 | 0 |
| ushort | 16 位无符号整数类型 | 0 到 65,535 | 0 |
值类型不可为空:int x = null (错误写法)。
可空值类型需要加?:int? x = null(正确写法)。
// 整数
int num = 2147483647;
Console.Writeline(sizeof(float));
// 进制
1M = 1024KB 1KB = 1024B 1B(字节) = 8b(位)
B:Byte字节 b:bit位
计算机中存储数据的最小单位:Byte字节
// 无符整数
byte 1B 8b 最小:0 最大:255
ushort 2B 16b 最小:0 最大:65535
uint 4B 32b 最小:0 最大:2^32-1
ulong 8B 64b 最小:0 最大:2^64-1
// 有符整数
// 区分存储的数的正负, 首位0表示正数,1表示负数
sbyte 1B 8b 最小:-128 最大:127
short 2B 16b 最小:-2^15 最大:2^15-1
int 4B 32b 最小:-2^31 最大:2^31-1
long 8B 64b 最小:-2^63 最大:2^63-1
// 实数
float:单精度 4B 在赋值时后面需要加上f
double:双精度 8B 一个数默认就是double类型
float a = 12.5616512f;
Console.Writeline(a);
double b = 0.5151561123456789;
Console.Writeline(b);
// 布尔
// bool:布尔类型,一般有两个取值:true 和 false。
int a = 5;
int b = 10;
bool c = a > b;
Console.Writeline("c = " + c);
// 字符
// char:字符 在赋值时需要加上 '' 单引号
//ASCII 值:https://baike.baidu.com/item/ASCII/309296?fr=aladdin
char a = 'A';
char b = 'b';
Console.Writeline(a + b);
枚举
定义枚举(定义到类外面或者命名空间里面)
结构:public enum 名字 { }
// 定义枚举(定义到类外面或者命名空间里面)
// 结构:public enum 名字 {}
// C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。
Week w=Week.Monday;
Console.WriteLine(w)
public enum Week
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
结构体
//定义结构体
// 结构:public struct 名字 { }
//定义结构体的类型:struct 名称{}
Rect juxing; //声明一个结构体的变量
juxing.length=100; //结构体里面的数据赋值,结构体变量,数据=值
juxing.width=200;
Console.WriteLine("矩形的面积:"+juxing.length*juxing.width);
struct Rect{
public float length;
public float width;
}
//定义结构体
// 结构:public struct 名字 {}
public struct Book
{
public float price;
public string name;
public int id;
}
public struct People
{
public string name;
public bool gender;
// 结构成员不能指定为 abstract、virtual 或 protected(默认是 private)。
private int money;
public void SetMoney(int a)
{
money = a;
Debug.Print(money);
}
}
1.结构可带有方法、字段、索引、属性、运算符方法和事件。
2.结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义默认的构造函数。默认的构造函数是自动定义的,且不能被改变。
3.与类不同,结构不能继承其他的结构或类。
4.结构不能作为其他结构或类的基础结构。
5.结构可实现一个或多个接口。
6.结构成员不能指定为 abstract、virtual 或 protected。
7.当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
8.如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
结构体和类的区别:
1.类是引用类型,结构是值类型。
2.结构不支持继承。
3. 结构不能声明默认的构造函数。
2.引用类型
对象(Object)类型
对象不好理解,放到所有类型讲完的后面讲解,此处先不讲解
对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。
当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。
动态(Dynamic)类型
您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
声明动态类型的语法:
dynamic <variable_name> = value;
//例如
dynamic d = 20
字符串(String)类型
字符串(String)类型 允许您给变量分配任何字符串值。字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。
例如:
String str = "runoob.com"
//一个 @引号字符串:
@"runoob.com";
//C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待
string str = @"C:\Windows"; 等价于:string str = "C:\\Windows";
// string:字符串。赋值的时候需要加上 "" 双引号
// string str = "这里面写的就是字符串";
// 练习
// 1.定义小明的身高和体重,输出字符串: 小明的身高是180cm,体重是75公斤
int height = 180;
int weight = 75;
Console.Write("小明的身高是" + height + "cm,体重是" + weight + "公斤");
// 2.定义两个变量a = 5,b = 4.4,分别输入出:a:5,b:4.4;a + b = 9.4
int a = 5;
float b = 4.4f;
Console.Write("a:" + a + ",b:" + b);
Console.Write("a + b = " + (a + b));
指针类型(Pointer types)
指针不好理解,放到所有类型讲完的后面讲解,此处先不讲解
指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。
声明指针类型的语法:
type* identifier;
//例如
char* cptr;
int* iptr;
区别:
放到所有类型讲完的后面讲解,此处先不讲解
-
值类型存储的是值本身,引用类型存储的是内存地址
-
赋值,调用方法传参数的时候。
五、常量
// 变量:值可以发生变化 int a = 5; float b = 4.4f;
// 常量:值不能发生变化 (就是一个固定的值)
const float PI = 3.14f;
六、工程其他代码解释
-
using 引用命名空间,关键字:using
-
namespace 定义一个新的命名空间,格式:namespace 命名空间 {}
-
internal(内部):限定的是只有在同一程序集中可访问,可以跨类
-
static 可以修饰字段或者方法,修饰字段的时候,表示这个字段是静态的数据,叫做静态字段或者静态属性,修饰方法的时候,叫做静态方法,或者静态函数(使用static修饰的成员,只能通过类名访问)
-
class 声明一个新的类:
/* * 定义一个静态的函数。 * 关键字:static(静态) 关键字:void(空返回) */ static void Main() /// <summary> /// 拿着钱去买买买 /// </summary> /// <param name="money">带着的钱数</param> static void GoShopping(int money) { Console.WriteLine(money); }

571

被折叠的 条评论
为什么被折叠?



