07-C#.Net-数据结构-学习笔记

C# 学习笔记 C# 学习笔记 1 发展概况 1.1 C#版本历史 参考 Version .Net Visual Studio Important Features C# 1.0 .NET Framework 1.0 Visual Studio 2002 Basic features C# 2.0 .NET Framework 2.0 Visual Studio 2005 Generics C# 3.0 .NET Framework 3.0 Visual Studio 2008 Lambda exp 阅读详情

一、数据结构概述

数据结构是底层数据的存储方式,分四大类:

  • Set集合:纯粹的容器,无序存储,元素唯一
  • 线性结构:一对一存储,如数组、链表、队列、栈
  • 树形结构:一对多存储,如二叉树、表达式目录树、菜单结构
  • 图状结构:多对多存储,如拓扑图、地图网络

二、线性结构

连续存储(数组类)

Array

内存连续分配,元素类型相同,长度固定。支持索引访问,读取快;增删需要移动元素,慢。

int[] intArray = new int[3];
intArray[0] = 123;
string[] stringArray = new string[] { "123", "234" };
ArrayList

长度可动态增加,元素类型为 object,值类型存入时会装箱,取出时需拆箱和强转。非泛型,性能低,现代项目基本不用。

ArrayList arrayList = new ArrayList();
arrayList.Add("Richard");
arrayList.Add(32); // 值类型装箱
var value = (int)arrayList[2]; // 拆箱 + 强转
List<T>

底层也是数组,但泛型、类型安全,避免装箱拆箱,性能高于 ArrayList。读取快,增删慢。

List<int> intList = new List<int>() { 1, 2, 3, 4 };
intList.Add(123);
int val = intList[0]; // 直接访问,无需转换

性能排序:Array ≈ List<T> > ArrayList


非连续存储(链表类)

LinkedList<T>

双向链表,每个节点记录前后节点地址,内存非连续。不支持索引访问,查找只能遍历(慢);增删只需修改指针(快)。

LinkedList<int> linkedList = new LinkedList<int>();
linkedList.AddFirst(123);
linkedList.AddLast(456);
LinkedListNode<int> node = linkedList.Find(123);
linkedList.AddBefore(node, 9);
linkedList.AddAfter(node, 9);
linkedList.Remove(node);
Queue<T>

先进先出(FIFO),像没有瓶底的瓶子。

Queue<string> queue = new Queue<string>();
queue.Enqueue("one");       // 入队
string item = queue.Dequeue(); // 出队并移除
string peek = queue.Peek();    // 查看队首,不移除

应用场景:任务队列、消息队列、日志异步处理。

Stack<T>

先进后出(LIFO),像有瓶底的瓶子。

Stack<string> stack = new Stack<string>();
stack.Push("one");         // 入栈
string item = stack.Pop(); // 出栈并移除
string peek = stack.Peek(); // 查看栈顶,不移除

应用场景:表达式求值、撤销操作、解析表达式目录树。


三、Set 集合(去重容器)

HashSet<T>

基于哈希分布,自动去重,无序存储。对于引用类型,默认按引用判断是否重复;若要按值去重,需重写 Equals 和 GetHashCode。

HashSet<string> hashSet = new HashSet<string>();
hashSet.Add("123");
hashSet.Add("123"); // 重复,不会添加
Console.WriteLine(hashSet.Count); // 1

// 集合运算
HashSet<string> set1 = new HashSet<string>() { "A", "B", "C" };
HashSet<string> set2 = new HashSet<string>() { "B", "C", "D" };
set1.UnionWith(set2);           // 并集
set1.IntersectWith(set2);       // 交集
set1.ExceptWith(set2);          // 差集
set1.SymmetricExceptWith(set2); // 对称差(补集)

应用场景:点赞去重、IP统计、好友推荐(求差集找出"对方认识但我不认识的人")。

SortedSet<T>

自动去重 + 自动排序。可通过 IComparer<T> 自定义排序规则。

SortedSet<string> sortedSet = new SortedSet<string>();
sortedSet.Add("689");
sortedSet.Add("123");
sortedSet.Add("456");
// 遍历输出:123, 456, 689

应用场景:实时排行榜。


四、键值对结构(Key-Value)

哈希散列的核心思想:用 key 计算哈希值,映射到数组索引,实现 O(1) 的增删查改。代价是用空间换性能,数据量过大时散列冲突增多,性能下降。

Hashtable

非泛型,key 和 value 均为 object,有装箱拆箱开销。支持线程安全包装。

Hashtable table = new Hashtable();
table.Add("key1", "value1");
table["key2"] = "value2"; // 直接赋值,key不存在则新增,存在则覆盖
Hashtable.Synchronized(table); // 线程安全版本(单写多读)
Dictionary<TKey, TValue>

泛型版哈希表,类型安全,性能高。按插入顺序遍历(但官方不保证顺序,不应依赖此特性)。非线程安全,多线程场景用 ConcurrentDictionary<TKey, TValue>。

Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1, "HaHa");
dic[4] = "HuHu"; // 不存在则新增,存在则覆盖
// dic.Add(4, "HuHu"); // key已存在会抛异常
foreach (var item in dic)
{
    Console.WriteLine($"Key:{item.Key}, Value:{item.Value}");
}
SortedDictionary<TKey, TValue>

自动按 Key 排序,性能略低于 Dictionary。

SortedDictionary<int, string> dic = new SortedDictionary<int, string>();
dic.Add(5, "HoHo");
dic.Add(1, "HaHa");
dic.Add(3, "HeHe");
// 遍历输出顺序:1, 3, 5
SortedList

非泛型,按 Key 排序,支持索引访问,内存占用比 SortedDictionary 小。TrimToSize() 可最小化内存开销。

SortedList sortedList = new SortedList();
sortedList.Add("First", "Hello");
sortedList["Third"] = "~~";
sortedList.TrimToSize(); // 释放多余内存

五、接口体系

  • IEnumerable:所有集合都实现了此接口,提供统一的遍历方式(foreach),核心方法是 GetEnumerator(),返回迭代器
  • ICollection<T>:继承自 IEnumerable<T>,增加了 Count、CopyTo、Contains 等方法,以及 Add、Remove(泛型版本才有增删)
  • IList<T>:继承自 ICollection<T>,增加了索引访问(this[int index])和 Insert、RemoveAt
  • IQueryable:用于延迟查询(LINQ、EF),基于表达式目录树,遍历时才真正执行查询

六、迭代器模式

结论:迭代器模式为不同数据结构提供统一的访问接口,客户端无需关心底层是数组还是链表。

C# 中所有集合都实现了 IEnumerable,foreach 本质上就是调用 GetEnumerator() 获取迭代器,再反复调用 MoveNext() 和 Current。

自定义迭代器

有两种方式实现自定义迭代器:

方式一:用 yield(推荐,简洁)

public class EnumeratorIterator<TSource> : IEnumerable<TSource>
{
    private readonly IEnumerable<TSource> source;
    private readonly Func<TSource, bool> predicate;

    public EnumeratorIterator(IEnumerable<TSource> source, Func<TSource, bool> predicate)
    {
        this.source = source;
        this.predicate = predicate;
    }

    public IEnumerator<TSource> GetEnumerator()
    {
        foreach (var item in source)
        {
            if (predicate(item))
                yield return item; // 编译器生成状态机
        }
    }

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

方式二:手动实现 IEnumerator(理解底层用)

public class ManualIterator<T> : IEnumerator<T>
{
    private readonly T[] _data;
    private int _index = -1;

    public ManualIterator(T[] data) { _data = data; }

    public T Current => _data[_index];
    object IEnumerator.Current => Current;

    public bool MoveNext()
    {
        _index++;
        return _index < _data.Length;
    }

    public void Reset() { _index = -1; }
    public void Dispose() { }
}

方式二展示了 yield 背后编译器实际生成的逻辑:维护一个 _index 状态,每次 MoveNext() 推进一步,Current 返回当前值。

迭代器模式实战:统一访问不同菜单

KFC 菜单用数组存储,麦当劳菜单用 List 存储,通过统一的 IIterator<Food> 接口访问:

IIterator<Food> iterator = kfcMenu.GetEnumerator();
while (iterator.MoveNext())
{
    Food food = iterator.Current;
    Console.WriteLine(food.Name);
}
// 换成麦当劳菜单,调用方式完全一样
IIterator<Food> iterator1 = macDonaldMenu.GetEnumerator();
while (iterator1.MoveNext()) { ... }

七、yield 关键字

结论:yield 是语法糖,编译器自动生成状态机(迭代器),实现 MoveNext、Current、Reset,让按需返回数据变得极其简洁。

yield return:按需返回

public IEnumerable<int> Power()
{
    for (int i = 0; i < 10; i++)
    {
        yield return Get(i); // 每次调用 MoveNext 才执行到这里
        Console.WriteLine("yield 之后继续执行");
    }
}

调用 Power() 时不会立即执行任何代码,只有 foreach 遍历时,每次 MoveNext() 才推进一步。

yield break:提前终止

public IEnumerable<int> CreateEnumerable()
{
    for (int i = 0; i < 5; i++)
    {
        yield return i;
        if (i == 4)
            yield break; // 终止迭代,后续代码不再执行
    }
    yield return -1; // 不会执行到
}

yield 与 finally

含有 yield 的方法中,finally 块会在迭代器被释放(Dispose)时执行,即使中途 break 也会触发:

public IEnumerable<int> CreateEnumerable()
{
    try
    {
        for (int i = 0; i < 5; i++)
        {
            yield return i;
        }
    }
    finally
    {
        Console.WriteLine("停止迭代!"); // foreach break 后也会执行
    }
}

yield vs 普通方法

// yield:按需获取,延迟执行,节省内存
public IEnumerable<int> Power()
{
    for (int i = 0; i < 10; i++)
        yield return Get(i); // 要一个拿一个
}

// 普通方法:一次性全部计算,全部放入内存
public IEnumerable<int> Common()
{
    List<int> list = new List<int>();
    for (int i = 0; i < 10; i++)
        list.Add(Get(i)); // 先全部算完
    return list;
}

自定义 LINQ 扩展方法

public static IEnumerable<T> ElevenWhere<T>(
    this IEnumerable<T> source,
    Func<T, bool> func)
{
    foreach (var item in source)
    {
        if (func.Invoke(item))
            yield return item; // 延迟执行,遍历时才过滤
    }
}

// 使用
var result = studentList.ElevenWhere(s => s.Age < 30);
foreach (var item in result) // 遍历时才真正执行过滤逻辑
{
    Console.WriteLine(item.Name);
}

yield 的应用场景:大数据集分页加载、无限序列生成、LINQ 的 Where/Select 等延迟查询。


八、dynamic 关键字

结论:dynamic 是 C# 4.0 引入的动态类型,让 C# 具备弱类型特点,类型检查推迟到运行时。

// 强类型:编译时检查
string s = "abcd";
// int i = (int)s; // 编译错误

// dynamic:运行时检查
dynamic d = "abcd";
int i = (int)d;  // 编译通过,运行时报错
d.Hello();       // 编译通过,运行时报错

任何与 dynamic 交互的表达式,结果也是 dynamic:

dynamic str = "abcd";
Console.WriteLine(str.Length);      // dynamic
Console.WriteLine(str.Substring(1)); // dynamic

dynamic 的三个主要用途:

  1. 代替反射,性能比反射高:
object obj = new YieldDemo();

// 反射方式
Type type = obj.GetType();
type.GetMethod("Power").Invoke(obj, null);

// dynamic 方式(更简洁,性能更好)
dynamic dObj = obj;
dObj.Power();
  1. 简化数据绑定,无需强转
  2. 与 COM/C++ 互操作更方便

注意:dynamic 失去了编译时类型检查,错误只在运行时暴露,使用时需谨慎。


九、线程安全集合

System.Collections.Concurrent 命名空间提供线程安全版本:

  • ConcurrentQueue<T>:线程安全的队列(FIFO)
  • ConcurrentStack<T>:线程安全的栈(LIFO)
  • ConcurrentBag<T>:线程安全的无序集合
  • ConcurrentDictionary<TKey, TValue>:线程安全的字典
  • BlockingCollection<T>:支持阻塞和限界的集合

十、性能对比与选型

数据结构查询增加删除特点
ArrayO(1)O(n)O(n)固定长度,内存连续
List<T>O(1)O(1)/O(n)*O(n)动态长度,内存连续
LinkedList<T>O(n)O(1)O(1)链表,非连续
HashSet<T>O(1)O(1)O(1)去重,无序
Dictionary<K,V>O(1)O(1)O(1)键值对,哈希散列

*List 尾部追加不需扩容时 O(1),触发扩容或中间插入时 O(n)

选型建议:

  • 频繁随机访问、少量增删 → Array 或 List<T>
  • 频繁头部/中间增删 → LinkedList<T>
  • 需要去重 → HashSet<T>
  • 需要键值映射,增删查改都快 → Dictionary<TKey, TValue>
  • 需要自动排序 → SortedSet<T> 或 SortedDictionary<TKey, TValue>
  • 多线程场景 → Concurrent 系列
C#程序不用安装.NET环境运行(让C#… Xenocode  http://www.cnblogs.com/hsapphire/archive/2009/12/28/1634327.html 把exe 打包 .net 框架   2009-08-27 09:56 C#程序不用安装.NET环境运行(让C#程序脱离.net框架)   通常情况下,运行C#程序,需要系统安装.NET 框架,但是如果为了运行一个100K的C#程序,而安装100M 阅读详情

相关推荐

《Web Service 编程 --用C#.NET 开发网络服务》北京希望出版社 我的学习笔记(第一章)(也就是书上抄了一写东西而已)

《Web Service 编程 --用C#.NET 开发网络服务》-北京希望出版社 我的学习笔记(也就是书上抄了一写东西而已)  特别说明:版权是原书所有!   个人对这本书的感觉,不必要去买了!Web Service 编程 --用C#.NET 开发网络服务》-北京希望出版社第一章 .NET 和.NET 框架1.1  .NET 简介     什么是.NET? 很难用一句话把.NET说清楚,

断水流的菜地 1357

07-C#

Set集合:纯粹的容器,无序存储,元素唯一线性结构:一对一存储,如数组、链表、队列、栈树形结构:一对多存储,如二叉树、表达式目录树、菜单结构图状结构:多对多存储,如拓扑图、地图网络方式一:用 yield(推荐,简洁)// 编译器生成状态机方式二:手动实现 IEnumerator(理解底层用)_index++;方式二展示了 yield 背后编译器实际生成的逻辑:维护一个_index状态,每次MoveNext()推进一步,Current返回当前值。

噢~ 344

使用vite+react+ts+Ant Design开发后台管理项目(四)

本文将引导开发者从零基础开始,运用、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈,构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导,文章旨在为开发者揭示如何利用这些技术工具,从项目构思到最终实现的全过程,提供清晰的开发思路和实用的技术应用技巧。使用vite+react+ts+Ant Design开发后台管理项目(一)使用vite+react+ts+Ant Design开发后台管理项目(二)

lbking666666的专栏 2006

C#笔记(枚举器和迭代器)

1 枚举器 为什么数组可以使用 foreach 输出各元素? 这是因为数组是 枚举类型(enumerable) ,它通过 GetEnumerator 方法提供一个 枚举器(enumerator),即能实现 GetEnumerator 方法的类型是 枚举类型 枚举器可以依次返回请求的数组的元素,枚举器知道 项的次序 并跟踪它的序列位置,然后返回 请求的当前项 对象枚举类型获取枚举器的方法是调用...

KeePCoding 1403

华为IC岗笔试刷题含答案(2)

又做了几套题,记录了部分及答案,如有错误,欢迎评论指正。

Ingrid的博客 1万+

深入解析iDP3的Learning模块:从数据集构建到3D动作预测的代码实现

本文深入解析iDP3框架的Learning模块,从数据集构建到3D动作预测的完整代码实现。通过扩散模型实现视觉输入到动作序列的端到端预测,详细介绍数据采集、增强策略、模型架构及训练技巧,帮助开发者掌握3D动作预测策略的核心技术。

k0l1m2n3o的博客 307

C# 迭代器(iterators)

An iterator can be used to step through collections such as lists and arrays. 迭代器“逐步地”访问集合,比如说列表和数组。“逐步地”指的是迭代器每次只返回集合中的一个元素,而不是全部返回。 迭代器块是有一个或多个yield语句的代码块,以下3种类型的代码块中的任意一种都可以是迭代器块: 1. 方法主体 ...

junex的博客 3336

【Unity工具篇】| 使用YooAsset接入自己的游戏项目,实现完整热更新流程

前面文章介绍了YooAsset的原理和接入官方示例文档的文章介绍,本文使用YooAsset接入自己的游戏项目做示例。 【Unity工具篇】| 资源管理插件YooAsset,原理及相关配置 【Unity工具篇】| 游戏完整资源热更新流程,YooAsset官方示例项目 具体接入方法有很多种,本文会参照官方示例 Space Shooter 太空战机DEMO 用到的方式接入自己的游戏项目。

努力前行,总会成为自己心中的那道光 1万+

C#迭代器——由foreach说开去

C#迭代器——由foreach说开去 IEnumerable和IEnmerator yield retun StartCoroutine

O213的博客 7366

【异常】飞书OpenClaw机器人 HTTP 401: Invalid Authentication 报错排查与解决方案

HTTP 401 是HTTP协议标准定义的未授权(Unauthorized)状态码,核心含义为请求方身份认证无效,服务端拒绝执行本次请求。飞书开放平台服务端对自建机器人的全链路鉴权校验失败。无论是机器人接收飞书事件推送的上行请求,还是机器人主动调用飞书开放平台API的下行请求,只要身份凭证无效、鉴权逻辑校验不通过,飞书服务端就会返回该报错,并最终透传到飞书客户端会话窗口中。

奶爸的编程之路,也就一周冷个三天 3758

【肌电处理】肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率【含Matlab源码 3386期】

肌电信号EMG积分肌电值+均方根值+中值频率+平均功率频率 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 821

C#学习笔记(上)

经本人搜集网上资料后整合而成的C#学习笔记,知识点很全面,前面某些很基础的内容绝大部分人都已经在学C/C++的时候学过了,所以基本一笔带过,其它地方都尽量写的很详细。

m0_75104457的博客 2315

编写一个程序实现顺序表的各种基本运算(假设顺序表的元数基本类型为Char)

/* *Copyright (c) 2016, 烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作者:张旺华 *完成日期: 2016 年 7 月 1 日 *版本号:v1.0 *问题描述:编写一个程序实现顺序表的各种基本运算(假设顺序表的元数基本类型为Char) * */ #include #include #include

张旺华的博客 1万+

.net和c#的区别

今天和同事闲聊的时候,突然发现了一个非常需要重申的问题。我们经常会问你们平台是用什么开发的呀?很多人会混淆了.net和C#的含义;下面我们来温习一下基础知识。.net的含义:一般指.Net Framework框架,是Microsoft为开发应用程序而创建的一个具有革命意义的平台。内容:    .net有2种交互模式,分别是B/S,C/S。主要包含一个庞大的代码库,可从在客户语言(如C#)中通 过面...

木子夏_欣儿的博客 6万+

openclaw中文版安装教程和常用命令

OpenClaw 中文版的和,涵盖本地一键部署、Docker 隔离部署、阿里云极速部署三种方式,以及六大类高频命令,方便你快速上手和日常运维。

suny8的专栏 2994

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C#数据结构与算法入门实战指南

在编程领域,数据结构与算法是构建高效、可靠和可扩展软件系统的基石。它们对于提升程序性能、优化资源利用以及解决复杂问题具有至关重要的作用。今天大姚分享一些非常不错的C#数据结构与算法实战教程,希望可以帮助到有需要的小伙伴。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 2306

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C#与.NET的区别

今天和同事闲聊的时候,突然发现了一个可能大家都以为自己很清楚却容易被忽略和混淆的问题。 .net是不是就是c#? 你大脑里的第一个答案是什么呢? 下面我们来温习一下基础知识。 .net的含义: 一般指.Net Framework框架,是Microsoft为开发应用程序而创建的一个具有革命意义的平台。 上图是一个简单的.net框架。 .NET Framework是用于Windows的新托管代码编程模型。它强大功能与新技术结合起来,用于构建具有视觉上引人注目的用户体验的应用程序,实现跨技术边界的无

liwei15889790675的博客 7982

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C#学习笔记01之.NET与C#

.NET是Microsoft推出的用于软件开发、运行的平台,可以跨平台、跨语言开发,支持C#、F#、Visual Basic等语言。C#(读作“C Sharp”)是Microsoft推出的,由C和C++衍生出的,安全、稳定、简单、优雅的面向对象且运行于.NET Framework和.NET Core之上的高级程序编程语言,于2000年6月发布。它在继承C和C++强大功能的同时去掉了一些复杂特性如多重继承、内存管理,并提供了大量API以显著提高开发效率。

weixin_42449022的博客 1572

2025年C#/.NET快速入门实战指南大全

本篇文章主要是介绍Blazor是一个怎样的Web UI框架,其优势和特点在哪?并带你快速入门上手ASP.NET Core Blazor(当然这个前提是你要有一定的C#编程基础的情况,假如你完全没有接触过C#的话建议你先从基本语法学起)。全面的ASP.NET Core Blazor简介和快速入门。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 1588

2025 年全面的 C#/.NET/.NET Core 学习路线集合,学习不迷路!

C#、.NET、.NET Core、WPF、WinForm、MAUI、Avalonia、Unity等相关技术的学习、工作路线集合(持续更新)!!!C#/.NET/.NET Core学习路线集合语雀访问地址:https://www.yuque.com/ysgstudyhard/lg56l0/ub8s6b0re9h26epr欢迎加入DotNetGuide技术社区微信交流9群!

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 1647

深入.NET平台和C#编程 第五章 学习笔记

CKong的专栏 1750

C#学习笔记——(24).Net与数据结构

数据与数据结构 数据结构包括三方面 数据的逻辑结构 数据的存储结构 数据的运算(即数据的处理操作) 数据的存储结构 顺序存储结构 链式存储结构—将存放每个数据元素的结点分为两部分,一部分存放数据元素(数据域),另一部分存放指示存储地址的指针(指针域) 索引存储结构 散列存储结构 线性表 线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点(第一个结点...

屿十_ 520

C#/.NET/.NET Core优质学习资料

今天大姚给大家分享一些C#/.NET/.NET Core优质学习资料,希望可以帮助到有需要的小伙伴。.NET 是一个免费的、跨平台的、开源开发人员平台,用于构建许多不同类型的应用程序。使用 .NET,可以使用多种语言、编辑器和库来构建 Web、移动、桌面、游戏和 IoT 等。一文带你了解.NET能做什么?

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 1185

C#与.net有什么关系

.NET与C#的关系有C#是一种针对与.net编写的编程语言,与C++的语法十分相似。而.net是一个开发框架,而且.net中存在的特性C#不一定存在。 经常会有人将.net与C#混淆,认为它们是一样的,其实他们还是有一定的区别的。.net是一个抽象的平台概念而C#是一种编程语言。接下来在文章中将具体介绍它们之间的关系,具有一定的参考作用,希望对大家有所帮助 .NET 的介绍 .NET 一般指的是.Net Framework框架,它是由Microsoft为开发应用程序而创建的一个平台。主要用于Wind

weixin_57765329的博客 1万+
上一篇: 06-C#.Net-表达式目录树-学习笔记
下一篇: 08-C#.Net-Thread-学习笔记
似水明俊德
博客等级 码龄8年 247粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值