C#编程技巧--2
1.使用泛型: 泛型允许你编写更加灵活和可重用的代码,同时提高类型安全性。
C# 中的泛型功能允许你编写更加灵活和可重用的代码,并且可以增加类型安全性。通过使用泛型,你可以编写适用于不同类型的代码,而无需为每种类型单独重写代码。
以下是一个简单的示例,展示了如何使用泛型来创建一个通用的集合类:
using System;
using System.Collections.Generic;class Program
{static void Main(string[] args){List<int> numbers = new List<int>();numbers.Add(1);numbers.Add(2);numbers.Add(3);List<string> names = new List<string>();names.Add("John");names.Add("Jane");names.Add("Alice");PrintList(numbers);PrintList(names);}static void PrintList<T>(List<T> list){foreach (T item in list){Console.WriteLine(item);}}
}
在这个示例中,我们定义了一个泛型方法 PrintList<T>
。这个方法接受一个泛型列表作为参数,并遍历打印出列表中的每个元素。我们首先创建了一个 List<int>
,然后创建一个 List<string>
,并分别调用了 PrintList
方法来打印它们的内容。
通过使用泛型,我们可以将方法 PrintList
应用于不同类型的列表,而无需为每个类型编写单独的方法。这使得代码更加灵活和可重用,同时保持类型安全。
除了泛型方法外,C# 还支持泛型类和泛型接口,允许你在其他方面使用泛型来提高代码的灵活性和可重用性。使用泛型可以减少类型转换的需要,并提供了更好的代码组织和类型安全的保证。
2.异常处理: 有效的异常处理是编写健壮软件的关键。学会处理异常并进行适当的日志记录和错误处理。
有效的异常处理对于编写健壮的软件至关重要。异常处理可以帮助我们识别和处理程序中出现的错误,并采取适当的措施来解决问题或提供错误反馈。
以下是一些关于异常处理的最佳实践:
(1)对异常进行适当处理:在可能引发异常的代码块中使用 try-catch 块来捕获异常。这样可以防止异常的传播,并允许你在异常出现时执行特定的处理逻辑。
try
{// 可能引发异常的代码
}
catch (Exception ex)
{// 异常处理逻辑// 例如,记录异常信息到日志、显示错误消息给用户等
}
(2)使用多个 catch 块进行不同类型异常的处理:捕获特定类型的异常,并提供相应的处理逻辑。这有助于更好地理解和处理不同类型的异常情况。
try
{// 可能引发异常的代码
}
catch (DivideByZeroException ex)
{// 处理除以零异常
}
catch (FileNotFoundException ex)
{// 处理文件不存在异常
}
catch (Exception ex)
{// 处理其他类型的异常
}
(3)抛出自定义异常:在某些情况下,你可能需要在代码中手动抛出异常。这可以帮助你在特定条件下引发异常,并允许上层代码进行相应的处理。
if (someCondition)
{throw new CustomException("Something went wrong.");
}
(4)记录异常信息到日志:在捕获异常时,将相关信息记录到日志文件中,以供后续的错误分析和故障排除。可以使用日志框架(如log4net、Serilog等)来实现日志记录功能。
catch (Exception ex)
{// 记录异常信息到日志logger.Error(ex, "An error occurred.");
}
(5)提供有意义的错误信息给用户:在处理异常时,确保向最终用户提供有用和清晰的错误信息,以帮助他们理解和解决问题。
catch (CustomException ex)
{// 显示错误消息给用户MessageBox.Show("An error occurred: " + ex.Message);
}
通过有效的异常处理,我们可以提高软件的健壮性,并优雅地处理各种错误和异常情况。这样可以改善用户体验,并提供更好的故障排除和问题解决支持。
3.使用面向对象设计原则: 例如 SOLID 原则,帮助你编写可维护、可扩展和可测试的代码。
使用面向对象设计原则如 SOLID 原则可以帮助你编写可维护、可扩展和可测试的代码。SOLID 是一组五个面向对象设计原则的缩写,包括:
-
单一职责原则 (Single Responsibility Principle, SRP):一个类应该只有一个引起变化的原因。换句话说,一个类应该只负责一项功能或任务。
-
开放-封闭原则 (Open-Closed Principle, OCP):软件实体(类、模块、函数等)应该对扩展是开放的,但对修改是封闭的。这意味着应该通过扩展现有的代码来实现新功能,而不是修改现有代码。
-
里氏替换原则 (Liskov Substitution Principle, LSP):子类型必须能够替换其基类型(父类)而不影响程序的正确性。换句话说,派生类应该能够替换其基类并且表现正常。
-
接口隔离原则 (Interface Segregation Principle, ISP):客户端不应该强制依赖于它们不使用的接口。应该将接口设计得尽可能小,并且为特定客户端提供专门的接口。
-
依赖倒置原则 (Dependency Inversion Principle, DIP):高层模块不应该依赖于低层模块,而是应该依赖于抽象。具体来说,应该通过接口或抽象类来定义依赖关系,而不是直接依赖具体实现。
遵循这些原则可以使代码更加灵活、可维护和可扩展,同时降低代码的耦合度,提高代码的可测试性。通过将代码组织为符合这些原则的结构,可以更轻松地进行功能扩展、代码重用和维护。
相关文章:
C#编程技巧--2
1.使用泛型: 泛型允许你编写更加灵活和可重用的代码,同时提高类型安全性。 C# 中的泛型功能允许你编写更加灵活和可重用的代码,并且可以增加类型安全性。通过使用泛型,你可以编写适用于不同类型的代码,而无需为每种类型单独重写代…...

设计模式 代理模式
代理模式主要使用了 Java 的多态,主要是接口 干活的是被代理类,代理类主要是接活, 你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢? 同根就成ÿ…...
关于学习时间
这篇文章我来说一下我对于我最近学习时间的一些思考。 早上和下午是我最为活跃和高效的时间段。 我能够专注地工作,不容易分心。 然而,到了晚上,我的状态开始下降,这是很正常的情况。 由于早上和下午的专注学习,我的大…...

Github:Your browser did something unexpected. Please try again.
问题概述 Github:Your browser did something unexpected. Please try again. If the error continues, try disabling all browser extensions. 问题原因: 提示是插件出了问题,关闭了所有插件也无法解决,搜索了一下说是VPN的问题…...
Django性能优化
1.服务器CPU太高的优化 在Django项目中使用line_profiler进行性能剖析,您需要遵循以下步骤来设置并使用它: 1. **安装line_profiler**: 在命令行中执行以下命令来安装line_profiler: pip install line_profiler …...

全网最详细Docker命令(分类总结)
默认存储容器地址 cd /var/lib/docker 容器生命周期 Docker 命令 开启docker : systemctl start docker 查看docker状态 :systemctl status docker 停止:systemctl stop docker 重启: systemctl restart docker docker开机自启…...

运维自动化之ANSIBLE
一、Ansible的发展史及功能 官网:https://www.ansible.com/ 官方文档:https://docs.ansible.com/ 1、Ansible功能 2、Ansible特性 批量执行远程命令,可以对远程的多台主机同时进行命令的执行 批量安装和配置软件服务,可以对远程的多台主机…...
算法训练day42leetcode01背包问题 416. 分割等和子集
01 背包 题目描述 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 题目分析 每一件物品其实只有两个状态,取或者不取&…...

VulnHub - DarkHole
希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢! 个人博客链接:CH4SER的个人BLOG – Welcome To Ch4sers Blog DarkHole 靶机下载地址:DarkHole: 1 ~ VulnHub 0x01 信息收集 Nmap扫描目标主机…...

前端学习笔记 | WebAPIs(DOM+BOM)
一、作用和分类 1、基本概念 作用:使用JS去操作HTML和浏览器 分类:DOM(文档对象模型)和BOM(浏览器对象模型) html的标签JS的DOM对象 2、获取DOM对象-参数必须加引号 (1)选择匹配的第…...
简易内存池(100%用例)C卷(JavaPythonC++Node.jsC语言)
请实现一个简易内存池 , 根据请求命令完成内存分配和释放。 内存池支持两种操作命令,REQUEST和RELEASE,其格式为: REQUEST=请求的内存大小 表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;如果内存不足,或指定的大小为 0 ,则输出error。 RELEASE=释放的…...

【算法与数据结构】队列的实现详解
文章目录 📝队列的概念及结构🌠 队列的顺序实现🌉初始化🌠入队🌉出队🌠获取队列首元素🌉获取队列尾部元素🌠获取队列中有效元素个数🌉 队列是否为空🌠查看队列…...
GPT-3后的下一步:大型语言模型的未来方向
摘要: 本文将概述GPT-3后的下一步:大型语言模型的未来方向,包括技术发展趋势、应用场景、挑战与机遇。 引言: GPT-3是OpenAI于2020年发布的一款大型语言模型,它在自然语言处理领域取得了突破性进展。GPT-3的出现标志…...

基于机器学习的曲面拟合方法
随着科技的不断发展,机器学习成为了最近最热门的技术之一,也被广泛应用于各个领域。其中,基于机器学习的曲面拟合方法也备受研究者们的关注。曲面拟合是三维模型处理中的重要技术,其目的是用一组数据点拟合出平滑的曲面࿰…...

【C++从练气到飞升】03---构造函数和析构函数
🎈个人主页:库库的里昂 ✨收录专栏:C从练气到飞升 🎉鸟欲高飞先振翅,人求上进先读书。 目录 ⛳️推荐 一、类的6个默认成员函数 二、构造函数 1. 构造函数的概念 2. 构造函数的定义 3. 构造函数的特性 三、析构函…...
mybatis转义字符
编写SQL中会用到<,>,<,> 等,但是在mybatis中不可以这么写,与xml文件的元素<>冲突,所以需要转义。整理转义字符如下: 符号原始字符转义字符大于>>大于等于>>小于<<小于等于<<和&&a…...

vue3 实现一个tab切换组件
一. 效果图 二. 代码 文件 WqTab.vue: <template><div ref"wqTabs" class"wq-tab"><template v-for"tab in tabs" :key"tab"><div class"tab-item" :class"{ ac: tabActive tab.key }" c…...

JSONObject在Android Main方法中无法实例化问题
目录 前言一、Main(非安卓环境)方法下运行二、安卓坏境下运行三、why? 前言 原生的json,即org.json.JSONObject; 在Android Studio中的Main方法里运行报错,但在安卓程序运行过程正常 一、Main(非安卓环境)方法下运行 static void test() {try {// 创建一个 JSON …...

京津冀协同发展:北京·光子1号金融算力中心——智能科技新高地
京津冀协同发展是党中央在新的历史条件下提出的一项重大国家战略,对于全面推进“五位一体”总体布局,以中国式现代化全面推进强国建设、民族复兴伟业,具有重大现实意义和深远历史意义。随着京津冀协同发展战略的深入推进,区域一体…...
aspnetcore使用jwt时一直提示401 authorization
测试aspnetcore使用Jwt做认证授权的时候,一直提示401 Authorization 最后发现问题所在,希望能有所帮助 1.检查注册了认证和授权中间件 缺一不可 /*认证*/app.UseAuthentication();/*授权*/app.UseAuthorization();2.检查swagger的配置项 builder.Servic…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...