C#(C-Sharp)是一种现代、面向对象的编程语言,由微软开发,最初是为.NET框架设计的。它是一种类型安全、简洁且功能强大的语言,广泛用于开发桌面应用程序、Web应用程序、移动应用程序、游戏开发等。
1. 基本特性
- 面向对象:C#是面向对象的编程语言,支持类、对象、继承、多态、封装等基本的面向对象概念。
- 类型安全:C#是一种类型安全的语言,这意味着它会在编译时检查数据类型的正确性,避免常见的类型错误。
- 垃圾回收:C#有自动垃圾回收机制(GC),这意味着开发者不需要手动管理内存分配和回收,减少了内存泄漏的风险。
- 跨平台:通过.NET Core(现在是.NET 5及之后版本),C#支持在多个平台(Windows、Linux、macOS)上开发和运行应用。
2. 语言结构
- 变量和数据类型:C#有一套丰富的内建数据类型,包括基本类型(如整数、浮点数、字符)、结构、枚举、数组等。
- 控制结构:标准的控制结构如
if
、else
、switch
、for
、foreach
、while
等。 - 方法和函数:方法是C#中的核心,用来执行具体操作,可以有参数、返回值。
- 委托和事件:C#支持委托(类似于函数指针),并用于事件驱动编程。
3. 面向对象编程(OOP)
- 类和对象:C#的核心是类和对象。类是对象的蓝图,定义了对象的属性和行为。
- 继承:允许子类继承父类的属性和方法。
- 多态:通过继承或接口实现方法重写,允许不同对象对相同方法进行不同的实现。
- 封装:通过访问修饰符(如
private
、public
)控制对类成员的访问。
4. 异常处理
C#通过try
、catch
、finally
块处理异常,提供了一种结构化的方式来捕获和处理运行时错误,确保程序不会因为错误而崩溃。
5. LINQ(语言集成查询)
C#的LINQ功能允许开发者以声明性的方式查询各种数据源(如数组、集合、数据库等),它使得数据操作更加简洁且易于理解。
6. C#与.NET
C#与.NET框架紧密结合,.NET提供了一整套丰富的类库和开发工具,使得C#成为开发Web应用、桌面应用、API、微服务、云服务等非常理想的选择。
- ASP.NET:C#用来开发Web应用程序和Web API。
- Xamarin:用C#开发跨平台移动应用。
- Unity:C#在游戏开发中也非常流行,Unity引擎广泛使用C#进行游戏开发。
7. 异步编程
C#支持异步编程,通过async
和await
关键字,可以方便地进行异步操作,提升应用的响应能力和性能,尤其是在处理I/O密集型操作时(如文件读取、网络请求等)。
8. 跨平台与云开发
通过.NET Core(现为.NET 5及以后版本),C#实现了跨平台开发,允许在Windows、Linux、macOS等不同操作系统上运行程序。此外,C#也广泛应用于云开发,特别是在Azure云平台中。
9. 社区和生态
C#的社区活跃,微软和其他开发者社区不断推出新的库、工具和框架,支持开发者快速解决各种开发问题。GitHub、Stack Overflow等平台都有大量的资源供学习和参考。
C#的应用场景:
- Web开发:利用ASP.NET开发网站和Web API。
- 桌面应用:开发Windows桌面应用(使用WinForms或WPF)。
- 移动应用:通过Xamarin开发跨平台的iOS和Android应用。
- 游戏开发:使用Unity引擎开发游戏。
- 企业应用:在企业级系统中,C#是构建高效、可靠应用的理想选择。
代码讲解
第一个简单的例子:打印“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#的基本概念,比如变量、数据类型、运算符等。
1. 变量与数据类型
在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
。
2. 操作符
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));
}
}
解释:
+
加法-
减法*
乘法/
除法%
取余(求余数)
3. 条件语句(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
语句。
4. 循环语句(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。- 循环会执行 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);
}
}
}
5. 数组
数组用来存储多个相同类型的数据。在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
返回数组的长度,用来控制遍历的次数。
接下来我们继续学习一些更加进阶的概念,包括方法、类与对象、以及面向对象编程的基本原则。
6. 方法(Functions)
方法是可以复用的代码块,它们执行某些操作并返回结果。在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
中。
7. 类与对象
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()
方法来模拟启动和停止汽车。
8. 构造函数
构造函数是一个特殊的方法,用于初始化对象。当你创建一个新对象时,构造函数会自动调用。
例子:构造函数
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
的值。
9. 继承
继承是面向对象编程的一个重要特性,它允许一个类继承另一个类的属性和方法。子类可以在继承父类的功能的基础上,进行扩展和修改。
例子:继承
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
类特有的功能)。
10. 多态
多态是指一个对象可以通过父类的引用调用子类的方法。通过多态,程序可以动态决定调用哪个方法,增强了程序的灵活性。
例子:多态
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# 概念,如接口、异常处理、集合类型、LINQ 等。
11. 接口(Interface)
接口是 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
对象,实现了面向接口编程。
12. 异常处理(Exception Handling)
异常处理用来处理程序运行时可能出现的错误。在 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
块的代码无论是否发生异常都会执行,常用来释放资源。
13. 集合类型
C# 提供了多种集合类型,常见的有 List<T>
、Dictionary<TKey, TValue>
、Queue<T>
、Stack<T>
等,它们用于存储和管理多个元素。
例子:使用 List
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> fruits = new List<string>();
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<T>
是一个泛型集合,可以存储任意类型的数据,并且具有动态大小。- 使用
Add()
方法可以向List
中添加元素,使用Remove()
方法删除元素,使用Contains()
方法检查是否包含某个元素。
例子:使用 Dictionary
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Dictionary<int, string> people = new Dictionary<int, string>();
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<TKey, TValue>
是一个键值对集合,可以根据键(Key
)快速访问值(Value
)。- 使用
Add()
方法向字典中添加元素,使用[]
运算符根据键来查找元素。
14. LINQ(Language Integrated Query)
LINQ 是一种用于查询集合的强大工具,可以通过声明式的方式对数据进行操作。LINQ 可以用于数组、集合、数据库等数据源。
例子:使用 LINQ 查询集合
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 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
语法,我们可以很方便地从集合中筛选出偶数。 - LINQ 的查询是懒加载的,只有在实际遍历结果时才会执行查询。
15. 属性(Property)
属性是 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
获取值。
16. 字符串操作
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()
方法检查字符串中是否包含指定的子字符串。