当前位置: 首页 > news >正文

360度看C#编程语言

360度看C#编程语言

A Panorama to C# Programming Language

关于C#编程语言的介绍,CSDN不止一篇,读者对它可能怀有好奇,但又有所敬畏,毕竟,这是软件业巨头Microsoft(微软)的开发工具。本文以不同视角来对C#进行观察,尽量使读者能够从360度全方位了解C#语言及其用途;这样,能为开发者和软件爱好者指明方向、对其引发兴趣,从而加入到开发和交流大军中来。

一、.NET生态系统概述

1.1 .NET家族发展历程

.NET是微软公司为开发应用程序创建的具有革命意义的平台,它提供的功能,不仅仅适用于Windows操作系统;而且,.NET完全开源并支持跨平台运行。这意味着,在.NET编写的应用程序,随时可在Linux,macOS系统运行。

打开Chrome浏览器,访问.NET官网,即可见到“庐山真面目”。

在这里插入图片描述
映入眼帘的,是.NET 10.0,这是2025年最新版.NET。

1.1.1 .NET Framwork

.NET Framwork是一种技术,它支持生成和运行Windows应用程序、Web服务等。
.NET Framework包括公共语言运行库(Common Language Running)和.NET Framework类库。公共语言运行库是.NET Framework的基础,可将运行时看作一个执行时用来管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并强制实施严格的类型安全,用以提高代码安全性和可靠性。代码管理则是运行时的基本原则。

- .NET Framework (2002-)
• Windows平台的专有框架
• 闭源、仅支持Windows
• 成熟的桌面应用开发(WinForms、WPF)

1.1.2 .NET Core

.NET Core是新的.NET开源框架,可在github上找到。运行库是CoreCLR库,包含集合类的框架、文件系统访问、控制台和XML等,都在Core FX库中。
.NET Core按照模块化设计。该框架分成很多NuGet包,这样一来就不用处理全部包,而实使用元包引用一起工作的小包。Net Core更新更快,即使更新运行库,也不会影响现有的应用程序。
.NET Core (2016-)
• 跨平台、开源、高性能
• 模块化设计,支持微服务
• 云原生应用首选
.NET 5+ (2020-)
• .NET Framework和.NET Core的统一
• 单一平台,支持所有应用类型
• 持续迭代的现代开发平台
官网.NET的场景,可以说明它适用于Web, 移动,桌面,云原生以及人工智能等各种应用程序开发。

在这里插入图片描述

1.2 开发工具集

基于Windows系统的开发工具,以微软的Visual Studio为主,同时兼有Visual Studio Code, .NET CLI等;第三方开发工具有JetBrains Rider等。

Visual Studio - 功能完整的IDE
• Community版免费
• 强大的调试和诊断工具
• 丰富的扩展生态

Visual Studio Code - 轻量级跨平台编辑器
• 免费开源
• 丰富的C#扩展
• 适合各种规模的项目

.NET CLI - 命令行工具
可在bash/PowerShell下执行命令,创建及运行C#应用程序。

$ dotnet new console -n MyApp
$ dotnet run

二、C#语言简介

C#编程语言就是用来实现在.NET平台上的强大功能,不但能够开发出功能强劲的应用程序,并且执行效率高。

2.1 C#设计哲学

• 面向对象的现代语言
• 类型安全
• 简洁优雅的语法
• 强大的功能集

三、C# vs C/C++深度对比

3.1 代码简洁性对比

以C++程序为例:

#include <iostream>
#include <vector>
#include <string>class Person {
private:std::string name;int age;
public:Person(const std::string& n, int a) : name(n), age(a) {}std::string getName() const { return name; }void setName(const std::string& n) { name = n; }int getAge() const { return age; }void setAge(int a) { age = a; }
};int main() {std::vector<Person> people;people.push_back(Person("Alice", 25));for (const auto& person : people) {std::cout << person.getName() << ": " << person.getAge() << std::endl;}return 0;
}

以C#程序为例:

using System;
using System.Collections.Generic;// 自动属性简化了字段和访问器的定义
public class Person
{public string Name { get; set; }public int Age { get; set; }public Person(string name, int age){Name = name;Age = age;}
}class Program
{static void Main(){var people = new List<Person>{new Person("Alice", 25)};// LINQ使集合操作更简洁foreach (var person in people){Console.WriteLine($"{person.Name}: {person.Age}");}}
}

二者的区别显而易见。

3.2 内存管理

C++手动内存管理:

// 需要手动管理内存
MyClass* obj = new MyClass();
// ... 使用对象
delete obj; // 必须手动释放// 内存泄漏风险
void riskyFunction() {int* array = new int[1000];// 如果这里抛出异常,内存泄漏!delete[] array; // 必须确保执行到这里
}

C#自动内存管理:

// 自动内存管理,无需手动释放
var obj = new MyClass();
// 使用对象...
// 当obj不再被引用时,垃圾回收器会自动回收内存// 使用using语句确保资源释放
using (var resource = new FileStream("file.txt", FileMode.Open))
{// 使用资源// 即使抛出异常,资源也会被正确释放
}

3.3 流控制和循环

C#更现代的循环语法:

// 传统for循环
for (int i = 0; i < 10; i++)
{Console.WriteLine(i);
}// 更安全的foreach循环
var numbers = new List<int> { 1, 2, 3, 4, 5 };
foreach (var number in numbers)
{Console.WriteLine(number);
}// 使用LINQ进行函数式编程风格的遍历
numbers.Where(n => n % 2 == 0).ToList().ForEach(n => Console.WriteLine(n));

3.4 异常处理

C++异常处理:

try {int* arr = new int[1000000000]; // 可能抛出std::bad_alloc// 使用数组delete[] arr;
} catch (const std::exception& e) {std::cerr << "Exception: " << e.what() << std::endl;
}

C#异常处理:

try
{// 可能抛出异常的代码using var file = File.OpenRead("nonexistent.txt");
}
catch (FileNotFoundException ex)
{Console.WriteLine($"文件未找到: {ex.FileName}");
}
catch (UnauthorizedAccessException ex)
{Console.WriteLine($"无访问权限: {ex.Message}");
}
catch (Exception ex)
{Console.WriteLine($"其他错误: {ex.Message}");
}
finally
{// 清理代码,总是执行Console.WriteLine("清理完成");
}

四、C# vs Java深度对比

4.1 语法简洁性

Java示例:

import java.util.ArrayList;
import java.util.List;public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return name + ": " + age;}
}public class Main {public static void main(String[] args) {List<Person> people = new ArrayList<>();people.add(new Person("Alice", 25));for (Person person : people) {System.out.println(person);}}
}

C#更简洁的实现:

using System;
using System.Collections.Generic;// 记录类型(Record) - C# 9.0+
public record Person(string Name, int Age);// 或者使用类
public class Person
{public string Name { get; init; }  // Init-only属性public int Age { get; init; }// 简化的ToStringpublic override string ToString() => $"{Name}: {Age}";
}class Program
{static void Main(){// 对象初始化器var people = new List<Person>{new Person { Name = "Alice", Age = 25 },new() { Name = "Bob", Age = 30 }  // 目标类型new表达式};// 字符串插值foreach (var person in people){Console.WriteLine($"{person.Name} is {person.Age} years old");}}
}

4.2 属性和字段

C#属性特性:

public class Product
{// 自动属性public string Name { get; set; }// 只读属性public DateTime Created { get; } = DateTime.Now;// 计算属性public string DisplayName => $"{Name} - {Created:yyyy-MM-dd}";// 带验证的属性private decimal _price;public decimal Price{get => _price;set{if (value < 0)throw new ArgumentException("价格不能为负数");_price = value;}}
}

4.3 委托和事件

C#特有的事件处理机制:

public class Button
{// 事件声明public event EventHandler? Clicked;public void Click(){Clicked?.Invoke(this, EventArgs.Empty);}
}public class Program
{static void Main(){var button = new Button();// Lambda表达式订阅事件button.Clicked += (sender, e) => {Console.WriteLine("按钮被点击了!");};// 方法组订阅button.Clicked += OnButtonClicked;button.Click();}static void OnButtonClicked(object? sender, EventArgs e){Console.WriteLine("另一个处理程序");}
}

4.4 LINQ - 语言集成查询

C#强大的数据查询能力:

using System;
using System.Collections.Generic;
using System.Linq;public class Product
{public string Name { get; set; } = string.Empty;public decimal Price { get; set; }public string Category { get; set; } = string.Empty;
}class Program
{static void Main(){var products = new List<Product>{new() { Name = "Laptop", Price = 999.99m, Category = "Electronics" },new() { Name = "Book", Price = 19.99m, Category = "Education" },new() { Name = "Phone", Price = 499.99m, Category = "Electronics" }};// LINQ查询语法var expensiveElectronics = from p in productswhere p.Price > 100 && p.Category == "Electronics"orderby p.Price descendingselect p;// LINQ方法语法var cheapProducts = products.Where(p => p.Price < 50).OrderBy(p => p.Price).Select(p => new { p.Name, p.Price });// 立即执行查询var totalValue = products.Sum(p => p.Price);var mostExpensive = products.Max(p => p.Price);Console.WriteLine($"总价值: {totalValue:C}");Console.WriteLine($"最贵商品价格: {mostExpensive:C}");}
}

4.5 异步编程

C# async/await模式:

using System;
using System.Net.Http;
using System.Threading.Tasks;public class ApiService
{private readonly HttpClient _httpClient = new();// 异步方法public async Task<string> GetDataAsync(string url){try{// 异步HTTP请求var response = await _httpClient.GetAsync(url);response.EnsureSuccessStatusCode();return await response.Content.ReadAsStringAsync();}catch (HttpRequestException ex){Console.WriteLine($"网络请求失败: {ex.Message}");return string.Empty;}}
}class Program
{static async Task Main()  // 异步Main方法{var service = new ApiService();// 并行执行多个异步操作var task1 = service.GetDataAsync("https://api.example.com/data1");var task2 = service.GetDataAsync("https://api.example.com/data2");// 等待所有任务完成var results = await Task.WhenAll(task1, task2);Console.WriteLine($"获取到 {results.Length} 个结果");// 使用异步foreach处理流数据await foreach (var item in FetchDataStreamAsync()){Console.WriteLine($"处理: {item}");}}static async IAsyncEnumerable<string> FetchDataStreamAsync(){for (int i = 0; i < 5; i++){await Task.Delay(1000); // 模拟异步操作yield return $"数据项 {i + 1}";}}
}

五、C#面向对象特性

5.1 继承和多态

C#面向对象示例:

using System;
using System.Collections.Generic;// 基类
public abstract class Shape
{public string Name { get; set; } = string.Empty;// 抽象方法public abstract double CalculateArea();// 虚方法public virtual void Display(){Console.WriteLine($"形状: {Name}");}
}// 派生类
public class Circle : Shape
{public double Radius { get; set; }public Circle(double radius){Name = "圆形";Radius = radius;}public override double CalculateArea(){return Math.PI * Radius * Radius;}public override void Display(){base.Display();Console.WriteLine($"半径: {Radius}, 面积: {CalculateArea():F2}");}
}public class Rectangle : Shape
{public double Width { get; set; }public double Height { get; set; }public Rectangle(double width, double height){Name = "矩形";Width = width;Height = height;}public override double CalculateArea(){return Width * Height;}
}class Program
{static void Main(){// 多态演示var shapes = new List<Shape>{new Circle(5.0),new Rectangle(4.0, 6.0)};foreach (var shape in shapes){shape.Display();  // 运行时多态Console.WriteLine($"面积: {shape.CalculateArea():F2}");Console.WriteLine();}}
}

5.2 接口和实现

C# 接口实现:

using System;
using System.Collections.Generic;// 接口定义
public interface IRepository<T>
{void Add(T item);void Remove(T item);T GetById(int id);IEnumerable<T> GetAll();
}public interface ILoggable
{void Log(string message);
}// 具体实现
public class ProductRepository : IRepository<Product>, ILoggable
{private readonly List<Product> _products = new();public void Add(Product item){_products.Add(item);Log($"添加产品: {item.Name}");}public void Remove(Product item){_products.Remove(item);Log($"移除产品: {item.Name}");}public Product GetById(int id){return _products.Find(p => p.GetHashCode() == id) ?? throw new KeyNotFoundException("产品未找到");}public IEnumerable<Product> GetAll(){return _products.AsReadOnly();}public void Log(string message){Console.WriteLine($"[LOG] {DateTime.Now:yyyy-MM-dd HH:mm:ss}: {message}");}
}

六、C#并发编程

6.1 多线程和任务并行

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;public class ParallelProcessor
{// 使用Parallel类进行数据并行处理public void ProcessDataParallel(List<int> data){var results = new List<double>();var lockObject = new object();Parallel.ForEach(data, number =>{// 模拟CPU密集型计算double result = Math.Sqrt(number) * Math.Pow(number, 2);lock (lockObject)  // 线程安全地添加结果{results.Add(result);}});Console.WriteLine($"并行处理了 {results.Count} 个数据项");}// 使用Task进行任务并行public async Task<string[]> DownloadMultipleFilesAsync(string[] urls){var downloadTasks = new List<Task<string>>();foreach (var url in urls){downloadTasks.Add(DownloadFileAsync(url));}// 等待所有下载任务完成string[] contents = await Task.WhenAll(downloadTasks);return contents;}private async Task<string> DownloadFileAsync(string url){using var httpClient = new HttpClient();return await httpClient.GetStringAsync(url);}// 使用CancellationToken支持取消操作public async Task ProcessWithCancellationAsync(CancellationToken cancellationToken = default){for (int i = 0; i < 100; i++){// 检查取消请求cancellationToken.ThrowIfCancellationRequested();await Task.Delay(100, cancellationToken);Console.WriteLine($"处理进度: {i + 1}%");}}
}class Program
{static async Task Main(){var processor = new ParallelProcessor();var data = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };// 并行处理processor.ProcessDataParallel(data);// 使用CancellationTokenSource管理取消using var cts = new CancellationTokenSource();// 5秒后取消cts.CancelAfter(TimeSpan.FromSeconds(5));try{await processor.ProcessWithCancellationAsync(cts.Token);}catch (OperationCanceledException){Console.WriteLine("操作被取消");}}
}

七、总结:C#的核心优势

7.1 对比总结

在这里插入图片描述

7.2 C#适用场景

推荐使用C#的场景:
• Windows桌面应用(WinForms、WPF)
• Unity游戏开发
• ASP.NET Core Web应用
• 微服务和云原生应用
• 企业级应用开发
• 跨平台移动应用(MAUI)

C#的核心竞争力:

  1. 现代化语法特性 - 持续演进的语言设计
  2. 强大的工具支持 - Visual Studio生态
  3. 出色的生产力 - LINQ、async/await等特性
  4. 良好的性能 - 接近原生代码的执行效率
  5. 丰富的生态系统 - NuGet包管理器
  6. 微软强力支持 - 长期的技术投入和更新

.NET开发技术文章陆续推出。


敬请关注、收藏和点赞!👍
您的认可,我的动力!😃

推荐阅读:

  1. 用Visual Studio Code最新版开发C#应用程序
  2. 用JetBrains Rider开发C#应用程序指南
  3. 在macOS上搭建C#集成开发环境指南
  4. 2025最新版Python 3.14.0安装使用指南
  5. 2025最新版Eclipse for Java安装使用指南
http://www.dtcms.com/a/601978.html

相关文章:

  • 卷积神经网络训练与参数调节全攻略:从数据到模型的实战优化
  • LangGraph 的**核心概念、基本使用步骤和实战示例**
  • 谢岗网站仿做wordpress 图片迁移
  • 网站关键词的分类wordpress 插件 销量
  • 构建面向信创生态的数据中台(八):数据资产运营体系 —— 从治理到价值的信创跃迁
  • 通风管道部件-图形识别超方便
  • 基于rsync,局域网内,无需密码互传
  • OpenCV(二十四):图像滤波
  • 微信服务号菜单链接网站怎么做网站 通管局 报备
  • 网站模板 手机商丘市网站建设推广
  • 河北石家庄建设信息网深圳网站建设乐云seo
  • cod建站平台学生服务器租用
  • C语言编译器IDE使用方法|详细介绍如何配置与使用C语言编译器IDE
  • “后端服务+前端页面服务 + 后端数据库服务“如何部署到K8s集群
  • 网站开发会用到定时器功能长沙公司网络推广
  • LangGraph 中 State 状态模式详解
  • 8-Arm PEG-Acrylate,八臂聚乙二醇丙烯酸酯的溶解性
  • 企业网站设计建设服务器怎么能在网上卖货
  • K8s新手入门:从“Pod创建“到“服务暴露“,3个案例理解容器编排
  • 关于《大学物理》网站资源建设的思路vs2013做网站教程
  • WPF 、WebView2 、WebView2 、CoreWebView2 、HostObject 是什么?它们之间有什么关系?
  • 大连最好的做网站的公司wordpress国产网校
  • C语言编译器 | 如何高效使用和优化C语言编译器
  • C语言指针深度剖析(2):从“数组名陷阱”到“二级指针操控”的进阶指南
  • 中企动力做网站 知乎网站后台系统是用什么做的
  • Linux内核信号传递机制完全解析:从force_sig_info到kick_process的完整路径
  • 佛山新网站建设哪家好建筑方案设计流程步骤
  • 计算机工作原理
  • 北京做网站建设比较好的公司上海网站建设企业名录
  • AEC-Q100 stress实验详解#3——HTSL(高温储存寿命测试)