【问题标题】:How would I rewrite this JavaScript routine in C# using closure?我将如何使用闭包在 C# 中重写这个 JavaScript 例程?
【发布时间】:2015-01-15 19:23:49
【问题描述】:

JavaScript 代码:

function makeConverter(toUnit, factor, offset) {
    offset = offset || 0;

    var converter = function (input) {
        return ((offset + input) * factor).toFixed(2) + " " + toUnit;
    };

    return converter;
}

var milesToKm = makeConverter('km', 1.60936);
var poundsToKg = makeConverter('kg', 0.45460);
var farenheitToCelsius = makeConverter('degrees C', 0.5556, -32);

log(milesToKm(10));
log(poundsToKg(2.5));
log(farenheitToCelsius(98));

【问题讨论】:

    标签: javascript c# closures


    【解决方案1】:

    你可以在 C# 中做同样的事情:

    public static Func<double, string> makeConverter(string toUnit, double factor, double offset = 0.0)
    {
        return (input) => string.Format("{0:0.##} {1}", (offset + input) * factor, toUnit);
    }
    
    public static void Main()
    {
        var milesToKm = makeConverter("km", 1.60936);
        var poundsToKg = makeConverter("kg", 0.45460);
        var farenheitToCelsius = makeConverter("degrees C", 0.5556, -32);
    
        Console.WriteLine("{0}", milesToKm(10));
        Console.WriteLine("{0}", poundsToKg(2.5));
        Console.WriteLine("{0}", farenheitToCelsius(98));
    }
    

    您可以进一步将其简化为单一方法:

    public static void Main()
    {
        Func<string, double, double, Func<double, string>> makeConverter =
            (toUnit, factor, offset) => (input) => string.Format("{0:0.##} {1}", (offset + input) * factor, toUnit);
    
        var milesToKm = makeConverter("km", 1.60936, 0.0);
        var poundsToKg = makeConverter("kg", 0.45460, 0.0);
        var farenheitToCelsius = makeConverter("degrees C", 0.5556, -32);
    
        Console.WriteLine("{0}", milesToKm(10));
        Console.WriteLine("{0}", poundsToKg(2.5));
        Console.WriteLine("{0}", farenheitToCelsius(98));
    }
    

    您甚至可以使用旧式可以使用 C# 2 语法(是的,C# 自 2005 年以来已经关闭)

    public delegate string del_t(double input);
    
    public static del_t makeConverter(string toUnit, double factor, double offset = 0.0)
    {
        return delegate(double input) 
        {
            return string.Format("{0:0.##} {1}", (offset + input) * factor, toUnit );
        };
    }
    
    public static void Main()
    {
        var milesToKm = makeConverter("km", 1.60936);
        var poundsToKg = makeConverter("kg", 0.45460);
        var farenheitToCelsius = makeConverter("degrees C", 0.5556, -32);
    
        Console.WriteLine("{0}", milesToKm(10) );
        Console.WriteLine("{0}", poundsToKg(2.5) );
        Console.WriteLine("{0}", farenheitToCelsius(98));
    }
    

    作为比较,如果你不使用闭包,在 C# 中解决这个问题的传统基于类的方法是:

    public static void Main()
    {
        var milesToKm = new Converter("km", 1.60936);
        var poundsToKg = new Converter("kg", 0.45460);
        var farenheitToCelsius = new Converter("degrees C", 0.5556, -32);
    
        Console.WriteLine("{0}", milesToKm.Convert(10) );
        Console.WriteLine("{0}", poundsToKg.Convert(2.5) );
        Console.WriteLine("{0}", farenheitToCelsius.Convert(98) );
    }
    
    class Converter
    {
        string m_toUnit;
        double m_factor;
        double m_offset;
    
        public Converter(string toUnit, double factor, double offset = 0)
        {
            m_toUnit = toUnit;
            m_factor = factor;
            m_offset = offset;
        }
    
        public string Convert(double input)
        {
            return string.Format("{0:0.##} {1}", (m_offset + input) * m_factor, m_toUnit );
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2022-07-13
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多