从零开始重学C#基础

C#从零开始学习(图文教程),持续更新中~ 理论知识固然重要,但是只读理论往往是枯燥的,只有通过不断的实践和探索,才能更高效的进行学习。 阅读详情

一、数据类型与内存管理

1. 值类型(Value Types)
  • 定义:直接存储数据本身,存放在**栈(stack)**中。
  • 包含类型:
    • 基本类型:int, float, double, bool, char, byte, short, long
    • 结构体(struct):用户自定义的值类型,需继承自System.ValueType。
    • 枚举(enum):本质上是int的别名,但可定义命名常量。
  • 关键特性:
    • 赋值/传递时创建副本:
      int a = 10;
      int b = a; // b是a的副本,修改b不影响a
    • 方法参数传递:值类型参数传递的是值的副本,方法内修改不影响原始变量。
      void Modify(int x) { x = 20; }
      int num = 10;
      Modify(num); // num仍为10
    • 结构体的注意事项:
      • 结构体可以有构造函数、方法,但实例化时不需要new(除非显式调用构造函数)。
      • 避免定义过大结构体(建议不超过16字节),否则性能可能下降。
2. 引用类型(Reference Types)
  • 定义:存储对数据的引用(内存地址),数据本身存放在**堆(heap)**中。

插入知识:堆和栈

栈Stack堆Heap
空间小大
速度快慢
内存分配释放自动手动
存储局部变量、函数参数、地址动态分配对象、大型数据结构
生命周期函数调用结束后销毁手动释放/垃圾回收器
特点LIFO(后进先出)动态分配
分配顺序按序分配动态寻找可用内存块
P p =new P("A",1)

 定义一个P类型变量小p

变量:p
————————
地址:0x01

小p变量存储在栈内

P对象
——————
内容:A,1

大P对象内容存储在堆内

 

  • 包含类型:
    • 类(class):如string, object, 自定义类。
    • 接口(interface)、委托(delegate)、数组(array)、dynamic类型。
  • 关键特性:
    • 赋值/传递时传递引用:
      Person p1 = new Person { Name = "Alice" };
      Person p2 = p1; // p2和p1指向同一对象
      p2.Name = "Bob"; // p1.Name也变为"Bob"
    • 方法参数传递:引用类型参数传递的是引用的副本,方法内修改对象会影响原始对象。
      void Modify(Person p) { p.Name = "Bob"; }
      Person person = new Person { Name = "Alice" };
      Modify(person); // person.Name变为"Bob"
3. 值类型与引用类型的对比
特性值类型引用类型
内存位置栈(stack)堆(heap)
赋值/传递创建副本传递引用的副本
默认值0(数值类型)、false(bool)、\0(char)null

二、类与对象

1. 类(class)基础
  • 定义:
    public class Person {
        // 成员变量(字段)
        public string Name { get; set; } // 自动属性
        private int age; // 私有字段
    
        // 构造函数
        public Person(string name) {
            Name = name;
        }
    
        // 方法
        public void SayHello() {
            Console.WriteLine($"Hello, {Name}!");
        }
    }
  • 关键点:
    • 访问修饰符:public(公开)、private(私有)、protected(保护)、internal(当前程序集可见)。
    • 构造函数:无返回类型,名称与类名相同;可重载。
    • 析构函数:~ClassName(),用于资源清理(非必须,GC自动回收)。
2. 结构体(struct)
  • 定义:
    public struct Point {
        public int X;
        public int Y;
    
        public Point(int x, int y) {
            X = x;
            Y = y;
        }
    }
  • 与类的区别:
    • 结构体是值类型,类是引用类型。
    • 结构体默认无默认构造函数,但可显式定义。
    • 结构体不能继承其他结构体/类,但可实现接口。
3. 对象实例化
  • 类:需使用new关键字。
    Person person = new Person("Alice");
  • 结构体:可直接赋值或使用new(显式调用构造函数)。
    Point point = new Point(1, 2); // 显式调用构造函数
    Point point2 = default; // 默认值(X=0, Y=0)

三、方法与参数

1. 方法定义
  • 返回值:void表示无返回值,其他类型需返回值。
    • 参数传递方式:
      • 值传递(默认):值类型传副本,引用类型传引用的副本。
      • 引用传递:使用ref或out关键字。
        void Modify(ref int x) { x = 20; }
        int num = 10;
        Modify(ref num); // num变为20
2. 参数类型
类型说明示例
值类型参数传递值的副本,修改不影响原变量void Add(int a)
**引用类型参数传递引用的副本,修改对象会影响原对象void Update(Person p)
ref/out参数传递变量的引用,允许修改原变量void Swap(ref int a, ref int b)
params参数支持可变数量的参数(只能是最后一个参数)void Sum(params int[] numbers)
可选参数定义默认值,调用时可省略void Print(int num = 0)


四、异常处理

1. try-catch-finally
  • 语法:
    try {
        // 可能抛出异常的代码
    } catch (ExceptionType1 ex) {
        // 处理特定异常
    } catch (ExceptionType2 ex) {
        // 其他异常处理
    } finally {
        // 总会执行的清理代码(无论是否抛出异常)
    }
  • 注意事项:
    • 捕获异常时,优先捕获具体异常类型(如FileNotFoundException),而非直接捕获Exception。
    • 使用throw;重新抛出当前异常(保留堆栈信息),避免throw ex;(会丢失原始堆栈)。
2. 自定义异常
  • 定义:
    public class MyException : Exception {
        public MyException(string message) : base(message) { }
    }

五、集合与泛型

1. 常用集合类
类型说明示例
List<T>可变大小的动态数组List<int> numbers = new List<int>();
Array固定大小的数组int[] arr = new int[5];
Dictionary<TKey, TValue>键值对集合Dictionary<string, int> dict = new();
Queue<T>先进先出(FIFO)Queue<string> queue = new();
Stack<T>后进先出(LIFO)Stack<int> stack = new();
2. 泛型(Generics)
  • 作用:提供类型安全的集合和方法,避免类型转换。
  • 示例:
    List<string> names = new List<string>(); // 泛型集合
    public T Find<T>(List<T> list, T item) { ... } // 泛型方法

六、其他关键细节

1. 装箱与拆箱(Boxing/Unboxing)
  • 装箱:将值类型转换为object或接口类型。
    int num = 10;
    object boxed = num; // 装箱(栈→堆)
  • 拆箱:将object转回值类型。
    int unboxed = (int)boxed; // 拆箱(堆→栈)
  • 性能影响:频繁装箱拆箱可能导致性能问题,应尽量避免。
2. 命名空间与using
  • 作用:组织代码,避免命名冲突。
  • 示例:
    using System; // 引入System命名空间
    using MyNamespace; // 引入自定义命名空间
3. 属性(Properties)
  • 定义:
    public class Person {
        private string name;
        public string Name {
            get { return name; }
            set { name = value; }
        }
    }
  • 自动属性:
    public string Name { get; set; } // 自动生成字段

七、之后的规划

回顾数据结构和算法基础:

实现链表(LinkedList<T>)、栈、队列;排序算法(冒泡排序、快速排序);二分查找、递归问题(斐波那契、阶乘)等等等等,一天刷2道leetcode外加2道Acwing

熟练使用C#特性:

  • 使用List<T>和Dictionary<TKey,TValue>实现缓存。
  • 用委托和事件实现观察者模式。
  • 通过yield return实现迭代器块。
  • 。。。。。。。
C#跨平台CPU监控工具开发实战:Avalonia+系统API CPU占用率是操作系统性能监控的基础指标,其本质是单位时间内处理器非空闲时间占比,需通过底层系统API(如Windows的GetSystemTimes、Linux的/proc/stat、macOS的sysctl)获取高精度时间片差值。相比WMI或PerformanceCounter等托管封装,原生系统调用可规避采样抖动、提升响应实时性,并支持毫秒级控制与核心级粒度。在跨平台GUI层面,Avalonia作为专为.NET设计的MIT开源框架,提供XAML声明式开发、单文件发布、无WebView依赖等工程优势,显 阅读详情

相关推荐

C# 简单入门教程:从零开始学习 C#

建议使用 Visual Studio,这是一个强大且易于使用的集成开发环境(IDE),提供了丰富的开发功能和调试工具。它结合了 C 和 C++ 的特性,并引入了一些现代化的编程概念。在本文中,我们将从零开始学习 C# 编程语言,适合初学者和小白。我们将介绍 C# 的基本概念和语法,并提供一些简单的示例代码,帮助你理解和掌握这门编程语言。这只是 C# 的基础知识,你可以继续学习更多高级的主题,如数组、集合、文件操作、异常处理等。然后,我们调用该函数,并将返回的结果存储在变量。,它包含了一些常用的类型和方法。

PkbgRuby的博客 809

C#类型基础

一、Object类型 所有的类型都是继承自System.Object,Object类定义的方法不多,主要分成两个部分依次说一下: 1、比较 public static bool Equals(Object objA, Object objB); public static bool ReferenceEquals(Object objA, Object objB);...

蓝天小僧的博客 1123

专栏导读

Go 语言,你真的学会了吗? 为什么是 Go? 传统的编程语言都存在一些通用的缺点: 学习成本高:诸如 C++ 要理解作者思想,Java 要学习大量库; 编译速度慢:代码的编写、预处理、编译与运行流程花费时间太长; 无法使用现代计算机发展:现代计算机发展迅速,C、C++ 生态 项目迭代周期短:996 已经成为常态,任务压的又压,在如何提高团队生产效率,又能保证项目质量两者之前权衡成了一个比较重要...

YJingLee's 优快云 Blog 1276

c# 学习(一) 基础语法 基础类型等

值类型数值有符号整数(sbyte、short、int、long)无符号整数(byte、ushort、uint、ulong)实数(float、double、decimal)逻辑值(bool)字符(char)引用类型字符串(string)对象(object)C#的预定义类型又称为框架类型,它们都在System命名空间下。//两种写法等价int num1;//字段public Test1(int num1) //构造器public int add()//方法。

moyuxi_的博客 1677

从零开始学C#(入门经典)

从零开始学C#2010年12月由中国铁道出版社出版发行,是一本学C#的入门经典书籍。C#是Microsoft专门为基于.NET framework平台开发量身定做的编程语言。C#语言不仅支持控制台应用程序开发,还支持Windows窗体应用程序以及ASP.NET应用程序的开发。小编分享的这本从零开始学C#严格按照C#语言标准,全面、系统、浅入深出地阐述了C#语言的基本概念、语法以及C#语言开发工具VisualStudio2008的使用。从零开始学C#主要内容包括数据类型、表达式、运算符、流程控制语句、数组和集合、属性和方法、结构和类、处理异常、VisualStudio2008关于Winform编程中常用组件的使用、C#对文件和流的操作、WPF、GDI十图形图像技术、简单的网络编程、注册表技术、对线程的操作以及Windows应用程序打包方法等。从零开始学C#中的每一个实例均经过细心调试,并给出运行结果图,且对每个实例注有“深入学习”指导,有助于读者分析实例、理解实例。每章均给出主要知识点和小结,帮助读者在学习时分清主次。从零开始学C#适合想学习使用C#语言编写程序的读者作为参考书使用,也适合于已了解C#语言,又想学习VisualStudio2008新功能的读者使用。

C#编程从入门到精通-pdf

C#编程从入门到精通-pdf

【C#基础】C# 数据类型总结

编程语言 C# 数据类型的介绍 。

好学若饥,谦卑若愚。 6912

deepin启动异常处理

修复的命令在执行时会输出大量的修复信息,正常情况下修复完之后输入exit命令回车后,即可正常启动系统。

whxxiang的博客 4369

重学 Go 语言:基础篇

专栏亮点 79 章节内容解析 Go 语言基础知识点; 使用反汇编、编程范式推导 Go 核心原理; 从架构思想层面解析 Go 语言每个细节; 与 C 语言对比学习 Go 基础核心; 从 Go 语言背景知识到灵活使用,知其然知其所以然。 专栏介绍 我一直从事服务器后端系统开发快 10 年了,高并发分布式是互联网应用的基础,工作中先后使用过C#、Java、Go 等语言。当前工作需要把平台迁移到 Go...

GitChat 969

高云FPGA开发实战:手把手教你用ModelSim做功能仿真与时序分析(附Testbench写法)

本文详细介绍了高云FPGA开发中如何使用ModelSim进行功能仿真与时序分析,包括环境搭建、Testbench编写、波形调试和时序优化等实战技巧。通过具体案例和代码示例,帮助开发者掌握FPGA仿真验证的核心方法,提升设计可靠性。特别针对高云GW5A系列器件提供了专业的仿真库配置指南和时序分析策略。

weixin_30412167的博客 466

python实现纵横向拉开档次法 (附完整源码)

python实现纵横向拉开档次法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 778

重学 Go 语言:进阶篇

专栏亮点 27 章节内容解析 Go 语言进阶知识点; 使用反汇编、编程范式推导 Go 核心原理; 从架构思想层面解析 Go 语言每个细节; 从 Go 语言背景知识到灵活使用,知其然知其所以然。 专栏介绍 我一直从事服务器后端系统开发快 10 年了,高并发分布式是互联网应用的基础,工作中先后使用过C#、Java、Go 等语言。当前工作需要把平台迁移到 Go,从零开始构建基础设施框架,在基础设施框...

GitChat 819

Allegro孔和线被做到器件里面如何解锁操作指导

在做PCB设计的时候,会遇到孔和线被做到器件的情况,当需要移动器件的时候,孔和线也会跟着移动。孔和线被做到器件里面如何解锁操作指导。

weixin_54787054的博客 1144

大专生从零开始重新学习c#的第一天

只是简单的记录一下自己的学习,第一次随便写写,如有错误请指正, 今天根据菜鸟教程的第一课基本语法的课程,看到了代码图,自己去手打了一下,发现class(是一个关键字)做为一个类,里面可以定义很多东西,包括但不限于,数据,方法,实例化, c#中的数据类型三大类 1(值类型):一般像是我们使用的数字一样,int(整数) float(浮点数) bool(布尔值)等等 其中bool经常用来做if判断,其默认值为false,是比较重要的值类型 这里在菜鸟教程里提到了一个判断精确值的(sizeof)方法得

weixin_63794834的博客 195

LDRA Testbed软件静态分析_常见问题及处理

通过前面的几篇文章,LDRA Testbed软件静态分析的内容基本讲解完了,本篇文章将针对使用Testbed进行软件静态分析的常见问题进行介绍。 到此为止,LDRA Testbed软件静态分析的内容已经全部讲完,如果有问题,欢迎私信提问(不经常登录,回复可能不及时,见谅)。下一篇文章将开始讲解如何使用Testbed进行单元测试。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 2585

基于方差分解分析气象/水文干旱驱动因素(含MATLAB全代码)

简介基于方差分解方法分析气象/水文干旱驱动因素

WW、forever的博客 801

从Web前端转U3D手游的原因

1.Web前端转U3D手游原因;2.C#与JavaScript;3.我的学习计划

SuriFuture的博客 4606

SwiftUI 5 教程之 SwiftData使用入门(教程含源码)

对我来说,记住日期很难。是的,您可以设置该日期的提醒,但该提醒无法产生紧迫感。让我们创建一个应用程序,我们可以在其中添加将来发生的事件。如果我们可以在主应用程序上看到所有即将发生的活动,那就太好了。也许将它们添加到小部件上以营造紧迫感。对于任何事件,我们需要跟踪哪些事情?我们将在下一篇文章中添加更多属性,其中我们将讨论迁移。现在,这就是我们所需要的。开始吧。

iCloudEnd的博客 987

go 通道 返回_工作中,你有遇到过 Go 的这些问题吗?

我一直从事服务器后端系统开发快 10 年了,工作中先后使用过 C#、Java、Go 等语言。我当前的工作需要把平台迁移到 Go,从零开始构建基础设施框架,并在基础设施框架上开发各种业务系统。在迁移过程中,我逐步自研了一套功能完善的基础框架,同时也对语言的一些特性有了更深入的了解。为了把这些宝贵的经验分享给大家,于是我开始在 GitChat 上写专栏。专栏想告诉大家的是:如何把一门语言学精...

weixin_35820423的博客 127

手把手教你玩转服务器芯片架构--​​7.1 项目1:基于FPGA的RISC-V软核设计(Verilog实现核心指令执行单元)​

本文介绍了基于FPGA的RISC-V软核设计实践项目。项目采用Verilog实现RV32I指令集核心处理器,包含指令解码、ALU、寄存器堆等关键模块设计,并通过功能仿真验证。在Xilinx Artix-7 FPGA上完成综合与部署,资源利用率控制在5%以内。最后探讨了五级流水线优化、指令集扩展等进阶方案。该实践完整覆盖了从指令集设计、RTL实现到FPGA部署的全流程,可作为学习处理器架构与FPGA开发的典型案例。

MHD0815的博客 173

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

工作中,你有遇到过 Go 的这些问题吗?

我一直从事服务器后端系统开发快 10 年了,工作中先后使用过 C#、Java、Go 等语言。我当前的工作需要把平台迁移到 Go,从零开始构建基础设施框架...

形势所逼,不进则退 283

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档之外,学习 Go 会遇到哪些问题?

我一直从事服务器后端系统开发快 10 年了,工作中先后使用过 C#、Java、Go 等语言。我当前的工作需要把平台迁移到 Go,从零开始构建基础设施框架...

mobilehub 158

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

bilibili go框架_Go 语言,你真的学会了吗?

为什么是 Go?传统的编程语言都存在一些普遍的缺点:学习成本高:诸如 C++ 要理解作者思想,Java 要学习大量库;编译速度慢:代码的编写、预处理、编译与运行流程花费时间太长;无法使用现代计算机发展:现代计算机发展迅速,C、C++ 生态;项目迭代周期短:996 已经成为常态,任务压的又压,在如何提高团队生产效率,又能保证项目质量两者之前权衡成了一个比较重要的问题。所以急需一门语言改善...

weixin_39759989的博客 484

Go 语言,你真的学会了吗?

为什么是 Go?传统的编程语言都存在一些普遍的缺点:学习成本高:诸如 C++ 要理解作者思想,Java 要学习大量库;编译速度慢:代码的编写、预处理、编...

mobilehub 319

手写SpringMVC,原来写一个简易SpringMVC框架这么Easy!

项目地址(功能已更新,如对你有帮助记得给个star哦!) 首先大家写JAVA项目多多少少都有接触过SpringMVC这个表现层框架,但是大多数人只知道怎么用这框架,却不了解这框架的原理,如果到时候工作的公司用的是公司自己的框架难道又要慢慢重学一遍吗?所以不如了解框架的原理,再学其他框架就能很快上手。 如上图所示的是SpringMVC的架构流程,下面我只简单的实现SpringMVC的...

Wim的博客 2405

Atelier of Light and Shadow .NET开发集成指南

本文介绍了如何在星图GPU平台上自动化部署📜 灵感画廊 · Atelier of Light and Shadow镜像,赋能.NET应用实现图文理解与设计草图生成。该镜像支持本地化、低依赖的AI能力集成,典型应用于手绘流程图自动矢量化、UI原型智能生成及多轮对话式图像编辑等场景。

weixin_36047538的博客 267
上一篇: PrimeTween插件教学(自用)关于Unity动画制作插件,比起DoTween,我更推荐PrimeTween插件。
下一篇: 第一章 万事开头难,所以先规划
SWJSMSM
博客等级 码龄4年 46粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值