CSharp
文章平均质量分 51
曹牧
从牙牙学语到灵活运用,风风雨雨
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C#:单行定义多个变量
如果需要集合类型,则可以选择数组、List等集合的初始化方式。使用var关键字可以让编写更简洁的代码,同时保持类型安全。在C#中,如果想定义多个字符串变量,有几种不同的方法可以实现这一点。还可以结合使用var关键字和批量初始化。5. 使用new关键字直接初始化数组或集合的多个元素(C# 6及以后)从C# 3.0开始,可以使用var关键字让编译器自动推断变量的类型。可以在单行中使用逗号分隔来定义多个字符串变量,并为它们分别赋初值。4. 使用var关键字与批量初始化(适用于数组或集合)2. 使用var关键字。原创 2026-01-06 16:41:31 · 304 阅读 · 0 评论 -
VS:Ctrl+K
Ctrl+K, Ctrl+C:对选中代码添加注释(多行注释)。Ctrl+K, Ctrl+S:显示外侧代码(如方法签名)。Ctrl+K, Ctrl+0:折叠所有方法(部分版本)。Ctrl+K, Ctrl+U:取消选中代码的注释。Ctrl+K, Ctrl+F:格式化选中代码块。Ctrl+K, Ctrl+K:在当前行设置书签。Ctrl+K, Ctrl+F:格式化选中代码。Ctrl+K, Ctrl+X:插入代码片段。Ctrl+K, Ctrl+L:展开所有方法。Ctrl+K, Ctrl+T:打开查找工具。原创 2026-01-06 14:20:44 · 463 阅读 · 0 评论 -
VS:代码格式化
1、Python代码格式化: Visual Studio 的 Python 工具支持使用autopep8、Black 或 yapf 等格式化程序,可通过 “工具” > “选项” > “文本编辑器” > “Python” > “格式化” 设置源代码格式器;此外,可启用自动换行(在 “工具” > “选项” > “文本编辑器” > “Python” > “常规” 中勾选“换行”复选框),并使用 “编辑” > “高级” > “填充注释段落” 命令重新排列注释文本。原创 2026-01-06 10:13:23 · 327 阅读 · 0 评论 -
C#:记录日志
有多种方式可以实现日志记录,包括使用.NET内置的日志类库(如System.Diagnostics命名空间中的Trace和TraceSource类),或者使用第三方库如log4net、NLog、Serilog等。// 对于文件输出需要此命名空间。Trace.TraceWarning("这是一个警告日志");Trace.TraceError("这是一个错误日志");Trace.WriteLine("这是一个信息日志");log.Error("这是一个错误日志");log.Error("这是一个错误日志");原创 2025-12-23 15:49:35 · 365 阅读 · 0 评论 -
C#:List<string>类型的集合转换成用逗号分隔的字符串
/ 添加最后一个元素,因为没有在Aggregate中处理最后一个元素的情况。string.Join方法是最直接和常用的方法之一,它允许你指定一个分隔符,并将集合中的元素连接成一个字符串。原创 2025-12-16 12:47:31 · 821 阅读 · 0 评论 -
C#:string.IndexOf
在 C# 中,字符串(string)的 IndexOf 方法用于查找子字符串在原始字符串中的位置。这里,IndexOf 方法返回子字符串 "World" 在原始字符串中的起始位置的索引,即 7。// 从索引7开始搜索(即"World"后面的位置)// 搜索的范围长度。字符串的索引是从 0 开始的,这意味着第一个字符的索引是 0,第二个字符的索引是 1。// 开始搜索的位置。3、查找子字符串的指定位置之后第一次出现的位置。2、 查找子字符串的最后一次出现的位置。查找子字符串的第一次出现的位置。原创 2025-12-12 16:11:45 · 467 阅读 · 0 评论 -
C#:foreach
在上面的代码中,即使numbers是一个空的List<int>,foreach循环也会正常执行,并且在尝试打印任何元素之前结束循环。在C#中,在foreach循环中使用List,通常不需要显式地检查List是否为空,因为在尝试遍历一个空的List时,foreach循环会安全地处理这种情况,不会抛出异常。这种方式提供了额外的控制,特别是在处理可能为null的集合时,或者在你想在循环之前执行一些特定操作时非常有用。然而,对于普通的遍历操作,直接使用foreach是更简洁和常见的方法。原创 2025-12-08 15:40:35 · 240 阅读 · 0 评论 -
在C#中,string和String
string:C#语言的关键字,是System.String的别名。String:.NET Framework中的类名(System.String),在C#中直接使用时需注意命名空间冲突。功能等价:string和String在功能上无差异,但string更符合C#语法规范。性能优化:频繁修改字符串时,优先使用StringBuilder。优先使用string:符合C#语法风格,代码更简洁易读。原创 2025-12-08 14:38:09 · 326 阅读 · 0 评论 -
C#和Java的String
Java:== 比较引用(地址相等),equals() 比较值(内容相等);C#:== 比较字面量(值相等),Equals() 也用于值比较;// s2 是新对象,s1 未变。C#:使用 string(小写)作为字符串类型,但 String(大写)也是其类名。Java:使用 String(大写)作为字符串类型,string(小写)无效。Java:字符串常量池(字符串常量共享)。C#:字符串驻留机制(字符串常量共享)。原创 2025-12-08 14:35:04 · 758 阅读 · 0 评论 -
C# 中的 dynamic 类型
1、编译时与运行时行为:dynamic 变量在编译时被视为静态类型(类似 object),但所有操作(如方法调用、属性访问)的类型检查和成员解析都在运行时完成。类型安全性:由于类型检查延迟,错误可能在运行时才暴露,增加调试难度。2、 重载决策延迟:当方法调用的参数或接收方类型为 dynamic 时,重载决策在运行时进行。性能开销:dynamic 的运行时检查会带来性能损失,通常低于静态类型。// 整数转换为 dynamic。隐式转换:任何类型都可以隐式转换为 dynamic,反之亦然。原创 2025-12-08 10:22:53 · 302 阅读 · 0 评论 -
C#:$ 符号
在C#中,$ 符号用于字符串内插(String Interpolation),这是一种简洁、可读性更高的方式来拼接字符串和表达式。可读性更高:相比传统的 string.Format(),内插语法更直观易懂。适用场景:日志输出、动态SQL构建、用户消息生成等需要频繁拼接字符串的场景。内插字符串可以包含任何有效的C#表达式,如计算、方法调用等。创建内插的逐字字符串,适用于多行文本或SQL语句,同时保留换行和转义字符。在字符串字面量前加上 $ 符号,即可将该字符串标识为内插字符串。原创 2025-12-08 10:15:56 · 547 阅读 · 0 评论 -
C#中解析JSON数组
在C#中解析JSON数组,通常我们会使用Newtonsoft.Json(也称为Json.NET)库,这是.NET环境中处理JSON数据的流行选择。,可以像访问对象属性那样访问JSON中的键值对,而不必事先定义一个类。然而,使用匿名类型通常不如使用专门定义的类来得安全和类型安全。在可能的情况下,推荐使用专门的类来映射JSON结构。然后,使用JsonConvert.DeserializeObject方法来解析JSON数组。首先,定义一个C#类,这个类的属性与JSON对象的键相匹配。步骤2:解析JSON数组。原创 2025-12-08 10:10:54 · 753 阅读 · 0 评论 -
C#:Dictionary类型数组
/ 示例:第一个位置存储一个字典,第二个为null或另一个字典等。// 示例:向第一个字典添加元素。// 示例:向第一个字典添加元素。// 初始化字典数组的每个元素。原创 2025-12-05 16:55:03 · 427 阅读 · 0 评论 -
C#中的StartsWith
在实际开发中,可以结合EndsWith和Contains方法一起使用,提高字符串处理的效率。// 输出:False(区分大小写)Console.WriteLine(text.StartsWith("Hello"));// 输出:True。bool result = str.StartsWith("指定字符串");C#中的StartsWith方法用于检查字符串是否以指定的子字符串开头。返回布尔值(true/false)原创 2025-11-29 14:41:52 · 232 阅读 · 0 评论 -
C#:<SubType>Component</SubType>
可视化编辑器关联:当SubType设为Component时,Visual Studio会使用可视化设计器打开文件(如WinForm窗体文件)。若设为Code,则使用代码编辑器。项目文件修改:在.csproj文件中,为<Compile>节点添加<SubType>Component</SubType>。类型冲突:避免与<SubType>Code</SubType>混淆,后者适用于纯代码文件。代码文件关联:确保文件扩展名(如.cs)与SubType匹配,否则可能无法正确识别。原创 2025-11-28 14:44:42 · 188 阅读 · 0 评论 -
VS:显示行号
版本兼容性:不同版本的 Visual Studio 界面可能略有差异,但核心设置路径保持一致(如 VS 2022 与早期版本)。在 Visual Studio 中显示代码行号,可以通过菜单栏的“工具”>“选项”>“文本编辑器”路径,勾选“显示行号”选项来实现。启用行号显示:在右侧设置区域找到“显示行号”或“行号”复选框,勾选后点击“确定”保存。定位到文本编辑器设置:在弹出的“选项”对话框中,展开左侧的“文本编辑器”节点。若需为所有编程语言统一设置,选择“所有语言”。原创 2025-11-27 09:38:39 · 196 阅读 · 0 评论 -
C#:姓名脱敏
在C#中实现姓名脱敏,主要通过字符串处理来隐藏部分信息,保护用户隐私。Console.WriteLine(NameMask("张三"));这种方法适用于大多数中文姓名场景,保留姓氏和最后一个字,中间用星号填充2。对于更严格的隐私保护需求,可以只显示姓氏,其余全部隐藏。// 长度大于等于3:保留首字符和最后一个字符。基础脱敏 张*、李*郎 常规业务展示。正则脱敏 张*、李*郎 复杂格式处理。简化脱敏 张*、李* 高隐私要求。// 保留第一个字符,隐藏其余字符。原创 2025-11-24 13:37:35 · 657 阅读 · 0 评论 -
C#中,#region和#endregion
在C#中,#region和#endregion是一对预处理器指令,用于在Visual Studio等IDE中标记可折叠或展开的代码块,以便更好地组织和管理较长的代码文件。需要明确的是,#region和#endregion指令仅用于代码的组织和折叠,它们本身并不具备条件编译等语义含义,也不会影响代码的编译和执行。折叠显示:在IDE的大纲显示功能中,可以折叠或隐藏一个或多个区域,便于开发者将精力集中于当前处理的文件部分。代码组织:通过将相关功能或逻辑的代码组织在一起,使代码结构更加清晰。原创 2025-11-20 08:53:45 · 263 阅读 · 0 评论 -
VS:解决方案资源管理器中自动定位并高亮显示当前正在编辑的文件
在Visual Studio中启用"在解决方案资源管理器中跟踪活动项"功能后,编辑器会在解决方案资源管理器中自动定位并高亮显示当前正在编辑的文件。此功能特别适用于项目文件较多的情况,能快速确定当前编辑文件在解决方案中的位置。勾选右侧的【在解决方案资源管理器中跟踪活动项】复选框。在左侧树形菜单中选择【项目和解决方案】→【常规】搜索"跟踪解决方案"并分配自定义快捷键(如F4)进入【工具】→【选项】→【环境】→【键盘】可通过按两次F4快速定位文件并自动关闭跟踪。点击菜单栏的【工具】→【选项】原创 2025-11-18 14:15:16 · 434 阅读 · 0 评论 -
C#:无法从方法组转换为objec
例如,特定类型的数组不能直接转换为object[]数组,且用户定义的转换运算符不能重新定义object与其他类型之间的预定义转换。C#中所有类型都直接或间接继承自Object类,这为类型系统提供了统一的基础。在C#编程中,"无法从方法组转换为object"错误通常与委托类型不匹配或方法签名不正确有关。当尝试将方法直接赋值给委托变量或作为参数传递时,如果方法签名与目标委托类型不匹配,就会产生此错误。委托赋值场景:方法参数类型、返回值类型必须与委托定义完全一致。原创 2025-11-17 10:17:35 · 346 阅读 · 0 评论 -
C# :可为空类型
C# 8.0 引入了可空引用类型特性,通过改进的静态流分析、API 注解和变量注释来最小化运行时 NullReferenceException 的发生。在面向对象设计中,可空类型用于区分"未赋值"和"已赋值"的情况,避免不合理的默认值导致的错误。运算符在前一操作数为 null 时返回后一操作数的值,否则返回第一个操作数的值。两边的类型必须一致或为相应的不可为空类型。语法声明可为空类型,如 int?C# 中的可为空类型允许值类型变量包含 null 值,处理数据库或可选数据时非常有用。原创 2025-11-14 09:26:54 · 221 阅读 · 0 评论 -
C#:new {}
/ 输出: Alice。new {}在C#中主要用于创建匿名类型的实例或初始化对象数组。使用new { }语法可快速定义临时数据结构,适用于LINQ查询等场景。new { }可简化数组声明,尤其适合初始化固定大小的集合。原创 2025-11-12 16:58:34 · 220 阅读 · 0 评论 -
C#中,FirstOrDefault
FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource) - 返回满足条件的第一个元素,无匹配时返回指定的默认值。FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) - 返回满足条件的第一个元素,无匹配时返回默认值。FirstOrDefault():序列为空或没有匹配元素时返回默认值。确定集合非空(如硬编码的固定集合)原创 2025-11-11 16:15:57 · 441 阅读 · 0 评论 -
C#中,GetValueOrDefault方法
当可空类型实例存在值时,GetValueOrDefault返回该值;不存在值时,则返回默认值而不会抛出异常。通过使用GetValueOrDefault方法,可以确保代码在遇到null值时仍能安全运行,提供预期的默认行为。无参数版本:当可空类型实例有值时返回该值,否则返回基础类型的默认值(如int的默认值为0)在C#中,GetValueOrDefault方法是处理可空类型时获取安全默认值的重要工具。原创 2025-11-11 15:59:26 · 485 阅读 · 0 评论 -
C#: 可为空的对象必须具有一个值
可空类型允许值类型变量被标记为有效或无效,从而能够将值类型设置为null。从C# 8.0开始,还引入了可为空的引用类型功能,通过静态流分析帮助在编译时检测潜在的NullReferenceException异常。在C#编程中,当遇到"可为空的对象必须具有一个值"异常时,通常是因为尝试访问值为null的可空类型变量的Value属性。在LINQ查询或数据库映射时,如果字段可能存在空值,需要对可空类型进行特别处理。例如decimal?通过HasValue属性检查可空类型是否有值,然后使用条件运算符(?原创 2025-11-11 14:47:32 · 202 阅读 · 0 评论 -
C#:如果尝试对一个null值使用Math.Floor方法
为了安全地处理这种情况,你可以在调用Math.Floor之前检查变量是否为null。在C#中,如果尝试对一个null值使用Math.Floor方法,会引发ArgumentNullException异常。这是因为Math.Floor方法期望其参数是一个数值类型(如int, double, float等),而不能接受null值。// 如果value为null,则返回0。这些方法中的任何一种都可以帮助你安全地处理可能为null的数值,避免在调用Math.Floor时出现。// 或者从某个方法获取的值。原创 2025-11-11 09:01:06 · 491 阅读 · 0 评论 -
C#:using
自动资源管理:using语句通过作用域限定自动释放实现了IDisposable接口的对象资源(如文件和网络连接)。它适用于清理单个非托管资源的情况,对于多个非托管对象的清理,建议使用try-finally来实现。using指令允许使用在命名空间中定义的类型,而无需指定该类型的完全限定命名空间。这可以显著减少代码冗余。全局导入:使用global修饰符,可以将同一using指令添加到项目中的每个源文件。using语句用于定义一个范围,在此范围的末尾将释放对象,主要用于管理非托管资源。原创 2025-11-10 09:38:35 · 253 阅读 · 0 评论 -
C#:三元运算符
虽然三元运算符在某些情况下可以使代码更简洁,但它也可能使代码难以阅读,特别是当三元运算符嵌套使用时。这里的条件可以是任何返回布尔值的表达式(true 或 false)。// 输出:Hello, Alice!在C#中,三元运算符是一种简洁的方式来在两个表达式之间选择一个。三元运算符可以嵌套使用,但是为了代码的可读性,建议不要嵌套过深。在这个例子中,如果a > b为真,则max被赋值为a的值,否则赋值为b的值。在这个例子中,我们检查数字是否为偶数,并相应地设置字符串result。表达式1 : 表达式2;原创 2025-11-06 10:25:13 · 388 阅读 · 0 评论 -
VS:TODO
通过“工具” → “选项” → “环境” → “任务列表” ,可添加或修改关键字(如 TODO、UNDONE、HACK 等)。C++ 项目需手动开启注释任务功能(工具 → 选项 → 文本编辑器 → C/C++ → 格式设置 → 杂项 → 枚举注释任务)。在Visual Studio中,可以通过“任务列表”功能显示代码中的TODO注释。任务列表会列出所有匹配注释的文件名、行号及优先级,双击可直接跳转到代码位置。在任务列表设置中,可为不同关键字分配优先级(如高、中、低)。原创 2025-11-06 10:22:35 · 301 阅读 · 0 评论 -
VS:同时调试产品和客开项目代码
在任意一个Visual Studio的“调试”菜单中,选择“选项和设置”,然后在“调试”->“常规”页面上,清除“一个进程中断时则中断所有进程”复选框。通过以上步骤,利用不同版本的Visual Studio同时对多个进程进行调试,这在处理需要特定环境或不同版本依赖的项目时非常有用。在Visual Studio 2019中,选择“调试”>“附加到进程”(或按 Ctrl+Alt+P) 打开“附加到进程”对话框。在Visual Studio 2020中,重复步骤1-3,附加到同一个或另一个您需要调试的进程。原创 2025-11-04 09:27:45 · 638 阅读 · 0 评论 -
C#:调试附加到进程
在C#中,调试一个已经运行的进程通常涉及到“附加到进程”这一功能,这允许你在不停止当前进程运行的情况下,对其进行调试。这在非常有用。原创 2025-10-30 16:32:58 · 395 阅读 · 0 评论 -
C#: Contains 方法
在C#中,当你在 List<T>、Array 或其他集合类型中使用 Contains 方法时,检查一个元素是否存在于集合中,需要确保传递给 Contains 方法的集合本身不为 null,并且你想要检查的元素(即参数)也不为 null,除非集合允许包含 null 值。在某些情况下,如果你正在使用自定义对象或者实现了自定义的 Equals 方法,并且你确定集合可能包含 null 值,你可以选择不检查参数是否为 null,因为 Contains 方法通常会安全地处理这种情况。// 确保这个变量不是null。原创 2025-10-30 15:42:03 · 266 阅读 · 0 评论 -
C# 中的 DateTime.Now.ToString() 方法支持多种预定义的格式字符
例如,ToString("d") 在美国区域设置下可能输出 "10/27/2025",而在中文环境下则输出 "2025/10/27"。如果需要在不同区域设置下保持一致的输出格式,建议使用自定义格式字符串,如 ToString("yyyy-MM-dd HH:mm:ss") 可以确保始终输出 "2025-10-27 15:17:48" 这样的固定格式。G:通用长格式(短日期 + 长时间),输出如 "2025/10/27 15:17:48"Y 或 y:年月格式,输出如 "2025年10月"原创 2025-10-27 15:20:24 · 592 阅读 · 0 评论 -
C#:子类同时调用父类和接口方法
这种方式确保了父类和接口方法的协调调用,同时提供了足够的灵活性供子类定制特定行为。当需要调用父类和接口的构造函数时,可以使用base关键字调用父类构造函数。public Child(string name) : base(name) // 调用父类构造函数。// 调用父类方法实现。// 调用接口方法实现。Console.WriteLine("接口方法实现");Console.WriteLine("父类方法");// 调用父类事件触发方法。// 同时调用接口方法。4、接口方法的多态处理。原创 2025-10-23 09:47:33 · 500 阅读 · 0 评论 -
C#:子类直接实现接口方法
选择哪种方式取决于具体需求:如果需要完全隐藏父类实现且只在接口上下文中使用,选择显式接口实现;// 输出 "Child's explicit implementation"在C#中,子类跳过父类方法直接实现接口方法可以通过显式接口实现或重新实现接口来实现。// 输出 "Child's reimplementation"// 显式实现:child.Do();// 重新实现接口,覆盖父类的实现。// 显式实现接口,跳过父类方法。// 父类正常实现接口。显式接口实现的特点:。重新实现接口的特点:。原创 2025-10-23 09:38:51 · 774 阅读 · 0 评论 -
C#中virtual、partial和abstract关键字
这些关键字在面向对象编程和大型项目开发中发挥着重要作用。用途:允许在派生类中重写方法、属性、索引器或事件。用途:允许将类、结构、接口或方法分成多个部分定义。用途:创建必须由派生类实现的抽象类和抽象成员。使用override关键字重写。常用于自动生成代码场景。派生类可选择是否重写。拆分大型类到多个文件。3、abstract关键字。1、virtual关键字。2、partial关键字。原创 2025-10-23 09:27:18 · 398 阅读 · 0 评论 -
C#:数组不能使用Const修饰符
这样,虽然外部可以访问数组长度和数组本身,但通过封装和只读属性,你可以在一定程度上控制对数组内容的访问和修改。如果你想要创建一个在声明后不能再改变的数组,可以使用readonly关键字。这允许你在声明数组时就初始化它,并且在之后的代码中不能再改变这个数组的引用或者内容。如果你的目的是让整个数组成为一个不可变的整体(例如,不允许改变引用),你可以考虑使用元组或者自定义只读属性来封装数组。如果你需要一个空的数组或者在初始化时填充数组,你可以创建一个空的数组并在需要时填充它。方法1:使用readonly关键字。原创 2025-10-22 16:26:34 · 319 阅读 · 0 评论 -
C#:可选参数
COM互操作:如Office自动化API中,处理包含大量可选参数的方法(如Word的ConvertToTable方法),避免传递冗余占位值。语法规则:可选参数必须在方法声明的参数列表末尾,且默认值必须为常量(数字、字符串、null、const成员或枚举值)。必选参数优先:所有必选参数必须位于可选参数之前。若方法同时包含必选和可选参数,调用时必须传递必选参数,可选参数可省略。C# 可选参数允许在方法定义时为参数指定默认值,调用时可省略这些参数而使用默认值。此方式避免了为中间参数提供占位值。原创 2025-10-15 16:23:20 · 299 阅读 · 0 评论 -
C#:命名参数
C# 命名参数允许在调用方法时通过参数名称指定实参,而非依赖参数的位置顺序。这种方式能提升代码可读性并减少因参数顺序错误导致的调用问题。例如,CalculateBMI(weight: 123, height: 64) 和 CalculateBMI(height: 64, weight: 123) 是等效的,即使参数顺序不同。原创 2025-10-15 16:16:57 · 767 阅读 · 0 评论 -
C#:函数默认参数
在方法声明中通过参数名=默认值形式定义,例如void Print(string msg="default")。调用时可省略有默认值的参数Print(),此时msg取值为"default"。C# 4.0引入默认参数特性,而早期版本需通过方法重载模拟,如定义无参构造函数调用this(默认值)3。C# 12进一步扩展支持lambda表达式的默认参数。默认参数必须从右向左连续定义,即某个参数有默认值后,其右侧所有参数必须都有默认值。3、 注意事项。原创 2025-10-15 16:14:20 · 342 阅读 · 0 评论
分享