C#编码简单性之泛型篇(如何编写简短的C#代码,随时更新)

C#泛型集合及应用:List<T>、HashSet<T>、Dictionary<TKey, TValue>、SortedList<TKey, TValue>、Stack<T>、Queue<T> 要使用泛型集合,需要使用尖括号(例如 List)定义它们,并指定它们将包含的对象的类型。然后,可以使用该集合的属性和方法在代码中操作其元素。//.NET8.0直接为://.NET8.0会提示你直接使用集合添加简化初始化"Hello","World",进一步地,还可以使用泛型集合来实现算法和数据结构,例如排序和搜索。 阅读详情

作者:陈勇

出处:blog.youkuaiyun.com/cheny_com

这是编码简单性系列中的其中一篇,之前几篇包括代码篇/函数篇/语义篇。 因为要积累案例,会随时更新。

 

之前提到:编码简单性的“心法”就是:只要屏幕上有任何两部分代码看上去相似,则一定有合并办法。而说起相似,没有比switch - case的各段代码更相似的了。如果细数一下自己产品中最长的函数,里边几乎肯定的有一个switch - case,或者一堆if -else if(两者其实等同)。一般各段代码看似相同,又有点不同,既不能变成函数,也不能变成类,怎么办呢?

解决臭长的switch-case的最好方法,就是泛型(在C++时代叫做模板)。泛型不好学,但是却很重要。02年左右的时候曾经作为过程改进人员进行代码审查,无意中发现一段在pagedown的时候做波浪状起伏的代码,观察发现其中有65个函数其实可以缩减为1个函数(没错,65:1),其内容是在5种int常数下,处理13种不同的变量,而处理方法完全相同。这段代码共有4000行,已经耗时一个月,编程者月薪7000(那是10年前,7000元可以购买5平米小产权房,或2平米大产权房);当天下午它们就变成了1个函数,长度不足55行。据此推断,每年因为不能灵活使用泛型而造成的经济损失,可能达到亿元以上。


案例1 2011-05-27 一个简单泛型类

下面一段代码很简短,显得很不值得改造,但其实除了Display之外还有很多函数,其中一些case体很长,而且各种type日后层出不穷,因此不得不进行改造。

Display的目的,是让各种各样的udc们以自己的方式显示器Value中的数值:

        
public static MvcHtmlString Display(this HtmlHelper htmlHelper, UDC udc)
        {
            switch (udc.Type)
            {
                case "Text100":
                    return new MvcHtmlString((udc.Value != null) ? udc.Value.ToString() : "NULL");
                case "Text20":
                    return new MvcHtmlString((udc.Value != null) ? udc.Value.ToString() : "NULL");
                case "Date":
                    return new MvcHtmlString(((DateTime)udc.Value).ToShortDateString());
                default: return new MvcHtmlString(string.Format("Unknown UDC type: {0}", udc.Type));
            }
        }


为了能够拆开这个函数,需要声明

    
public interface IUDC
    {
        ……

        MvcHtmlString Display { get; }
        ……

    }


然后让一个类(这个类一般都存在了)继承这个接口,并实现其方法:

    
public partial class UDCText100 : IUDC 
    {
        ……

        public MvcHtmlString Display { get { return new MvcHtmlString((Value != null) ? Value.ToString() : "NULL"); } }
        ……

    }


而显示方式也从@Html.Display(udc)变成@udc.Display。

这段代码整个修改后,原来的5个switch-case只剩下1个,代码明显更内聚了,也就是每次增加一个类型,基本只需要在一个地方(partial class)内完成修改,就可以了;修改的成果在编译时就能确认是否充分和正确(而在其中switch-case中漏掉一个类型,只有在运行的时候case找不到才知道)。


 案例2 2011-05-29 泛型函数

        
private IUDC GetOrDefaultUDC<T, V>(Table<T> table, ..., V defaultValue) where T : class, IUDC, new()
        {
            var t = table.SingleOrDefault(...);
            if (t == null)
            {
                t = new T();
                ...
                t.OValue = defaultValue; 
                ...

            }
            return t;
        }


这个泛型函数从一类表中取出一条记录,如果没有,则创建它。由于创建的时候需要new 一个新的纪录,而且新纪录依据table的不同,某些字段的缺省值也不同。用传统的方法需要编写很多函数,而且每当出现一种新的这类表,又需要编写新的函数。本文开头提到的的那个65个函数就是因此而产生的。

处理这类情况的心法是:如果发现由于类型的差异一些看起来很像的代码无法合并为函数,那么就应该用泛型了。

这种情况下用泛型需要掌握两种主要技术:new()和Ixxx(某Interface)。new的目的是让T可以创建(如果函数中不创建就不需要了),而Interface的目的是保证编译时刻就能确保未来的新类型依然可以使用这个函数(C++的时代只有用到新的类型的时候才可以确认)。


 

这里只谈泛型的应用思想,关于泛型的应用技术,在MSDN有一篇很好的文章可供参考:http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx。此文将整个C#泛型的发展历程从头到尾讲了一遍。

 

点击下载免费的敏捷开发教材:《火星人敏捷开发手册》

 

Unity XLua(九)Lua调用C#泛型参数方法+调用泛型方法的方法+泛型方法 C# using System.Collections; using System.Collections.Generic; using UnityEngine; using XLua; using System.IO; using System.Text; using UnityEngine.UI; public class TestXLua : MonoBehaviour { LuaEnv lua; void Start() { lua = new Lu. 阅读详情

相关推荐

【STM32Cube HAL】输入捕获(六)——脉宽测量

1

HAHAHA 4908

C# 中泛型编程之泛型类、泛型方法、泛型约束详解

类型Type现在可以表示带有特定类型的实参(或绑定类型)或未指定类型的泛型(或称未绑定类型)。委托级别的约束只在声明委托变量和实例化委托时使用,类似于在类型和方法的作用范围中实施的其他任何约束。同时子类中的泛型方法不能重复基类泛型方法的约束,这一点和泛型类中的虚方法重写是有区别的,代码如下。////错误 重写和显式接口实现方法的约束是从基方法继承的,因此不能直接指定这些约束。类型参数必须具有无参数的公共构造函数。3.在子类重复基类的约束(在使用子类泛型参数时,必须在子类级别重复在基类级别规定的任何约束)

u011555996的博客 2886

从入门到精通:激光器恒流驱动电路的设计与选型指南

本文深入解析了激光器恒流驱动电路的设计与选型。文章从基础电路原理讲起,对比了简易恒流源与高精度运放反馈方案的优劣,并重点阐述了如何为不同功率与精度要求的激光器项目选择合适的恒流驱动方案,强调了恒流源对于保障激光器稳定工作、防止热失控及延长寿命的核心作用。

grafana6viz的博客 711

C#中泛型

文章目录泛型泛型类泛型方法泛型的实例化理论泛型与object泛型类中的数据约束 泛型 在写程序时,若需要处理的数据类型不同,但算法相同时,这时候需要用到泛型。泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 泛型类 泛型类:定义一个类,这个类中某些字段的类型不确定,这些类型可以在类构造的时候确定下来。 c...

空空的脑袋 5073

张正友标定法-MATLAB实验

该方法最早由微软研究院的Zhengyou Zhang教授提出,1998年发表在IEEE TRANSACTIONS ON PATTERNANALYSIS AND MACHINE INTELLIGENCE,论文题目为:AFlexible New Technique for Camera Calibration。 (一)标定平面到图像平面的单应性 单应性(homography):在计算机视觉中被定义

qq_37845624的博客 8289

【Bug已解决】Codex CLI 报错 apply_patch 失败:无法应用补丁的解决方案

方案适用场景推荐指数统一换行符规范跨平台协作项目的标准配置⭐⭐⭐⭐⭐关闭自动格式化冲突IDE 与 Codex 并发编辑同一文件⭐⭐⭐⭐缩小任务改动范围长期有效的使用习惯优化⭐⭐⭐⭐⭐统一 UTF-8 编码涉及非 UTF-8 遗留文件的项目⭐⭐⭐提示重新读取文件单次失败后的快速恢复方式⭐⭐⭐⭐报错的本质是Codex 生成补丁时读取的文件内容,与实际应用补丁时磁盘上的文件内容出现了不一致,常见诱因包括换行符风格混用、文件被其他工具并发修改、编码问题等。

一键难忘的博客 7302

USB gadget driver framework

USB gadget driver的框架可分为三部分:UDC-core, composite.c and android.c,其中 composite.c是核心,其他两部分都要bind 到 composit上。 1. UDC-core 结构体usb_gadget中包含指向usb_ep的link head,通过该link head,可以访问 所有的usb_ep, usb_ep中包含了具体的,最

u011279649的专栏 3787

基于Simulink的永磁同步电机容错控制(缺相容错)

本文基于Simulink平台,详细介绍了永磁同步电机(PMSM)缺相容错控制的仿真实现方法。针对逆变器开路故障导致的缺相问题,提出"检测-重构-补偿"三阶段控制策略:采用电流阈值法快速检测故障(<5ms),重构αβ坐标系实现两相矢量控制,并通过谐波电流注入抑制转矩脉动(<8%)。仿真结果表明,该方法能有效维持故障后电机运行,转速波动<3%,满足电动汽车等关键应用的可靠性需求。文章包含完整的Simulink建模步骤、MATLAB函数代码及参数设置,为工程实践提供了可复现的

xiaoheshang_123的博客 146

C#泛型编程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33711641的博客 469

hwasan实例分析踩内存之一:camx进程stack tag-mismatch的三种解决方案

hwasan实例分析踩内存之一:camx进程stack tag-mismatch的三种解决方案。

1291

Python 爬虫实战:爬取豆瓣电影 Top250 完整数据

本文基于Python技术实现了豆瓣电影Top250榜单数据的合规爬取与分析。针对豆瓣电影页面的分页结构、反爬机制等特点,采用requests库获取数据,结合BeautifulSoup解析HTML节点,并通过正则表达式提取电影名称、评分、导演等核心字段。爬虫实现了随机User-Agent、请求间隔控制等反爬规避策略,严格遵守豆瓣社区使用规范。最终数据经清洗后存储为结构化Excel文件,并提供了数据可视化与增量更新方案。该方案为影视研究提供了可靠的数据获取方法,同时确保符合非商业使用、适度爬取等合规要求。

2503_91057718的博客 3460

C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托

泛型集合和ArrayList的装箱拆箱、常见的泛型类型、泛型类和泛型方法、泛型约束、 泛型委托泛型很难理解?不然在接触的一个新的概念的时候,总会感觉难以理解,当你掌握并能熟练地使用的时候,发现这个概念其实简单的,我相信大多数码农都会有这种似曾相识的感觉。可能大多数人刚学习泛型的时候觉得很难理解,当然我也是这样的,所以便写下这篇文章加深一下对泛型的印象。

dotNet全栈开发 4万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C#编码简单性之代码篇(如何编写简短的C#代码,随时更新)

以前写C++的时候曾经在自己网站上发表过一个编码“简单性”之文章,现在编写C#了才发现自己无意之间就会写下一些浪费屏幕的代码。下面是自己编码中偶然发现的一些案例,欢迎中等水平的编程者参考。因为要积累案例,所以随时更新。编码简单性的“心法”就是:只要屏幕上有任何两部分代码看上去相似,则一定有合并办法。无论在微观还是宏观层面上这一点都适合。在02年的时候,我们曾在2小时内把一个程序员的400...

diaogan4202的博客 414

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C#编码简单性之语义篇(如何编写简短的C#代码,随时更新)

以前写C++的时候曾经在自己网站上发表过一个编码“简单性”之文章,现在编写C#了才发现自己无意之间就会写下一些浪费屏幕的代码。下面是自己编码中偶然发现的一些案例,欢迎中等水平的编程者参考。因为要积累案例,所以随时更新。--------------------------------------------------------------------------------从语义角度看...

diaogan4202的博客 202

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C#编码简单性之函数篇(如何编写简短的C#代码,随时更新)

作者:陈勇出处:blog.youkuaiyun.com/cheny_com这是编码简单性系列中的其中一篇,之前几篇包括代码篇和语义篇。因为要积累案例,会随时更新。之前提到:编码简单性的“心法”就是:只要屏幕上有任何两部分代码看上去相似,则一定有合并办法。但在代码层面,无论如何简化,都常常剩下一堆相似代码,这时候就需要编写函数了。这里指的函数,包括HtmlHelper这类用C#解决Html的函数。...

diaogan4202的博客 254

C#想要提升代码复用性与灵活性?泛型编程基础!!

泛型是程序设计语言的一种特性,它允许程序员在类、接口或方法创建时,不指定具体的数据类型。在编译时或运行时将具体的数据类型作为参数传入。这样做的好处是,可以编写与数据类型无关的代码,同时保持类型安全。在 C# 中,泛型类型(如类、接口、委托和结构体)通过将类型参数化来工作,这些类型参数在声明时未指定,但在实例化时会被具体的类型所替换。确保你的实体类(如Product和Category)已经定义好,并且它们遵循Entity Framework的约定(比如,主键通常命名为Idset;set;set;

Asuna666w的博客 3030

[代码积累]C#中泛型缓存的简单实现

软谋补课中,Eleven老师讲到泛型的使用技巧:泛型缓存,刚好自己项目中也有用到缓存系统参数表的信息,之前都是直接读取表数据,每个需要缓存的表需要创建一个静态类,不利于扩展,这里将Eleven老师讲的泛型缓存简单的拓展了一下,可以根据版本信息更新缓存,不多说直接上代码: /// /// 使用泛型实现缓存: /// 区别于之前用字典或静态变量存储缓存,这里不同类型的“T”

hd2y的博客 4596
上一篇: JQuery怎么知道一个元素是否隐藏或显示How do you test if something is hidden in jQuery?
下一篇: Windows7 Home高级 64 中文版 + TortoiseSVN 64 英文版 + SVN Server 32 英文版安装过程
火星人陈勇
博客等级 码龄18年 4899粉丝 381原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值