执行某个方法后, 一般都要对执行结果判断, 如果执行不成功, 还需要显示错误信息, 我先后使用了下面几种方式

        /// <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# 使用运算符重载 简化结果判断的更多相关文章

  1. 《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数

        C++中利用构造函数与无名对象简化运算符重载函数 在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁  //站点:www.cn ...

  2. C++学习(12)—— 运算符重载

    运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 1.加号运算符重载 作用:实现两个自定义数据类型相加的运算 #include <iostream> #i ...

  3. 运算符重载+日期类Date

    Hello,一只爱学习的鱼 大学学习C++运算符重载的时候,老师出了一道"运算符重载+类"的综合练习题,让我们来一起看看吧! 题目: 设计一个日期类Date,包括年.月.日等私有成 ...

  4. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  5. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  6. 实验12:Problem H: 整型数组运算符重载

    Home Web Board ProblemSet Standing Status Statistics   Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...

  7. 【C++】运算符重载

    运算符重载,主要是简化类类型运算,能够让我们对类对象直接用运算符进行运算.基本语法: 类型 operator 运算符(参数列表){ ... } Complex operator+(Complex va ...

  8. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  9. Swift - 运算符重载和运算符函数

    让已有的运算符对自定义的类和结构进行运算或者重新定义已有运算符的运算规则,这种机制被称为运算符重载. 1,通过重载加号运算符,使自定义的两个坐标结构体对象实现相加: 1 2 3 4 5 6 7 8 9 ...

随机推荐

  1. Java异常处理——如何跟踪异常的传播路径?

    当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序. 可使用printStackTrace 和 getMessage方法了解异常发生的情况: printStackTrace:打印方 ...

  2. aptitude与apt-get的区别和联系

    aptitude 与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具.与 apt-get 不同的是,aptitude 在处理依赖问题上更佳一些.举例来说,aptitud ...

  3. 基于vue和svg的树形UI

      vue-svg-tree 基于vue和svg的动态树形UI 截图 应用 npm install vue-svg-tree 示例 <template> <div> <v ...

  4. WPF DEV gridcontrol当前项的数据导出为mdb文件

    /// <summary> /// 导出为mdb /// </summary> /// <param name="sender"></pa ...

  5. RobotFramework - AppiumLibrary 之关键字Open Application使用

  6. [java,2019-01-28] 枪手博弈,谁才是最后赢家

    什么是枪手博弈: 枪手博弈指彼此痛恨的甲乙丙三个枪手准备决斗.甲枪法最好,十发八中.乙枪法次之,十发六中.丙枪法最差,十发四中.假设他们了解彼此实力,也能做出理性判断. 问题一:如果三人同时开枪,并且 ...

  7. 使用plot_importance绘制特征重要性曲线

    代码如下所示: # -*- coding: utf-8 -*- #导入需要的包 import matplotlib.pyplot as plt from sklearn import datasets ...

  8. Celery异步的分布式任务调度理解

    什么是Celery呢? Celery是一个用Python开发的异步的分布式任务调度模块. Celery本身不包含消息服务,使用第三方消息服务,也就是Broker,来传递任务,目前支持的有Rebbimq ...

  9. es6 和 python 语法比较

    http://www.linchaoqun.com/html/cms/content.jsp?id=1509528630774 Python3笔记:Python与ECMAScript部分语法对比 ht ...

  10. 树莓派3使用openSUSE Ports 42.3 驱动GPIO注意事项

    安装好opensuse 42.3以后,安装wiringPi库. 由于/proc/cpuinfo文件缺少“Hardware”信息,导致出现如下错误: Oops: Unable to determine ...