关于扩展方法的一些理解

时间:2014-05-26 18:12:35

标签: c# extension-methods

我刚刚收集了一些相关知识,似乎很难理解以下情况。

我有2节课。一个有Main方法,另一个有两个Extension Methods,如下所示。

有主要课程

class Program
    {
        static void Main(string[] args)
        {
            string uuu = "214";
            Console.WriteLine(uuu.SplitMe().AddMe());
            Console.ReadKey();
        }
    }

扩展类

static class ExtensionClass
    {
        public static char[] SplitMe(this string value)
        {
            return value.ToCharArray();
        }

        public static long AddMe(this char[] value)
        {
            int sum = 0;
            for (int i = 0; i<value.Length ; i++)
            {
                sum += Convert.ToInt32(value[i]);
            }
            return sum;
        }
    }

我期待着,在下面一行

Console.WriteLine(uuu.SplitMe().AddMe());

uuu.SplitMe()的输出为{'2','1','4'}的char[]以及要打印为7(2 + 1 + 4)的完整行的结果,但它在我的控制台上是151。你能详细说明它的计算方法吗?

感谢。

4 个答案:

答案 0 :(得分:8)

问题是System.Char '2'值的整数值为50,而不是2.因此,您要求{'2','1','4'}求和,其值为{{1} },然后变为151.

您可以通过以下方式将字符转换为与其值匹配的数字:

{50, 49, 52}

但是,如果传递包含非数字字符的字符串,则会引发异常。

答案 1 :(得分:1)

包含char的{​​{1}}的值不是2,而是50,因为它在ASCII table中的位置用作其值;其他数字也是如此,这解释了意想不到的结果。

答案 2 :(得分:0)

Convert.ToInt32不会转换数字字符串值,而是the specified Unicode character to the equivalent 32-bit signed integer

答案 3 :(得分:0)

因为ascii值2为50 1是49且4是52.所以它正在添加这些值..

您需要更改代码

public static long AddMe(this char[] value) { int sum = 0; for (int i = 0; i < value.Length; i++) { sum += value[i]-48; } return sum; }

或者你也可以这样做

sum += int.Parse(value[i].ToString());