C# 基础

简介

C#(读作“See Sharp”)是一种新式编程语言,不仅面向对象,还类型安全。 开发人员利用 C# 能够生成在 .NET 中运行的多种安全可靠的应用程序。

C# 源于 C 语言系列,C、C++、Java 和 JavaScript 程序员很快就可以上手使用。

下面列出了 C# 成为一种广泛应用的专业语言的原因:

  • 现代的、通用的编程语言。
  • 面向对象。
  • 面向组件。
  • 容易学习。
  • 结构化语言。
  • 它产生高效率的程序。
  • 它可以在多种计算机平台上编译。
  • .Net 框架的一部分。

环境搭建

.NET 环境

安装 .NET Core SDK 下载 .NET(Linux、macOS 和 Windows) 下载安装完成后, 进入任务管理器,win + R 打开运行窗体 输入 cmd

输入指令 : dotnet --info 输出如下环境信息则表示搭建成功.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
.NET SDK:
 Version:   7.0.201
 Commit:    68f2d7e7a3

运行时环境:
 OS Name:     Windows
 OS Version:  10.0.19045
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\7.0.201\

Host:
  Version:      7.0.3
  Architecture: x64
  Commit:       0a2bda10e8

.NET SDKs installed:
  7.0.201 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 7.0.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found:
  x86   [C:\Program Files (x86)\dotnet]
    registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download

如果输入后发现显示的是 dotnet不是内部或外部的命令,也不是可运行的程序或批处理文件 需要手动添加环境变量. 添加内容如下: 在“系统变量”部分选中 Path,并点击编辑 添加如下路径:

1
2
3
4
5
C:\Windows;
C:\Windows\System32\System32\Wbem;
C:\Windows\System32;
C:\Program Files\dotnet;
C:\Windows\System32\WindowsPowerShell\V1.0;

接着点击确定保存,

重新打开 CMD 窗口 输入 dotnet --info

Hello,World

打开 CMD 窗口 ,输入 dotnet new console -o testObj

创建一个名为 testObj的控制台程序,如果创建成功,控制台会输出如下信息

1
2
3
4
5
6
7
8
$ dotnet new console -o testObj
已成功创建模板“控制台应用”。

正在处理创建后操作...
正在还原 C:\Users\35367\Desktop\testObj\testObj.csproj:
  正在确定要还原的项目…
  已还原 C:\Users\35367\Desktop\testObj\testObj.csproj (用时 114 ms)。
已成功还原。

然后找到项目路径下的 Program.cs 文件,使用 IDE 或者编辑器将文件内容改为下面的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
using System;  
namespace HelloWorldApplication  
{  
    class HelloWorld  
    {  
        static void Main(string[] args)  
        {  
            Console.WriteLine("Hello World");  
            Console.ReadKey();  
        }  
    }  
}

接着将控制台移动到你的项目目录下.输入 dotnet run Program.cs 如果输出 Hello World! 说明 C# 环境搭建成功.

C# 的 IDE

IDE 可以使用微软官方的 Visual Studio.

Visual Studio 2022 社区版 - 下载最新的免费版本

或者是 Visual Studio Code .

Visual Studio Code - Code Editing. Redefined

当然也可以使用 JetBrains 的 Rider

Rider:JetBrains 出品的跨平台 .NET IDE

因为我学生资格还在,所以用的是 Rider .

程序结构

一个 C# 程序主要包括以下部分:

  • 命名空间声明(Namespace declaration)
  • 一个 class
  • Class 方法
  • Class 属性
  • 一个 Main 方法
  • 语句(Statements)& 表达式(Expressions)
  • 注释

C# 文件的后缀为  .cs

一个 HelloWorld 实例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
using System;  
  
namespace HelloWorldApplication {  
    class App {  
        static void Main(string[] args)  
        {  
            Console.WriteLine("Hello,World!");  
            Console.ReadKey();  
        }  
    }  
}
  • 程序的第一行  using System; - using  关键字用于在程序中包含  System  命名空间。 一个程序一般有多个  using  语句。
  • 下一行是  namespace  声明。一个  namespace  里包含了一系列的类。HelloWorldApplication  命名空间包含了类  HelloWorld
  • 下一行是  class  声明。类  HelloWorld  包含了程序使用的数据和方法声明。类一般包含多个方法。方法定义了类的行为。在这里,HelloWorld  类只有一个  Main  方法。
  • 下一行定义了  Main  方法,是所有 C# 程序的  入口点Main  方法说明当执行时 类将做什么动作。
  • 下一行 // 将会被编译器忽略,且它会在程序中添加额外的  注释
  • Main 方法通过语句  Console.WriteLine(“Hello World”);  指定了它的行为。
  • 最后一行  Console.ReadKey();  是针对 VS.NET 用户的。这使得程序会等待一个按键的动作,防止程序从 Visual Studio .NET 启动时屏幕会快速运行并关闭。

WriteLine是一个定义在  _System  命名空间中的  Console  类的一个方法。该语句会在屏幕上显示消息 “Hello World”。

以下几点值得注意:

  • C# 是大小写敏感。
  • 所有的语句和表达式必须以分号(;)结尾。
  • 程序的执行从 Main 方法开始。
  • 与 Java 不同的是,文件名可以不同于类的名称。

编译运行

控制台移动到项目目录.输入 csc Program.cs 进行编译.

输出如下内容说明编译成功也说明你的 CSC 环境是没问题的:

1
2
3
4
5
Microsoft (R) Visual C# Compiler version 4.8.4084.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to C# 5, which is no longer the latest version. For compilers that support newer versions of the C# programming language, see http://go.microsoft.com/fwlink/?LinkID=533240

如果碰到无法识别 CSC 命令,需要手动天际环境变量:

在 Path 字段下 添加 C:\Windows\Microsoft.NET\Framework\v2.0.50727\

编译完成后会在项目目录下发现生成一个 Program.exe 的可执行文件,

双击打开会输出 Hello,world!

基本语法

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;

namespace Application {
    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 实例 (单行注释)
            Rectangle r = new Rectangle();
            // 调用实例中的方法
            r.Acceptdetails();
            r.Display();
            Console.ReadKey();
        }
    }
}

执行结果:

1
2
3
Length: 4.5
Width: 3.5
Area: 15.75

using 的用法

以 using 关键字开头的一行代码(例如using System;)可以称为一条 using 语句,几乎所有的 C# 程序都是以 using 语句开头的。using 语句主要用来引入程序中的命名空间,而且一个程序中可以包含多个 using 语句。

class 关键字

class 关键字用来声明一个类,后面是类的名字,class 关键字与类名之间使用一个空格分隔。

注释

注释用于对代码进行解释说明,在编译 C# 程序时编译器会忽略注释的内容。C# 中有单行注释和多行注释两种:

多行注释

多行注释以/*开头,并以*/结尾,/**/之间的所有内容都属于注释内容,如下所示:

1
2
/* C# 多行注释
C# 多行注释*/

单行注释

单行注释由//符号开头,需要注意的是单行注释没有结束符,而且只对其所在的行有效,//符号之后的所有内容都属于注释内容,如下所示:

1
// 单行注释

成员变量

成员变量是用来存储类中要使用的数据或属性的。在上面的示例程序中,Rectangle 类中包含两个成员变量,分别是 length 和 width。

成员函数

成员函数(也可以称为成员方法)是执行特定任务的语句集,一个类的成员函数需要在类中声明。上面的示例代码中,Rectangle 类包含三个成员函数,分别是 AcceptDetails、GetArea 和 Display。

类的实例化

通过一个已有的类(class)创建出这个类的对象(object)的过程叫做类的实例化。类的实例化需要使用 new 关键字,例如上面示例中第 26 行就创建了一个 Rectangle 类的对象。

标识符

标识符是用来为类、变量、函数或任何其他自定义内容命名。C# 中标识符的定义规则如下所示:

  • 标识符必须以英文字母A-Z、a-z开头,后面可以跟英文字母A-Z、a-z、数字0-9或下划线_
  • 标识符中的第一个字符不能是数字;
  • 标识符中不能包含空格或特殊符号,例如? - + ! @ # % ^ & * ( ) [ ] { } . ; : " ' / \,但是可以使用下划线_
  • 标识符不能是 C# 关键字。

数据类型

在 C# 中,变量分为以下几种类型:

  • 值类型(Value types)
  • 引用类型(Reference types)
  • 指针类型(Pointer types)

值类型 (Value types)

值类型变量可以直接分配给一个值。它们是从类  System.ValueType  中派生的。

值类型直接包含数据。比如  int、char、float,它们分别存储数字、字符、浮点数。当声明一个  int  类型时,系统分配内存来存储值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
using System;

namespace Application {
    class App {
        static void Main(string[] args)
        {

            int A = 10;
            bool B, C;
            var D = true;
            B = true;
            C = false;
            Console.WriteLine(A);
            Console.WriteLine(B);
            Console.WriteLine(C);
            Console.WriteLine(D);
            }
    }
}
1
2
3
4
10
True
False
True

也可以使用 var 关键字来隐式声明变量,但是在 C# 中var 声明要注意以下几点:

  1. 必须在定义时初始化。也就是必须是 var s = “abcd”形式,而不能是如下形式: var s; s = “abcd”;

  2. 一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。

  3. var 要求是局部变量。

  4. 使用 var 定义变量和 object 不同,它在效率上和使用强类型方式定义变量完全一样。

引用类型(Reference types)

引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。

换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的  引用类型有:objectdynamic  和  string

对象(Object)类型

对象(Object)类型  是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。

当一个值类型转换为对象类型时,则被称为  装箱;另一方面,当一个对象类型转换为值类型时,则被称为  拆箱

1
2
3
4
5
6
7
8
9
using System;

namespace Application {
class App {
        static void Main(string[] args)  {
            Object obj = 1000;
        }
    }
}
动态(Dynamic)类型

您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。

声明动态类型的语法:

``

1
dynamic <variable_name> = value;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
using System;

namespace Application {
class App {
        static void Main(string[] args)
        {
            dynamic d = 1000;
            Console.WriteLine(d);
        }
    }
}

动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。

字符串(String)类型

字符串(String)类型  允许您给变量分配任何字符串值。

字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
using System;

namespace Application {
class App {
        static void Main(string[] args)
        {
            string s = "String!";

            string str =  @"String";

            Console.WriteLine(s);
            Console.WriteLine(str);
            }
    }
}

而@ 字符串和引号字符串不同的是: @ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。 比如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
using System;

namespace Application {
class App {
        static void Main(string[] args)
        {
            string s = "String!";

            string str =  @"QWERTYQWERTY
QWERTY
QWERTY
QWERTY
QWERTY
";

            Console.WriteLine(s);
            Console.WriteLine(str);
            }
    }
}

输出结果:

1
2
3
4
5
6
String!
QWERTYQWERTY
QWERTY
QWERTY
QWERTY
QWERTY

指针类型(Pointer types)

针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。

语法:

1
type* identifier;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
using System;

namespace Application {
    class App {
        static void Main(String[] args) {
            unsafe {
	            // 声明一个int变量 a
                int a = 100;
                // 获取变量a指向的地址值
                int* ptr = &a;
                // 控制台输出
                Console.WriteLine((int)ptr);
            }
        }
    }
}

直接执行编译会报如下错误:

1
2
Program.cs(6, 13): [CS0227] 不安全代码只会在使用 /unsafe 编译的情况下出现
(Unsafe code may only appear if compiling with /unsafe)

出现原因:

在写任意一个 C#程序的时候,一般都是在创建托管代码。托管代码是在 Common Language Runtime (CLR)控制下执行,CLR 使得程序员不需要管理内存和关心内存的分配和回收,有自动回收内存的机制。CLR 也允许你写非安全代码 (unsafe code)。

非安全代码就是不在 CLR 完全控制下执行的代码,它有可能会导致一些问题,因此他们必须用 “unsafe” 进行表明,所以一般如果在 C#中到用 unsafe code 非安全代码的话,VS.NET 中编译就会出现“Unsafe code may only appear if compiling with /unsafe”的提示

如果是 Rider 的话,双击报错,会发现使用过指针的代码旁边会显示一个红色的灯泡.

鼠标点击那个灯泡然后点击 Allow unsafe code in this project 就可以允许不安全代码了

https://xenolies-hugo-blogs.oss-cn-hongkong.aliyuncs.com/Pics/pointer.png

变量

一个变量只不过是一个供程序操作的存储区的名字。

在 C# 中,每个变量都有一个特定的类型,类型决定了变量的内存大小和布局。范围内的值可以存储在内存中,可以对变量进行一系列操作。

类型 示例
整数类型 sbyte、byte、short、ushort、int、uint、long、ulong 和 char
浮点型 float 和 double
十进制类型 decimal
布尔类型 true 或 false 值,指定的值
空类型 可为空值的数据类型

定义

C# 中变量定义:

1
<data_type> <variable_list>;

data_type: 数据类型 variable_list: 变量数量

1
2
3
4
int i, j, k;
char c, ch;
float f, salary;
double d;

当然也可以在定义的时候进行初始化.

1
int A = 100;

变量初始化

变量通过在等号后跟一个常量表达式进行初始化(赋值)。初始化的一般形式为:

1
variable_name = value;
1
2
3
int x = 1;  
bool y = false;  
double z = 0.1;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
using System;  
  
namespace Application  
{  
    class App  
    {  
        static void Main(String[] args)  
        {  
            int x = 1;  
            bool y = false;  
            double z = 0.1;  
            Console.WriteLine(x);  
            Console.WriteLine(y);  
            Console.WriteLine(z);  
  
        }  
    }  
}

输出:

1
2
3
1
False
0.1

接受来自用户的值

System 命名空间中的 Console 类提供了一个函数 ReadLine(),用于接收来自用户的输入,并把它存储到一个变量中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
using System;  
  
namespace Application  
{  
    class App  
    {  
        static void Main(String[] args)  
        {  
            int Age;  
            Console.WriteLine("欢迎使用年龄计算器! :-)");  
            Console.Write("请输入年龄: ");  
            Age = Convert.ToInt32(Console.ReadLine());  
            Console.WriteLine("计算得出:");  
            Console.WriteLine("您的年龄是: {0} 岁!",Age);  
            Console.WriteLine("(按下回车结束)");  
            Console.ReadKey();  
        }  
    }  
}

函数 Convert.ToInt32() 把用户输入的数据转换为 int 数据类型,因为 Console.ReadLine() 只接受字符串格式的数据。

0%