首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

如何从语义下理解“几乎任何对象都能与string相加并自动调用ToString()”

2013-01-11 
怎么从语义上理解“几乎任何对象都能与string相加并自动调用ToString()”可能调用ToString只是表面现象,但实

怎么从语义上理解“几乎任何对象都能与string相加并自动调用ToString()”
可能调用ToString只是表面现象,但实验结果是如此

在object和string中都没找到对运算符“+”的重写,也没有相关的implicit explicit的定义,怎么从主义上理解这样的用法呢?


            string a = "abc";
            Type b = a.GetType();
            string c = a + b;
            string d = b + a;

[解决办法]
所有继承与object的都会实现tostring方法,与字符串做+操作,编译器会自动调用tostring方法,这个+号不是相加,而是合并。
[解决办法]
重载+号是提供给你的一种方法而已,.NET内置好的一些重载你是看不到的,这里的转换都是内置的,不会写在类型定义上面。
[解决办法]
string c = a + b;

相关IL代码如下:


IL_0018:  call    string [mscorlib]System.String::Concat(object,
                                                              object)


发现,编译后,是调用String对象的Concat方法,

然后反编译查看Concat方法的代码,相关代码如下:

public static String Concat(params Object[] args) {
            if (args==null) {
                throw new ArgumentNullException("args"); 
            }
            Contract.Ensures(Contract.Result<String>() != null); 
            Contract.EndContractBlock(); 

            String[] sArgs = new String[args.Length]; 
            int totalLength=0;

            for (int i=0; i<args.Length; i++) {
                object value = args[i]; 
                sArgs[i] = ((value==null)?(String.Empty):(value.ToString()));
                if (sArgs[i] == null) sArgs[i] = String.Empty; // value.ToString() above could have returned null 
                totalLength += sArgs[i].Length; 
                // check for overflow
                if (totalLength < 0) { 
                    throw new OutOfMemoryException();


                }
            }
            return ConcatArray(sArgs, totalLength); 
        }



可以看出,FCL程序,是将个对象的ToString结果存入预处理数组中
[解决办法]
是的,编译器去实现的,好比装箱拆箱,你绕开了编译器,怎么也想不明白——判断一个对象是Value还是Reference本身就是编译器干的事情。像C#这样的语言,基本语法是几乎无法被重新定义和修改的,而运算符重载之鞥算编译器给程序员开的一个特例。

热点排行