zoukankan      html  css  js  c++  java
  • C#实现函数根据返回类型重载

    一直以来都很奇怪为何C#不能直接支持函数返回值重载,

    比如如下两个函数是编译不过的

    Public Class DbHelper

    {

      Public Static int ExecuteScalar();

      Public Static string ExecuteScalar();

    }

    今天看到了装配脑袋的这篇博文,里边就实现了我要的效果,而且语法很优美,让我们来拜读一下。

    知识点预习

    Implicit  关键字用于声明隐式的用户定义类型转换运算符。如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换。

    也就是提供类似 decamil money = 9 的转换功能

    对应的还有一个

    Explicit  关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符。

    也就是提供类似 int money = (int)9.0 的转换功能

    作者使用简单的一个类 Foo 和 一个结构TestHelper

    需要重载的方法放在Foo类

      private string TestString() 
        { 
            return "I'm a string"; 
        }

       private int TestInt() 
        {
            return 100; 
        }

    TestHelper结构是包装Foo类的

    public struct TestHelper 
        { 
            Foo m_host; 
            public TestHelper(Foo host) 
            { 
                m_host = host; 
            }

        //实现TestHelperint的隐式转换

            public static implicit operator int(TestHelper helper) 
            { 
                return helper.m_host.TestInt(); 
            }

        //实现TestHelperstring的隐式转换

            public static implicit operator string(TestHelper helper) 
            { 
                return helper.m_host.TestString(); 
            } 
        } 

    关键在于Foo类一个巧妙的函数

    Public TestHelper Test() 
        { 

        //返回一个TestHelper对象,由该对象去隐式转换目标值
            return new TestHelper(this); 
        }

    最终调用起来类似

    Foo f = new Foo(); 
    int i = f.Test(); 
    string s = f.Test(); 

    效果达成,无毒无副作用就是多了个类(原文用内部类),收藏。●▽●

  • 相关阅读:
    设置了透明以后,会有严重残影
    “真正的工作不是说的天花乱坠”,Torvalds 说, “而是在于细节”(Torvalds 认为成功的项目都是99%的汗水和1%的创新)
    iOS和Android使用MQTT协议实现消息推送和即时通讯(替代XMPP,已经有TMS MQTT)
    avalonjs1.5 入门教程
    Grunt 之 Connect
    性能
    JQUERY省、市、县城市联动选择
    Meteor全栈开发平台
    微型工作流引擎设计
    微型工作流引擎-功能设计
  • 原文地址:https://www.cnblogs.com/MigCoder/p/3500747.html
Copyright © 2011-2022 走看看