简介#
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
输出如下环境信息则表示搭建成功.
.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,并点击编辑
添加如下路径:
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的控制台程序,如果创建成功,控制台会输出如下信息
$ dotnet new console -o testObj
已成功创建模板“控制台应用”。
正在处理创建后操作...
正在还原 C:\Users\35367\Desktop\testObj\testObj.csproj:
正在确定要还原的项目…
已还原 C:\Users\35367\Desktop\testObj\testObj.csproj (用时 114 ms)。
已成功还原。然后找到项目路径下的 Program.cs 文件,使用 IDE 或者编辑器将文件内容改为下面的:
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 实例如下:
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 环境是没问题的:
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!
基本语法#
示例
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();
}
}
}执行结果:
Length: 4.5
Width: 3.5
Area: 15.75using 的用法#
以 using 关键字开头的一行代码(例如using System;)可以称为一条 using 语句,几乎所有的 C# 程序都是以 using 语句开头的。using 语句主要用来引入程序中的命名空间,而且一个程序中可以包含多个 using 语句。
class 关键字#
class 关键字用来声明一个类,后面是类的名字,class 关键字与类名之间使用一个空格分隔。
注释#
注释用于对代码进行解释说明,在编译 C# 程序时编译器会忽略注释的内容。C# 中有单行注释和多行注释两种:
多行注释#
多行注释以/*开头,并以*/结尾,/*和*/之间的所有内容都属于注释内容,如下所示:
/* C# 多行注释
C# 多行注释*/单行注释#
单行注释由//符号开头,需要注意的是单行注释没有结束符,而且只对其所在的行有效,//符号之后的所有内容都属于注释内容,如下所示:
// 单行注释成员变量#
成员变量是用来存储类中要使用的数据或属性的。在上面的示例程序中,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 类型时,系统分配内存来存储值。
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);
}
}
}10
True
False
True也可以使用 var 关键字来隐式声明变量,但是在 C# 中var 声明要注意以下几点:
必须在定义时初始化。也就是必须是 var s = “abcd”形式,而不能是如下形式: var s; s = “abcd”;
一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
var 要求是局部变量。
使用 var 定义变量和 object 不同,它在效率上和使用强类型方式定义变量完全一样。
引用类型(Reference types)#
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:object、dynamic 和 string。
对象(Object)类型#
对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。
当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。
using System;
namespace Application {
class App {
static void Main(string[] args) {
Object obj = 1000;
}
}
}动态(Dynamic)类型#
您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
声明动态类型的语法:
``
dynamic <variable_name> = value;using System;
namespace Application {
class App {
static void Main(string[] args)
{
dynamic d = 1000;
Console.WriteLine(d);
}
}
}动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。
字符串(String)类型#
字符串(String)类型 允许您给变量分配任何字符串值。
字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。
using System;
namespace Application {
class App {
static void Main(string[] args)
{
string s = "String!";
string str = @"String";
Console.WriteLine(s);
Console.WriteLine(str);
}
}
}而@ 字符串和引号字符串不同的是: @ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。 比如:
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);
}
}
}输出结果:
String!
QWERTYQWERTY
QWERTY
QWERTY
QWERTY
QWERTY指针类型(Pointer types)#
针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。
语法:
type* identifier;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);
}
}
}
}直接执行编译会报如下错误:
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 就可以允许不安全代码了

变量#
一个变量只不过是一个供程序操作的存储区的名字。
在 C# 中,每个变量都有一个特定的类型,类型决定了变量的内存大小和布局。范围内的值可以存储在内存中,可以对变量进行一系列操作。
| 类型 | 示例 |
|---|---|
| 整数类型 | sbyte、byte、short、ushort、int、uint、long、ulong 和 char |
| 浮点型 | float 和 double |
| 十进制类型 | decimal |
| 布尔类型 | true 或 false 值,指定的值 |
| 空类型 | 可为空值的数据类型 |
定义#
C# 中变量定义:
<data_type> <variable_list>;data_type: 数据类型
variable_list: 变量数量
int i, j, k;
char c, ch;
float f, salary;
double d;当然也可以在定义的时候进行初始化.
int A = 100;变量初始化#
变量通过在等号后跟一个常量表达式进行初始化(赋值)。初始化的一般形式为:
variable_name = value;int x = 1;
bool y = false;
double z = 0.1;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
False
0.1接受来自用户的值#
System 命名空间中的 Console 类提供了一个函数 ReadLine(),用于接收来自用户的输入,并把它存储到一个变量中。
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() 只接受字符串格式的数据。
