C#中那些常用的工具类(Utility Class)(一)
代码越写越多,但是我们也需要经常去反思那些写过的代码,Utility Class就是这一类需要特别去反思总结的类,这些类像工具一样,我们经常通过一些静态方法,通过传入一些参数,然后得到我们需要的结果,在下面的一系列博客中,我们就一点一滴去反思这些类,并提供一个很好的方式去为他人提供方便,促进彼此之间的相互学习。
首先第一个介绍的就是ParseUtil这个静态类,在我们的代码中,我们经常需要去将string类型的字符串去做一个类型转换,比如说int,double,demical,float,DateTime、short、long甚至是byte数组类型,当我们转换失败时还可以提供一个默认值,这些值能够保证一定去返回这些正确的类型值。
这组代码的核心部分就是:
private static T ParseStringToType<T>(this string input, Func<string, T> action, T defaultvalue) where T : struct
{
if (string.IsNullOrEmpty(input))
{
return defaultvalue;
}
try
{
return action(input);
}
catch
{
return defaultvalue;
}
}
这段代码的核心部分就是通过传入一个Func<string, T>类型的委托去构建代码和算法的重用,这里涉及到一些重要的思想,一个是代码重用思想,另外就是体会到使用泛型参数T来真正地实现算法的重用机制,另外通过这个我们也可以横向比较Action、Func类型的委托以及匿名委托delegate的一些区别。
public static class ParseUtil
{
public static DateTime ParseByDefault(this string input, DateTime defaultvalue)
{
return input.ParseStringToType<DateTime>(delegate(string e)
{
return Convert.ToDateTime(input);
}, defaultvalue);
} public static decimal ParseByDefault(this string input, decimal defaultvalue)
{
return input.ParseStringToType<decimal>(delegate(string e)
{
return Convert.ToDecimal(input);
}, defaultvalue);
} public static double ParseByDefault(this string input, double defaultvalue)
{
return input.ParseStringToType<double>(delegate(string e)
{
return Convert.ToDouble(input);
}, defaultvalue);
} public static int ParseByDefault(this string input, int defaultvalue)
{
return input.ParseStringToType<int>(delegate(string e)
{
return Convert.ToInt32(input);
}, defaultvalue);
} public static long ParseByDefault(this string input, long defaultvalue)
{
return input.ParseStringToType<long>(delegate(string e)
{
return Convert.ToInt64(input);
}, defaultvalue);
} public static float ParseByDefault(this string input, float defaultvalue)
{
return input.ParseStringToType<float>(delegate(string e)
{
return Convert.ToSingle(input);
}, defaultvalue);
} public static float ParseByDefault(this string input, short defaultvalue)
{
return input.ParseStringToType<short>(delegate(string e)
{
return Convert.ToInt16(input);
}, defaultvalue);
} public static string ParseByDefault(this string input, string defaultvalue)
{
if (string.IsNullOrEmpty(input))
{
return defaultvalue;
}
return input;
} private static T ParseStringToType<T>(this string input, Func<string, T> action, T defaultvalue) where T : struct
{
if (string.IsNullOrEmpty(input))
{
return defaultvalue;
}
try
{
return action(input);
}
catch
{
return defaultvalue;
}
}
}
另外在传入参数input之前为什么还需要传递this?这个该如何去准确理解呢?
这就涉及到C# this扩展方法的内容了......
扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 扩展方法当然不能破坏面向对象封装的概念,所以只能是访问所扩展类的public成员。
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用,C#扩展方法第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。
就像上面的方法中,input是一个string类型的对象,但是 ParseStringToType这个方法是我们自己定义的一个静态方法,String类中是不存在该方法的,是我们人为去扩展的一个方法,下面举出一个相同的例子:
//必须是静态类才可以添加扩展方法
Static class Program
{
static void Main(string[] args)
{
string str = "quzijing";
//注意调用扩展方法,必须用对象来调用
string Newstr = str.Add();
Console.WriteLine(Newstr);
Console.ReadKey();
}
//声明扩展方法
//扩展方法必须是静态的,Add有三个参数
//this 必须有,string表示我要扩展的类型,stringName表示对象名
//三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,//再增加一个变量即可 public static string Add(this string stringName)
{
return stringName+"a";
}
}
既然string类可以通过这种方式来扩展方法,那么我们定义的一般类呢?答案也是可以的。
给自定义的类型增加一个扩展方法,并增加一个传递的参数
(1)、声明一个Student类,它包含了两个方法StuInfo,getStuInfo

public class Student
{
public string StuInfo()
{
return "学生基本信息";
}
public string getStuInfo(string stuName, string stuNum)
{
return string.Format("学生信息:\\n" + "姓名:{0} \\n" + "学号:{1}", stuName, stuNum);
}
}
(2)、声明一个名为ExtensionStudentInfo的静态类,注意必须为静态
这个类的作用就是包含一些我们想要扩展的方法,在此我们声明两个Student类型的扩展方法,Student类型为我们自定义的类型。
public static class ExtensionStudentInfo
{
//声明扩展方法
//要扩展的方法必须是静态的方法,Add有三个参数
//this 必须有,string表示我要扩展的类型,stringName表示对象名
//三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,再增加一个变量即可
public static string ExtensionStuInfo(this Student stuName)
{
return stuName.StuInfo();
}
//声明扩展方法
//要扩展的方法必须是静态的方法,Add有三个参数
//this 必须有,string表示我要扩展的类型,stringName表示对象名
//三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,在此我们增加了两个string类型的参数
public static string ExtensionGetStuInfo(this Student student, string stuname, string stunum)
{
return student.getStuInfo(stuname, stunum)+"\\n读取完毕";
}
}
下面来建一个测试的应用程序来看看输出的结果

static void Main(string[] args)
{
Student newstudent = new Student();
//要使用对象调用我们的扩展方法
string stuinfo = newstudent.ExtensionStuInfo();
Console.WriteLine(stuinfo);
//要使用对象调用我们的扩展方法
string stuinformation = newstudent.ExtensionGetStuInfo("张三", "001");
Console.WriteLine(stuinformation);
Console.ReadKey();
}
获取的结果是:

最后借用网上的一个例子来结束这一内容的介绍。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
//声明扩展方法的步骤:类必须是static,方法是static,
//第一个参数是被扩展的对象,前面标注this。
//使用扩展方法的时候必须保证扩展方法类已经在当前代码中using
namespace 扩展方法
{ //扩展方法必须是静态的
public static class StringHelper
{
//扩展方法必须是静态的,第一个参数必须加上this
public static bool IsEmail(this string _input)
{
return Regex.IsMatch(_input, @"^\\w+@\\w+\\.\\w+$");
} //带多个参数的扩展方法
//在原始字符串前后加上指定的字符
public static string Quot(this string _input, string _quot)
{
return _quot + _input + _quot;
} } }
通过扩展类,我们可以为string类扩展一些原先不太需要的方法来完成我们的需求。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 扩展方法
{
class Program
{
static void Main(string[] args)
{
string _myEmail = "abc@163.com";
//这里就可以直接使用string类的扩展方法IsEmail了
Console.WriteLine(_myEmail.IsEmail());
//调用接收参数的扩展方法
Console.WriteLine(_myEmail.Quot("!"));
Console.ReadLine();
} } }
就像我们的ParseUtil类定义的那样,我们可以通过定义string str,然后通过str.ParseByDefault(0D)直接将我们将string直接转化为double类型,而不用在每个地方都重复去写代码,这些都需要我们不断去反思总结代码,代码才能越写越好;
C#中那些常用的工具类(Utility Class)(一)的更多相关文章
- C# 中那些常用的工具类(Utility Class)(二)
今天按照这一年来经常用到的那些静态的工具类再来做一次总结,这些小的工具来可以作为自己学习的很好的例子,通过总结这些东西,能够很大程度上梳理自己的知识体系,当然这个是经常用到的,接下来就一个个去分析这些 ...
- C# 中那些常用的工具类(Utility Class)(三)
今天来接着写这个系列的文章,这一篇主要是用来介绍关于C#中的XML序列化的问题,这个相信大家一定会经常使用它,特别是在WPF中,有时候我们需要将我们后台的数据保存在数据库中,从而在软件下一次启动的时候 ...
- commons-collections包中的常用的工具类
commons-collections包中的常用的工具类 <dependency> <groupId>commons-collections</groupId> & ...
- Hutool中那些常用的工具类和方法
Hutool中那些常用的工具类和方法 Hutool是一个Java工具包,它帮助我们简化每一行代码,避免重复造轮子.如果你有需要用到某些工具方法的时候,不妨在Hutool里面找找,可能就有.本文将对Hu ...
- Android常用的工具类
主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils. Prefe ...
- Android常用的工具类(转)
主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefer ...
- 2013最新Android常用的工具类整理
主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils. Pref ...
- Java语言Lang包下常用的工具类介绍_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都 ...
- Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源,BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 各种后台管理系统
Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 家庭理财系统 各种后 ...
随机推荐
- pip freeze 打包依赖库及setup.py
需要打包的工程目录下使用命令: pip freeze > requirements.txt 就会在pip目录生成 requirements.txt 文件,该文件内就是当前环境所安装的所有扩展包打 ...
- 在Ubuntu18.04上使用Anaconda
启动Anaconda Navigator 图形化界面 $ source ~/anaconda3/bin/activate root $ anaconda-navigator 查看目前的conda版本: ...
- [ZJOI2018]胖
嘟嘟嘟 都说这题是送分题,但我怎么就不觉得的呢. 看来我还是太弱了啊-- 大体思路就是对于每一个设计方案,答案就是每一个关键点能更新的点的数量之和. 关键在于怎么求一个关键点能更新那些点. 首先这些点 ...
- CMake 常用方法
CMake 允许开发者编写平台无关的 CMakeLists.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Linux 的Makefi ...
- [MicroPython]TPYBoard开发板DIY小型家庭气象站
对于喜欢登山的人来说,都会非常关心自己所处的高度跟温度,海拔高度的测量方法,海拔测量一般常用的有两种方式,一是通过GPS全球定位系统,二是通过测出大气压,根据气压值算出海拔高度. BMP180是一直常 ...
- Java hashCode() equals()总结
1.hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的: 2.如果两个对象相同,就是适用于equals(j ...
- .NET(C#)主流ORM总揽
前言 在以前的一篇文章中,为大家分享了<什么是ORM?为什么用ORM?浅析ORM的使用及利弊>.那么,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper, ...
- Linux Namespace : Network
Network namespace 在逻辑上是网络堆栈的一个副本,它有自己的路由.防火墙规则和网络设备.默认情况下,子进程继承其父进程的 network namespace.也就是说,如果不显式创建新 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 访问记录功能改进
当用户数据非常庞大时需要一个功能,就是统计各种账户的访问系统的情况,用户数量的各种参数需要让管理者心里有个数. 1:信息系统中有多少有效账户?可以很方便能知道具体个数,让管理者心里有个数. 2:某个公 ...
- 几何学观止(Lie群部分)
上承这个页面,这次把Lie群的部分写完了 几何学观止-微分几何部分(20181102).pdf 我觉得其他部分(尤其是代数几何部分)我目前没有把握写得令自己满意,总之希望在毕业前能写完吧. 这次调整了 ...