C# 基本语法。
Published: 2023-12-09 04:30:01

# C#简介
c#是专门为.net框架设计的语言。运行环境是首先c#编译为中间语言（IL intermediate language），然后在.net运行时（CLR common language infrastructure）环境中执行，其中CLR提供了内存管理、异常处理、安全性等服务。
c#和.net被发明的目的：提供统一的跨平台的编程环境，加强不同语言不通操作系统之间的互操作性。
兼容语言：遵循CLI规范的编程语言。
CLI能让编写的代码能够在不同的环境中运行。
CTS：（common type system），是CLI的一个关键部分，比如说，遵循咧CLI的语言，一个用 C# 编写的类可以被 VB.NET 或其他 CLI 兼容语言使用。
元数据：描述程序结构的数据，比如，一个类的定义、方法的签名都是元数据。
C#不是解释性语言，他是先编译为IL，然后在有CLR通过JIT（just in time compiler）编译成机器代码，既有编译型语言的性能，又有解释型语言的灵活。
对于C#的跨平台能力，C#可以在windows、linux以及macos上运行无需更改代码。
**总结** C#和.net是为了统一的编程环境和良好的跨平台能力而被研发，C#首先被编译为IL，然后IL由CLR通过JIT编译成机器代码。
### .net框架
包括CLR和庞大的类库，组件不像c++中的类或代码片段，在.net中，通常是以类库的形式存在，提供了可重用的代码单元

# C#环境配置
我们使用的是vscode通过ssh连到阿里云，我们使用的是linux进行开发，所以我们使用以下步骤来配置环境：
```bash
wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
```
然后安装依赖：
```bash
sudo apt-get update; \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-6.0
```

上述是6.0，下面是7.0
```cs
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-7.0
```


# C#程序结构
包含如下
1.命名空间声明
2.一个class
3.class属性
4.一个main方法
5.语句&表达式
文件后缀为cs

下面是示例代码
```cs
using System;
namespace HelloWorldApplication
{
   class HelloWorld
   {
      static void Main(string[] args)
      {
         /* 我的第一个 C# 程序*/
         Console.WriteLine("Hello World");
         Console.ReadKey();
      }
   }
}
```
编译这个程序
1.创建一个新的.net控制台应用程序项目
```bash
dotnet new console -n HelloWordApp -o HelloWordApp
```
dotnet new console用来创建新项目的命令，console指定项目模版类型，
-n HelloWordApp指定新项目的名称，在这里新项目被命名为HelloWordApp
-o 这里指定新项目的输出目录，

这里面的Program.cs是程序的入口函数Main的部分，然后我们直接在项目目录中dotnet run就ok了。
项目目录中还有一些文件和目录，obj和bin分别是中间文件和最终可执行文件的目录
.csproj是项目配置文件，里面包含了元数据和依赖项信息。

# C#基本语法
示例代码
```cs
using System;
namespace RectangleApplication
{
    class Rectangle
    {
        // 成员变量
        double length;
        double width;
        public void Acceptdetails()
        {
            length = 4.5;    
            width = 3.5;
        }
        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 ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.Acceptdetails();
            r.Display();
            Console.ReadLine();
        }
    }
}
```
using System 允许您在代码中直接使用 System 命名空间中的类和方法。
namespace 用于组织相关的类，避免命名冲突。
每个 C# 程序都必须有一个 Main 方法作为程序的入口点，且 Main 方法必须位于某个类中。因为C#是面向对象编程不支持全局方法。

# C#数据类型
值类型：就是一些c++的内置类型
引用类型：引用类型的变量存储的是对象的引用（即内存地址），其实很像指针。
引用类型内置的又分为对象类型、动态类型和字符串类型，然后可由用户自定义的有class、interface还有delegate。我们先说说引用内置类型
对象类型：是所有数据类型的终极基类，可以被分配任何其他类型。其中一个值转变为对象类型时称为**装箱（boxing）**，对象类型转为值类型时称之为**拆箱（unboxing）**。
动态类型：有点类似于auto，但又不是，auto是在编译时确定了，而dynamic是在运行时确定的。
字符串类型：有点类似于const string。
```cs
string str = @"C:\Windows";
```
等价于
```cs
string str = "C:\\Windows";
```

# C#类型转换
没啥说的，挺简单的，和C++很像，看见了再说吧
[https://www.runoob.com/csharp/csharp-type-conversion.html](url)

C#中的委托可以看作是函数指针

关于程序集，DLL、EXE
其中程序集就是编译后的代码逻辑单元，DLL或EXE是这些代码的物理表现。