C# 使用运算符重载 简化结果判断
执行某个方法后, 一般都要对执行结果判断, 如果执行不成功, 还需要显示错误信息, 我先后使用了下面几种方式
/// <summary>
/// 返回int类型结果, msg输出错误信息
/// </summary>
/// <param name="param">输入参数</param>
/// <param name="msg">错误信息</param>
/// <returns>0-成功, 其他值-失败</returns>
public int Foo(object param, out string msg);
/// <summary>
/// 直接返回值(string)为空, 表示成功; 不成功的话, 输出错误信息
/// </summary>
/// <param name="param">输入参数</param>
/// <param name="result">结算结果</param>
/// <returns>null或者""(string.Empty)-成功, 非空-失败</returns>
public string Bar(object param, out object result);
public struct Result
{
/// <summary>
/// 执行结果
/// </summary>
public int Code; /// <summary>
/// 错误信息
/// </summary>
public string Msg;
} /// <summary>
/// 直接返回Result结果, Result.Code表示执行结果, Result.Msg包含错误信息
/// </summary>
/// <param name="param"></param>
/// <param name="calculateResult"></param>
/// <returns>Result.Code表示执行结果, Result.Msg包含错误信息</returns>
public Result Baz(object param, out object calculateResult); public void Test()
{
object calculateResult;
var result = Baz(null, out calculateResult);
if (result.Code!=)
{
// ...
}
}
第3种方法, 每次判断都需要键入Code, 有点麻烦, 可以使用C#的运算符重载简化一点点代码
/// <summary>
/// 带结果代码和提示信息的结构体, 可以很方便的以结果代码(Code)与int比较, Code==0表示成功
/// </summary>
public struct Result
{
/// <summary>
/// 结果代码
/// </summary>
public int Code; /// <summary>
/// 提示信息
/// </summary>
public string Msg; #region 构造函数 public Result(string msgParam)
: this(-, msgParam)
{ } public Result(int codeParam, string msgParam)
{
Code = codeParam;
Msg = msgParam;
} #endregion #region 快速生成结构体
public static Result Pass { get { return new Result(); } } public static Result PassWithMsg(string msgParam)
{
return new Result() { Code = , Msg = msgParam };
} public static Result Fail(string msgParam)
{
return new Result(msgParam);
} //如果codeParam==0 的话, 强制变 -1
public static Result Fail(int codeParam, string msgParam)
{
codeParam = codeParam == ? - : codeParam;
return new Result(codeParam, msgParam);
}
#endregion #region 重载与int的比较 public static bool operator ==(int lhs, Result rhs)
{
return lhs == rhs.Code;
} public static bool operator !=(int lhs, Result rhs)
{
return lhs != rhs.Code;
} public static bool operator ==(Result lhs, int rhs)
{
return rhs == lhs;
} public static bool operator !=(Result lhs, int rhs)
{
return rhs != lhs;
}
#endregion #region 还得实现同类型的比较 public static bool operator ==(Result lhs, Result rhs)
{
return lhs.Code == rhs.Code;
} public static bool operator !=(Result lhs, Result rhs)
{
return lhs.Code != rhs.Code;
}
#endregion #region 按要求重载 Equals()和GetHashCode()两个方法, 完全以Code为比较值 public override bool Equals(object obj)
{
if (obj is int)
{
return this.Code == (int)obj;
}
if (obj is Result == false)
{
return false;
}
return this.Code == ((Result)obj).Code;
} public override int GetHashCode()
{
return this.Code.GetHashCode();
} #endregion #region int显示转换为Result结构(示例: Result result=(Result)0; ), 弃用这个的原因是: 当结果不为0时, 不能赋值Msg;
//public static explicit operator Result(int result)
//{
// return new Result() { Code = result };
//}
#endregion
}
这样的话, 就不用每次都输入Code了
class Program
{
static void Main(string[] args)
{
var result = PassMethod();
if (result==0) //直接与int比较
{
Console.WriteLine("PassMethod成功");
}
else
{
Console.WriteLine("PassMethod失败: "+result.Msg);
} result = FailMethod();
if (result == Result.Pass) //与Result类型比较
{
Console.WriteLine("FailMethod成功");
}
else
{
Console.WriteLine("FailMethod失败: " + result.Msg);
}
} public static Result PassMethod()
{
return Result.Pass;
} public static Result FailMethod()
{
return Result.Fail("Something is wrong");
}
}
C# 使用运算符重载 简化结果判断的更多相关文章
- 《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数
C++中利用构造函数与无名对象简化运算符重载函数 在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁 //站点:www.cn ...
- C++学习(12)—— 运算符重载
运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 1.加号运算符重载 作用:实现两个自定义数据类型相加的运算 #include <iostream> #i ...
- 运算符重载+日期类Date
Hello,一只爱学习的鱼 大学学习C++运算符重载的时候,老师出了一道"运算符重载+类"的综合练习题,让我们来一起看看吧! 题目: 设计一个日期类Date,包括年.月.日等私有成 ...
- C#高级编程笔记2016年10月12日 运算符重载
1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...
- C++运算符重载
C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...
- 实验12:Problem H: 整型数组运算符重载
Home Web Board ProblemSet Standing Status Statistics Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...
- 【C++】运算符重载
运算符重载,主要是简化类类型运算,能够让我们对类对象直接用运算符进行运算.基本语法: 类型 operator 运算符(参数列表){ ... } Complex operator+(Complex va ...
- [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)
operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...
- Swift - 运算符重载和运算符函数
让已有的运算符对自定义的类和结构进行运算或者重新定义已有运算符的运算规则,这种机制被称为运算符重载. 1,通过重载加号运算符,使自定义的两个坐标结构体对象实现相加: 1 2 3 4 5 6 7 8 9 ...
随机推荐
- python 最大连续子数组的和
抛出问题: 求一数组如 l = [0, 1, 2, 3, -4, 5, -6],求该数组的最大连续子数组的和 如结果为[0,1,2,3,-4,5] 的和为7 问题分析: 这个问题很简单,直接暴力法,上 ...
- LeetCode 237. Delete Node in a Linked List 删除链表结点(只给定要删除的结点) C++/Java
Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...
- 分组密码算法AES-128,192,256 C语言实现第一版
AES的C语言实现入门版 AES分组密码算法中明文分组位128bits,密钥分组可以为128,192,256bits.AES也是由最基本的变换单位——“轮”多次迭代而成的.我们将 AES 中的轮变换计 ...
- mysql查看及设置最大连接数
#查看: show variables like '%max_connections%'; #设置: set GLOBAL max_connections = 1000;
- Django 请求类型
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get ...
- python学习笔记---环境的安装,pip命令,数据类型,运算
1.进入python环境: python 2:py -2 python 3:py -3 2.退出python环境 exit()/quit()/ctrl+z+enter ctrl+z+enter没有尝试 ...
- my题库
数论: 51nod 1240 莫比乌斯函数 51nod 1135 原根 图论: 51nod 1264 线段相交 51nod 1298 圆与三角形 dp: 数位dp: hdu 4734 51nod 10 ...
- SpringMVC对ServletAPI的支持和JSON格式的转换
package com.hongcong.controller; import java.io.UnsupportedEncodingException; import java.net.URLDec ...
- 解决phpstudy在 cmd窗口输出 php5 中文显示乱码问题
xampp没事,但切换到phpstudy后发现echo中文变成了乱码 找到解决办法:在cmd里输入 chcp 65001 命令 切换字符编码 chcp 65001 就是换成UTF-8 chcp 93 ...
- jmiter性能测试
1. Jmeter简介Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件.相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测 ...