参数的输入和验证问题是开发时经常遇到的,一般的验证方法如下:

public bool Register(string name, int age)
{
if (string.IsNullOrEmpty(name))
{
throw new ArgumentException("name should not be empty", "name");
}
if (age < || age > )
{
throw new ArgumentException("the age must between 10 and 70","age");
}
//...
}

这样做当需求变动的时候,要改动的代码相应的也比较多,这样比较麻烦,最近接触到了Java和C#下2种方便的参数验证方法,简单的介绍下。

Java参数验证:

采用google的guava下的一个辅助类:

import com.google.common.base.Preconditions;

示例代码:

    public static void checkPersonInfo(int age, String name){
Preconditions.checkNotNull(name, "name为null");
Preconditions.checkArgument(name.length() > 0, "name的长度要大于0");
Preconditions.checkArgument(age > 0, "age必须大于0");
System.out.println("a person age: " + age + ", name: " + name);
} public static void getPostCode(String code){
Preconditions.checkArgument(checkPostCode(code),"邮政编码不符合要求");
System.out.println(code);
} public static void main(String[] args) {
try {
checkPersonInfo(10,"fdsfsd");
checkPersonInfo(10,null);
checkPersonInfo(-10,"fdsfsd");
getPostCode("012234"); } catch (Exception e) {
e.printStackTrace();
}
}

当参数不满足要求的时候,抛出异常信息,异常中携带的信息为后面自定义的字符串,这样写就方便多了。

C#参数验证:

采用FluentValidation这个类库,参考地址在下面。

使用方法:

一个简单的Person类:

    public class Person
{
public string Name { set; get; } public int Age { set; get; } public Person(string name, int age)
{
Name = name;
Age = age;
}
}

Person的验证类:

    public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
RuleFor(x => x.Name).NotEmpty().WithMessage("姓名不能为空");
RuleFor(x => x.Name).Length(,).WithMessage("姓名字符不能超过50");
RuleFor(x => x.Age).GreaterThan().WithMessage("年龄必须要大于0");
} private bool ValidName(string name)
{
// custom name validating logic goes here
return true;
}
}

使用:

    class Program
{
static void Main(string[] args)
{
Person customer = new Person(null,-);
PersonValidator validator = new PersonValidator();
ValidationResult results = validator.Validate(customer); bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors;
foreach (var failure in failures)
{
Console.WriteLine(failure.ErrorMessage);
} Console.ReadKey();
}
}

FluentValidation的使用文档:http://fluentvalidation.codeplex.com/documentation

参考资料:

http://fluentvalidation.codeplex.com/

https://github.com/JeremySkinner/FluentValidation

Java和C#下的参数验证的更多相关文章

  1. JAVA中通过Hibernate-Validation进行参数验证

    在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而hibernate-validator提供了一些常用的参数校验注解,我们可以拿来使用.1.maven中引入hibernate- ...

  2. spring boot参数验证

    必须要知道 简述 JSR303/JSR-349,hibernate validation,spring validation 之间的关系 JSR303 是一项标准,JSR-349 是其的升级版本,添加 ...

  3. C# 中参数验证方式的演变

    一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...

  4. C# 中参数验证方式

    C# 中参数验证方式 一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空, ...

  5. 实现一个可配置的java web 参数验证器

    当使用java web的servlet来做接口的时候,如果严格一点,经常会对请求参数做一些验证并返回错误码.我发现通常参数验证的代码就在servlet里边,如果参数不正确就返回相应的错误码.如果接口数 ...

  6. Java中的参数验证(非Spring版)

    1. Java中的参数验证(非Spring版) 1.1. 前言 为什么我总遇到这种非正常问题,我们知道很多时候我们的参数校验都是放在controller层的传入参数进行校验,我们常用的校验方式就是引入 ...

  7. Java工具类——通过配置XML验证Map

    Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...

  8. 参数验证 @Validated 和 @Valid 的区别

    来源:blog.csdn.net/qq_27680317/article/details/79970590 整编:Java技术栈(公众号ID:javastack) Spring Validation验 ...

  9. 自研后端HTTP请求参数验证器服务ParamertValidateService

    好处:方便了后端对HTTP请求中参数进行核验,只需一次编写效验器,一行代码便可对所有参数的pojo进行参数核验!而且更改效验逻辑时只需要更改效验器类即可,实现了解耦合. 只需要程序员按照规范开发一个P ...

随机推荐

  1. UIDynamic(重力行为+碰撞检测)

    一.重力行为 说明:给定重力方向.加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化 - (instancetype)initWithItems:(NSArra ...

  2. ORB-SLAM(二)性能

    ORB-SLAM程序提供了运行Monocular.Stereo和RGBD数据的程序.编译成功后,可以通过运行TUM的标准数据来验证程序是否成功.如果想自己测试一些数据,可以通过OpenCV提供的接口调 ...

  3. mui日期插件$, each遍历,EventListener事件监听,json格式

    (function($) { $.init(); var result = $('#result')[0]; var btns = $('.btn'); btns.each(function(i, b ...

  4. ResourceManager里面Trackingui需要手动该ip

    C:\Windows\System32\drivers\etc 这个路径下配置了ip和主机名,不过是大小写,ping不同,不论ping大小写还是全部小写都不行,我看地址栏是小写所以想着把hosts里C ...

  5. mysql中now()函数的使用,还有oracle的sysdate,可能埋下的坑

    mysql中now()函数的使用,还有oracle的sysdate 在需求中如果系统中药添加当前操作的时间那么很简单的一个操作在写sql的时候直接在这个字段对应的位置写上now()函数就可以了,这样就 ...

  6. 【poj1694】 An Old Stone Game

    http://poj.org/problem?id=1694 (题目链接) 题意 一棵树,现在往上面放石子.对于一个节点x,只有当它的直接儿子都放满石子时,才能将它直接儿子中的一个石子放置x上,并回收 ...

  7. Python【第一章】:简介和入门

    ython简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承.之 ...

  8. Promise deeply lookup

    Motivation Consider the following synchronous JavaScript function to read a file and parse it as JSO ...

  9. sql 的实用函数(包含日期函数、截取字符串函数)

    CONVERT() 函数是把日期转换为新数据类型的通用函数. CONVERT() 函数可以用不同的格式显示日期/时间数据. 语法 CONVERT(data_type(length),data_to_b ...

  10. CSS选择器优先级总结

    CSS三大特性-- 继承. 优先级和层叠. 继承:即子类元素继承父类的样式; 优先级:是指不同类别样式的权重比较; 层叠:是说当数量相同时,通过层叠(后者覆盖前者)的样式. css选择符分类 首先来看 ...