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!=0)
            {
                // ...
            }
        }

  第3种方法, 每次判断都需要键入Code, 有点麻烦, 可以使用C#的运算符重载简化一点点代码

  1     /// <summary>
  2     /// 带结果代码和提示信息的结构体, 可以很方便的以结果代码(Code)与int比较, Code==0表示成功
  3     /// </summary>
  4     public struct Result
  5     {
  6         /// <summary>
  7         /// 结果代码
  8         /// </summary>
  9         public int Code;
 10
 11         /// <summary>
 12         /// 提示信息
 13         /// </summary>
 14         public string Msg;
 15
 16
 17
 18         #region 构造函数
 19
 20         public Result(string msgParam)
 21             : this(-1, msgParam)
 22         { }
 23
 24
 25         public Result(int codeParam, string msgParam)
 26         {
 27             Code = codeParam;
 28             Msg = msgParam;
 29         }
 30
 31         #endregion
 32
 33
 34
 35         #region 快速生成结构体
 36         public static Result Pass { get { return new Result(); } }
 37
 38
 39         public static Result PassWithMsg(string msgParam)
 40         {
 41             return new Result() { Code = 0, Msg = msgParam };
 42         }
 43
 44
 45         public static Result Fail(string msgParam)
 46         {
 47             return new Result(msgParam);
 48         }
 49
 50         //如果codeParam==0 的话, 强制变 -1
 51         public static Result Fail(int codeParam, string msgParam)
 52         {
 53             codeParam = codeParam == 0 ? -1 : codeParam;
 54             return new Result(codeParam, msgParam);
 55         }
 56         #endregion
 57
 58
 59
 60         #region 重载与int的比较
 61
 62         public static bool operator ==(int lhs, Result rhs)
 63         {
 64             return lhs == rhs.Code;
 65         }
 66
 67         public static bool operator !=(int lhs, Result rhs)
 68         {
 69             return lhs != rhs.Code;
 70         }
 71
 72         public static bool operator ==(Result lhs, int rhs)
 73         {
 74             return rhs == lhs;
 75         }
 76
 77         public static bool operator !=(Result lhs, int rhs)
 78         {
 79             return rhs != lhs;
 80         }
 81         #endregion
 82
 83
 84
 85         #region 还得实现同类型的比较
 86
 87         public static bool operator ==(Result lhs, Result rhs)
 88         {
 89             return lhs.Code == rhs.Code;
 90         }
 91
 92         public static bool operator !=(Result lhs, Result rhs)
 93         {
 94             return lhs.Code != rhs.Code;
 95         }
 96         #endregion
 97
 98
 99
100         #region 按要求重载 Equals()和GetHashCode()两个方法, 完全以Code为比较值
101
102         public override bool Equals(object obj)
103         {
104             if (obj is int)
105             {
106                 return this.Code == (int)obj;
107             }
108             if (obj is Result == false)
109             {
110                 return false;
111             }
112             return this.Code == ((Result)obj).Code;
113         }
114
115         public override int GetHashCode()
116         {
117             return this.Code.GetHashCode();
118         }
119
120         #endregion
121
122
123
124
125         #region int显示转换为Result结构(示例: Result result=(Result)0;  ), 弃用这个的原因是: 当结果不为0时, 不能赋值Msg;
126         //public static explicit operator Result(int result)
127         //{
128         //    return new Result() { Code = result };
129         //}
130         #endregion
131     }

  这样的话, 就不用每次都输入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");
        }
    }
时间: 2024-10-07 03:45:01

C# 使用运算符重载 简化结果判断的相关文章

复数类的相关运算(判断大小及四则运算)-&gt;(构造,析构,拷贝复制,运算符重载)

问题描述: 创建一个Plural(复数)的class类,不借助系统的默认成员函数,在类体中写入构造函数,析构函数,拷贝复制函数以及运算符重载函数.并依次实现复数的大小比较(bool)和复数的四则运算(+,-,*,/). #include<iostream> using  namespace std; class Plural { public: void  Display() { cout << "Real->:" << _real; cout

Python 多态 对象常用内置函数 运算符重载 对象迭代器 上下文管理

一 多态 1.什么是多态:多态不是一个具体的技术或代码.指的时候多个不同类型对象可以响应同一个方法,产生不同的结果. 2.使用多多态的好处:提高了程序的灵活性,拓展性 3.如何实现:鸭子类型 就是典型的多态 多种不同类型 使用方法一样 4.案例 class Cat(): def bark(self): print("喵喵喵") def run(self): print("四条腿跑!") def sleep(self): print("趴着睡!")

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

运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 1.加号运算符重载 作用:实现两个自定义数据类型相加的运算 #include <iostream> #include <string> using namespace std; //加号运算符重载 class Person{ public: //1.成员函数重载+号 Person operator+(Person &p){ Person temp; temp.m_a = this->m

简化分支判断的设计模式

很多时候会发现自己在写代码的时候写了一坨if else 语句使得自己的代码看起来很丑,随着业务量的增大,代码变得很难维护,之前想到能替换if else的只有switch,其实效果并没有明显的提升,现在在看设计模式方面的知识,发现两种设计模式能够解决分支判断的臃肿问题. 状态模式 使用场景 大家都知道超级玛丽的游戏吧,玛丽要吃蘑菇,他就要挑起,顶出墙壁里的蘑菇:玛丽想到悬崖的另一边,他就要跳起:玛丽想躲避被前面的乌龟咬到,他就要开枪打死乌龟:前面飞过炮弹,玛丽就要蹲下躲避:时间不够了,就要加速奔跑

C++【面试题】:类实现万年历(日期计算器),(含构造函数、拷贝构造、运算符重载、析构函数)

#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<stdlib.h> using namespace std; class Date { public:     Date(int year=0, int month=0, int day=0)     :_year(year)     , _month(month)     , _day(day)     {         cout << &qu

python运算符重载2

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

第八周项目 二 【项目2-Time类中的运算符重载】

[项目2-Time类中的运算符重载] 实现Time类中的运算符重载. [cpp] view plaincopyprint? class CTime { private: unsigned short int hour;    // 时 unsigned short int minute;  // 分 unsigned short int second;  // 秒 public: CTime(int h=0,int m=0,int s=0); void setTime(int h,int m,i

Swift教程之运算符重载

原文地址:http://www.raywenderlich.com/80818/operator-overloading-in-swift-tutorial 作者:Corinne Krych  译者:孟祥月 blog:http://blog.csdn.net/mengxiangyue 这篇文章是本人第一次翻译,难免有错误,翻译的时候使用的是txt,所以格式上面有些不太好. 在早前的IOS 8盛宴系列的教程里,你已经了解到,Swift提供了许多强大的.现代的编程特性,比如泛型.函数式编程.一等类型

C++基础5 运算符重载【提高】

1)括号运算符()重载 2)[面试题]&&, || 能不能做 操作符重载? 3)运算符极致练习: [提高]运算符重载 括号运算符()重载 [email protected]:~/c++$ cat main.cpp  #include <iostream> using namespace std; class A { public: A(int a,int b) { this->a = a; this->b = b; } int operator()(int a,in