C#(C-Sharp)是一种现代、面向对象的编程语言,由微软开发,最初是为.NET框架设计的。它是一种类型安全、简洁且功能强大的语言,广泛用于开发桌面应用程序、Web应用程序、移动应用程序、游戏开发等。
if
、else
、switch
、for
、foreach
、while
等。private
、public
)控制对类成员的访问。C#通过try
、catch
、finally
块处理异常,提供了一种结构化的方式来捕获和处理运行时错误,确保程序不会因为错误而崩溃。
C#的LINQ功能允许开发者以声明性的方式查询各种数据源(如数组、集合、数据库等),它使得数据操作更加简洁且易于理解。
C#与.NET框架紧密结合,.NET提供了一整套丰富的类库和开发工具,使得C#成为开发Web应用、桌面应用、API、微服务、云服务等非常理想的选择。
C#支持异步编程,通过async
和await
关键字,可以方便地进行异步操作,提升应用的响应能力和性能,尤其是在处理I/O密集型操作时(如文件读取、网络请求等)。
通过.NET Core(现为.NET 5及以后版本),C#实现了跨平台开发,允许在Windows、Linux、macOS等不同操作系统上运行程序。此外,C#也广泛应用于云开发,特别是在Azure云平台中。
C#的社区活跃,微软和其他开发者社区不断推出新的库、工具和框架,支持开发者快速解决各种开发问题。GitHub、Stack Overflow等平台都有大量的资源供学习和参考。
第一个简单的例子:打印“Hello, World!”
using System;
class Program
{
static void Main()
{
Console.WriteLine("Hello, World!");
}
}
using System;
是导入一个命名空间,它提供了很多常用的功能,比如打印输出、读输入等。class Program
定义了一个类,类是C#程序的基本结构。static void Main()
是程序的入口点,C#的程序从这里开始执行。Console.WriteLine("Hello, World!");
这行代码会在控制台输出一行文本。在C#中,我们需要声明变量,并指定它们的数据类型。常见的数据类型包括整数、浮动小数、字符、布尔值等。
using System;
class Program
{
static void Main()
{
// 整数类型
int age = 25;
// 浮动小数类型
double height = 1.75;
// 字符类型
char initial = 'J';
// 布尔类型
bool isStudent = true;
// 输出变量的值
Console.WriteLine("Age: " + age);
Console.WriteLine("Height: " + height);
Console.WriteLine("Initial: " + initial);
Console.WriteLine("Is Student: " + isStudent);
}
}
int
表示整数类型,可以存储没有小数部分的数字。double
表示浮动小数类型,可以存储带小数点的数字。char
用来表示一个字符,通常是单引号包围的单个字符。bool
用来表示布尔值,值只有 true
或 false
。C#支持许多常见的操作符,如加法、减法、乘法等。
using System;
class Program
{
static void Main()
{
int a = 10;
int b = 5;
// 加法
Console.WriteLine("a + b = " + (a + b));
// 减法
Console.WriteLine("a - b = " + (a - b));
// 乘法
Console.WriteLine("a * b = " + (a * b));
// 除法
Console.WriteLine("a / b = " + (a / b));
// 取余
Console.WriteLine("a % b = " + (a % b));
}
}
+
加法-
减法*
乘法/
除法%
取余(求余数)if
、else
、switch
)条件语句用来根据不同的条件执行不同的代码。
if
和 else
using System;
class Program
{
static void Main()
{
int number = 10;
if (number > 0)
{
Console.WriteLine("The number is positive.");
}
else if (number < 0)
{
Console.WriteLine("The number is negative.");
}
else
{
Console.WriteLine("The number is zero.");
}
}
}
if
用来检查条件是否为真,如果为真就执行相关代码。else if
用来检查另外一个条件,如果第一个条件不成立时会继续检查下一个条件。else
用来执行默认的代码,通常是当其他条件都不满足时。switch
语句using System;
class Program
{
static void Main()
{
int day = 3;
switch (day)
{
case 1:
Console.WriteLine("Monday");
break;
case 2:
Console.WriteLine("Tuesday");
break;
case 3:
Console.WriteLine("Wednesday");
break;
default:
Console.WriteLine("Invalid day");
break;
}
}
}
switch
根据不同的值执行不同的代码,适合用来处理多个条件。case
都是一个条件,如果匹配上了,就会执行对应的代码。break
用来结束 switch
语句。for
、while
、foreach
)循环语句用于重复执行某些操作。
for
循环using System;
class Program
{
static void Main()
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine("i = " + i);
}
}
}
for
循环通常用来在一个范围内重复执行代码。i
是循环变量,初始化为 1,每次循环 i
增加 1,直到 i
大于 5。i = 1
到 i = 5
。while
循环using System;
class Program
{
static void Main()
{
int i = 1;
while (i <= 5)
{
Console.WriteLine("i = " + i);
i++; // 增加 i 的值
}
}
}
while
循环会在条件为真的时候继续执行,直到条件变为假。i
从 1 开始,直到 i
大于 5 时,循环停止。foreach
循环using System;
class Program
{
static void Main()
{
string[] fruits = { "Apple", "Banana", "Cherry" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
}
}
数组用来存储多个相同类型的数据。在C#中,数组的大小是固定的。
using System;
class Program
{
static void Main()
{
int[] numbers = { 1, 2, 3, 4, 5 };
// 访问数组中的元素
Console.WriteLine("The first number is " + numbers[0]);
Console.WriteLine("The last number is " + numbers[4]);
// 遍历数组
for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine("Number at index " + i + ": " + numbers[i]);
}
}
}
[]
来声明,数组中的元素是有序的,可以通过索引来访问。numbers.Length
返回数组的长度,用来控制遍历的次数。方法是可以复用的代码块,它们执行某些操作并返回结果。在C#中,我们通过方法来封装逻辑,增强代码的可读性和可维护性。
using System;
class Program
{
// 声明一个方法,返回一个整数
static int Add(int a, int b)
{
return a + b;
}
static void Main()
{
int result = Add(5, 3); // 调用 Add 方法
Console.WriteLine("The sum is: " + result);
}
}
static int Add(int a, int b)
是一个方法声明,int
表示返回类型,a
和 b
是方法的参数。return a + b;
返回 a
和 b
的和。Main
方法中,我们调用 Add(5, 3)
,并将返回的结果存储在 result
中。C# 是一种面向对象编程语言。类是对象的模板,它定义了对象的属性和行为。
using System;
class Car
{
// 属性(字段)
public string Make;
public string Model;
public int Year;
// 方法(行为)
public void Start()
{
Console.WriteLine("The car is starting.");
}
public void Stop()
{
Console.WriteLine("The car has stopped.");
}
}
class Program
{
static void Main()
{
// 创建一个 Car 类的对象
Car myCar = new Car();
myCar.Make = "Toyota";
myCar.Model = "Corolla";
myCar.Year = 2020;
// 调用对象的方法
myCar.Start();
Console.WriteLine($"My car is a {myCar.Year} {myCar.Make} {myCar.Model}.");
myCar.Stop();
}
}
Car
类有三个属性:Make
(品牌),Model
(型号),Year
(年份),以及两个方法:Start()
和 Stop()
。Main
方法中,我们创建了一个 Car
类的对象 myCar
,并为它的属性赋值。myCar.Start()
和 myCar.Stop()
方法来模拟启动和停止汽车。构造函数是一个特殊的方法,用于初始化对象。当你创建一个新对象时,构造函数会自动调用。
using System;
class Car
{
// 属性
public string Make;
public string Model;
public int Year;
// 构造函数
public Car(string make, string model, int year)
{
Make = make;
Model = model;
Year = year;
}
// 方法
public void Start()
{
Console.WriteLine("The car is starting.");
}
public void Stop()
{
Console.WriteLine("The car has stopped.");
}
}
class Program
{
static void Main()
{
// 创建 Car 类的对象并传递参数给构造函数
Car myCar = new Car("Toyota", "Corolla", 2020);
// 调用对象的方法
myCar.Start();
Console.WriteLine($"My car is a {myCar.Year} {myCar.Make} {myCar.Model}.");
myCar.Stop();
}
}
public Car(string make, string model, int year)
是构造函数,它的作用是在对象创建时为属性赋初值。Car
对象时,通过构造函数传递了 Make
、Model
和 Year
的值。继承是面向对象编程的一个重要特性,它允许一个类继承另一个类的属性和方法。子类可以在继承父类的功能的基础上,进行扩展和修改。
using System;
class Animal
{
public string Name;
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} is barking.");
}
}
class Program
{
static void Main()
{
Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Eat(); // 从 Animal 类继承来的方法
myDog.Bark(); // Dog 类自己的方法
}
}
Dog
类继承了 Animal
类,因此它可以使用 Animal
类中的 Name
属性和 Eat()
方法。Dog
类新增了一个 Bark()
方法。myDog
对象后,它不仅能吃(继承自 Animal
),还能叫(Dog
类特有的功能)。多态是指一个对象可以通过父类的引用调用子类的方法。通过多态,程序可以动态决定调用哪个方法,增强了程序的灵活性。
using System;
class Animal
{
public virtual void Speak()
{
Console.WriteLine("The animal makes a sound.");
}
}
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("The dog barks.");
}
}
class Cat : Animal
{
public override void Speak()
{
Console.WriteLine("The cat meows.");
}
}
class Program
{
static void Main()
{
Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();
myAnimal.Speak(); // 输出:The animal makes a sound.
myDog.Speak(); // 输出:The dog barks.
myCat.Speak(); // 输出:The cat meows.
}
}
Speak()
方法在 Animal
类中是一个虚方法(virtual
),意味着它可以被子类重写。Dog
和 Cat
类分别重写了 Speak()
方法,实现了自己的版本。Main
方法中,我们用 Animal
类型的引用指向 Dog
和 Cat
类的对象,展示了多态的特性:即便是 Animal
类型的引用,程序会根据实际对象的类型调用对应的 Speak()
方法。接口是 C# 中的一种抽象类型,它定义了一组方法和属性,但不提供具体的实现。接口是面向对象编程中实现多态和解耦的常用方式。
using System;
interface IDriveable
{
void Start();
void Stop();
}
class Car : IDriveable
{
public void Start()
{
Console.WriteLine("The car is starting.");
}
public void Stop()
{
Console.WriteLine("The car has stopped.");
}
}
class Program
{
static void Main()
{
IDriveable myCar = new Car();
myCar.Start();
myCar.Stop();
}
}
IDriveable
是一个接口,定义了两个方法:Start()
和 Stop()
,但没有实现。Car
类实现了 IDriveable
接口,因此它必须提供 Start()
和 Stop()
方法的具体实现。Main
方法中,我们通过接口 IDriveable
来操作 Car
对象,实现了面向接口编程。异常处理用来处理程序运行时可能出现的错误。在 C# 中,我们使用 try
、catch
、finally
来捕获和处理异常。
using System;
class Program
{
static void Main()
{
try
{
int result = 10 / 0; // 会抛出除零异常
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Error: Cannot divide by zero.");
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("This will always run.");
}
}
}
try
块中放置可能引发异常的代码。catch
块用来捕获特定的异常并处理,例如这里捕获 DivideByZeroException
。finally
块的代码无论是否发生异常都会执行,常用来释放资源。C# 提供了多种集合类型,常见的有 List
、Dictionary
、Queue
、Stack
等,它们用于存储和管理多个元素。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List fruits = new List();
fruits.Add("Apple");
fruits.Add("Banana");
fruits.Add("Cherry");
// 遍历 List
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}
// 移除元素
fruits.Remove("Banana");
// 查找元素
Console.WriteLine("List contains 'Banana': " + fruits.Contains("Banana"));
}
}
List
是一个泛型集合,可以存储任意类型的数据,并且具有动态大小。Add()
方法可以向 List
中添加元素,使用 Remove()
方法删除元素,使用 Contains()
方法检查是否包含某个元素。using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Dictionary people = new Dictionary();
people.Add(1, "Alice");
people.Add(2, "Bob");
people.Add(3, "Charlie");
// 查找元素
Console.WriteLine("Person with ID 2: " + people[2]);
// 遍历 Dictionary
foreach (var person in people)
{
Console.WriteLine($"ID: {person.Key}, Name: {person.Value}");
}
}
}
Dictionary
是一个键值对集合,可以根据键(Key
)快速访问值(Value
)。Add()
方法向字典中添加元素,使用 []
运算符根据键来查找元素。LINQ 是一种用于查询集合的强大工具,可以通过声明式的方式对数据进行操作。LINQ 可以用于数组、集合、数据库等数据源。
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List numbers = new List { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 使用 LINQ 查询偶数
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
Console.WriteLine("Even numbers:");
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}
}
}
from
、where
、select
语法,我们可以很方便地从集合中筛选出偶数。属性是 C# 中的一个概念,它允许你定义类的字段(数据成员),并为它们提供访问器(getter)和修改器(setter)。
using System;
class Person
{
private string name; // 私有字段
// 公共属性
public string Name
{
get { return name; }
set { name = value; }
}
}
class Program
{
static void Main()
{
Person person = new Person();
person.Name = "John"; // 设置属性值
Console.WriteLine("Person's name is: " + person.Name); // 获取属性值
}
}
Name
是一个公共属性,使用 get
和 set
访问器来控制对私有字段 name
的访问。person.Name = "John"
设置值,通过 person.Name
获取值。C# 提供了丰富的字符串操作方法,例如连接、拆分、替换、查找等。
using System;
class Program
{
static void Main()
{
string sentence = "Hello, world!";
// 字符串连接
string greeting = "Good " + "Morning";
Console.WriteLine(greeting); // 输出: Good Morning
// 字符串替换
string newSentence = sentence.Replace("world", "C#");
Console.WriteLine(newSentence); // 输出: Hello, C#!
// 字符串拆分
string[] words = sentence.Split(',');
foreach (var word in words)
{
Console.WriteLine(word); // 输出: Hello 和 world!
}
// 查找子字符串
Console.WriteLine(sentence.Contains("world")); // 输出: True
}
}
Replace()
方法用于替换字符串中的部分内容。Split()
方法根据指定的分隔符将字符串拆分成数组。Contains()
方法检查字符串中是否包含指定的子字符串。