文章目录
菜鸟教程 C#
一:简介
- 微软(Microsoft)开发的
- C# 是 .Net 框架的一部分,且用于编写 .Net 应用程序
- C# 是
大小写敏感的;所有的语句和表达式必须以分号(;)结尾;程序的执行从 Main 方法开始; - C# 是一门编程语言,而
Mono是一套跨平台的 .NET 实现

二、 .NET Framework
.NET Framework 是微软 最早推出的 Windows 专属开发框架,专门用来开发 Windows 桌面程序、控制台程序 、ASP.NET 网站 等。
1、它是一个 "完整的开发平台":自带了大量基础类库(比如文件操作、网络请求、UI 控件),你写 C# 代码时不用从零造轮子。
2、只能在 Windows 上运行 ,不能跨平台(Linux、Mac 用不了)。
3、版本号越高,功能越多、越稳定,也越安全。

三、.Net Core/.NET 5+
最主要的区别:支持跨平台;

四、C#版本

比如顶级语言支持C#9.0以上,但是如果你的框架是4.7.2就不支持;

五、C# AI助手
VSCode 的插件 Fitten Code
六、开发工具
开发IDE:首选 Visual Studio实操
具体安装使用说明,可以参考我的另外一篇文章。
目前使用的是VS 2019;
B站教程 C#
002 C#简介
微软推出得一门编程语言:现代化、强类型、面向对象;
C#应用领域:
桌面应用WPF/Winforms ;
Web开发(ASP.NET Core);
后端开发;
游戏开发;
.NET 运行时和一整套开发框架:
.NET 版本区分:
.Net Framework:老Windows项目
.Net Core:跨平台,过渡版本
.Net:现代和未来,从.NET5开始
003 开发环境
Visual Studio 官网下载安装,社区版即可;
勾选需要的模块,.Net桌面版,默认安装C盘即可
005 变量和类型
区分大小写,驼峰命名法;
csharp
float c = 0.45f; // 单精度 浮点数 带后缀
double d = 12.3456; // 双精度 浮点数 不带后缀
decimal m = 3.45m; // 钱类型 浮点数 带后缀
Console.WriteLine($"{c} {d} {m}");
int a = 1;
int b = 2;
int result = a + b;
// 占位符 方式
Console.WriteLine("{0}+{1}= {2}",a,b,result);
// 字符串插值 方式
Console.WriteLine($"{a}+{b}= {result}");
Console.ReadLine();
007 类
类的 成员变量,先声明实例,再使用;
类的 静态变量,可以直接使用;
csharp
class Person {
// public 类外可以访问
// private 默认,外部不可访问
public int _age; // 成员变量,先声明实例,再使用
public string _name;
public static int maxAge =100; // 类的静态变量,直接使用
}
csharp
static void Main(string[] args)
{
// 实例化类,调用类的成员变量
Person p = new Person();
p._age = 12;
p._name = "xiaoming";
Person p2 = new Person();
p2._age = 14;
p2._name = "xiaohong";
// 调用类得静态变量
int maxage = Person.maxAge;
}
008 方法
方法必须写在类里面,没有全局方法;
情景一:控制台程序
1、VS新建

2、程序结构
csharp
// C# 大小写敏感
// 所有语句和表达式 ; 结尾
// 程序的执行从Main方法开始
//命名空间 using
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 顶级语言必须是 C#9.0版本以上才支持
// Console.WriteLine("Hello, World!");
// namespace 命名空间声明
namespace ConsoleApp1
{
// class 声明
class Program
{
// Main方法 所有C#入口点
static void Main(string[] args)
{
Console.WriteLine("Hello World");
//这使得程序会等待一个按键的动作,防止程序从 Visual Studio.NET 启动时屏幕会快速运行并关闭。
Console.ReadKey();
}
}
}
3、基本语法
C# 是一种面向对象 的编程语言。
在面向对象的程序设计方法中,程序由各种相互交互的对象组成。
相同种类的对象通常具有相同的类型,或者说,是在相同的 class 中。
csharp
// C# 大小写敏感
// 所有语句和表达式 ; 结尾
// 程序的执行从Main方法开始
//命名空间 using
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 顶级语言必须是 C#9.0版本以上才支持
// Console.WriteLine("Hello, World!");
// namespace 命名空间声明
namespace ConsoleApp1
{
// 新增class Rectangle
class Rectangle {
// 成员变量
double length;
double width;
// 成员函数
public void Acceptdetails()
{
length = 4.5;
width = 8.7;
}
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length:{0}", length);
Console.WriteLine("Width:{0}", width);
Console.WriteLine("Area:{0}", GetArea());
}
}
// class 声明
class Program
{
// Main方法 所有C#入口点
static void Main(string[] args)
{
Console.WriteLine("Hello World");
// 实例化Rectangle类
Rectangle r = new Rectangle();
r.Acceptdetails();
r.Display();
//这使得程序会等待一个按键的动作,防止程序从 Visual Studio.NET 启动时屏幕会快速运行并关闭。
Console.ReadKey();
//这使得程序会等待输入回车键之后,关闭。
//Console.ReadLine();
}
}
}
4、数据类型
4.1 值类型
从类 System.ValueType 中派生的;
csharp
// 值类型 sizeof检测占的字节数, 一个字节=8bit
Console.WriteLine("sizeof(bool) is:{0}", sizeof(bool)); // 1
Console.WriteLine("sizeof(char) is:{0}", sizeof(char)); // 2
Console.WriteLine("sizeof(int) is:{0}",sizeof(int)); // 4
Console.WriteLine("sizeof(long) is:{0}", sizeof(long)); // 8
Console.WriteLine("sizeof(float) is:{0}", sizeof(float)); // 4
Console.WriteLine("sizeof(double) is:{0}", sizeof(double)); // 8
4.2 引用类型
指的是一个内存位置;内置的 引用类型有:object、dynamic 和 string。
Object 对象类型:
是 System.Object 类的别名;
object 是 C# 所有类型的 "爸爸";
当一个值类型转换成对象类型时,称为装箱 ;
当对象类型转换为值类型时,称为拆箱;
csharp
// 对象类型 object 所有类型的爸爸
object obj = 100; // 装箱
int a = (int)obj; // 拆箱
Console.WriteLine(typeof(int)); // 输出:System.Int32
Console.WriteLine(obj.GetType());
Console.WriteLine(a.GetType()); // 输出:System.Int32
Dynamic 动态类型:
可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
String 字符串类型:
是 System.String 类的别名;
可以通过两种形式进行分配:引号和 @引号;
csharp
// 字符串类型 string
string str = "www.baidu.com";
Console.WriteLine("str is {0}, len is {1}",str,str.Length);
string str2 = @"www.baidu.com";
Console.WriteLine(str2);
string str3 = @"<script>
<!--
-->
<script>"; //@ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。
Console.WriteLine("str3 is {0}, len is {1}", str3,str3.Length);
4.3 指针类型
存储另一种类型的内存地址,C# 中的指针与 C 或 C++ 中的指针有相同的功能。
csharp
// 指针类型
unsafe
{
char c = 'A';
char* cptr = &c; // 取 c 的地址给指针
Console.WriteLine(*cptr); // 输出 A(指针指向的值)
Console.WriteLine((int)cptr); // 输出 c 的内存地址(十六进制转成了数字)
}
属性-允许不安全代码,否则报错。

5、数据转换
包含在System.Convert 类中
1、隐式转换:
int - long
byte -int
2、显式转换:
强制类型转换,
csharp
// 数据转换
// 隐式转换
byte b = 10;
int i = b;
Console.WriteLine(i.GetType());
// 显式转换
int i2 = 10;
byte b2 = (byte)i2;
Console.WriteLine(b2.GetType());
double doubleValue = 3.14;
int intValue = (int)doubleValue;
Console.WriteLine(intValue);
int intValue2 = 43;
string strValue = intValue2.ToString();
Console.WriteLine(strValue);
float floatValue = (float)intValue2;
Console.WriteLine(floatValue.ToString("0.00"));
string str4 = "123";
int number = Convert.ToInt32(str4); // 转换成功,number为123
6、C#变量作用域
静态方法里,只能直接访问静态变量 / 静态方法 。
要访问非静态成员 ,必须先 new 一个对象 ,通过对象访问。
静态成员属于「类」,非静态成员属于「对象」。
csharp
// class 声明
class Program
{
int memberVar = 30; // 非静态全局变量
static int memberVar2 = 31; // 静态全局变量
// Main方法 所有C#入口点
static void Main(string[] args)
{
// 调用非静态全局变量
Program p = new Program();
Console.WriteLine(p.memberVar);
// 直接调用静态全局变量
Console.WriteLine(memberVar2);
//这使得程序会等待一个按键的动作,防止程序从 Visual Studio.NET 启动时屏幕会快速运行并关闭。
Console.ReadKey();
}
}
7、C#类型
求字节数 用 sizeof
取类型信息 用typeof
常量:const
csharp
// sizeof
Console.WriteLine(sizeof(int));// 4
// typeof 只能写类 / 类型名,不能写对象 / 变量名
Type typeis = typeof(ConstTest); //ConstTest 类名
Console.WriteLine(typeis); // ConsoleApp1.ConstTest
Console.WriteLine(typeof(String)); // System.String
**
构造函数**有两个硬性规则:
1、名字必须和类名完全一样(区分大小写)
2、不能写返回值类型(连 void 都不用)

csharp
class ConstTest
{
public int x;
public int y;
public const int c1 = 5;
public const int c2 = c1 + 5;
// 构造函数 创建对象时初始化成员变量
// 1、名字必须和类名完全一样(区分大小写)
// 2、不能写返回值类型(连 void 都不用)
public ConstTest(int p1, int p2)
{
x = p1;
y = p2;
}
// 普通方法 必须写返回值 没有用void
public void printInfo()
{
Console.WriteLine("ConstTest-printInfo -const c1 is {0},const c2 is {1}", c1, c2); // 5,10
Console.WriteLine("ConstTest-printInfo -int x is {0},int y is {1}", x, y); // 如果构造函数,传递多少 ,显示多少;如果不构造,默认显示0
}
}
csharp
// 调用其他类
// 1_1. 创建 ConstTest 对象,有构造函数,给x和y赋值
ConstTest testObj = new ConstTest(55, 100);
// 1_2. 创建 ConstTest 对象,没有有构造函数,不给x y 赋值
//ConstTest testObj = new ConstTest();
// 2. 调用对象的普通方法 printInfo()
testObj.printInfo();
// 3. 也可以直接访问对象的成员变量
Console.WriteLine("x:{0} y:{0} ", testObj.x, testObj.y);
8、C#封装
封装被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。
在面向对象程序设计方法论中,封装是为了防止对实现细节 的访问。
C# 封装根据具体的需要,设置使用者的访问权限 ,并通过 访问修饰符 来实现。
注意:如果没有指定访问修饰符 ,则使用类成员的默认访问修饰符,即为 private。
1、Public:所有对象都可以访问;
2、 Private:对象本身对对象内部可以访问;
3、 Protected:只有该类对象及其子类对象可以访问;
更好实现继承;
4、 Internal:同一程序集的对象可以访问;
internal:同一个项目里用;
public:给外部项目用;
类的成员变量,默认推荐用 internal 或 private,不要随便用 public;
5、 Protected Internal:访问限于当前程序集或派生自的包含类的类型;
也被用于实现继承;

9、C#方法
情景二:Visual Studio
NuGet 包
NuGet 包 = .NET/ C# 世界的 "插件安装包";