object + string
От: NightElve  
Дата: 09.01.07 17:56
Оценка:
Здравствуйте.
Не могли бы вы объяснить, что происходит при выполнении следующего кода:
object x = "Testing ";
string i = "C#!";
x = x + i;
System.Console.WriteLine(x);

Точнее, каким образом в результате мы получаем на консоли "Testing C#!"?
Re: object + string
От: cvetkov  
Дата: 09.01.07 18:29
Оценка:
Здравствуйте, NightElve, Вы писали:

NE>Здравствуйте.

NE>Не могли бы вы объяснить, что происходит при выполнении следующего кода:
NE>
NE>object x = "Testing ";
NE>string i = "C#!";
NE>x = x + i;
NE>System.Console.WriteLine(x);
NE>

NE>Точнее, каким образом в результате мы получаем на консоли "Testing C#!"?

у того на что ссылаеться x вызываеться метод ToString
а вызываеться он, насколько я понимаю, потому что так реализован operator + у класса String
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: object + string
От: Denis2005 Россия  
Дата: 09.01.07 18:36
Оценка: -1
Здравствуйте, NightElve, Вы писали:

NE>Здравствуйте.

NE>Не могли бы вы объяснить, что происходит при выполнении следующего кода:
NE>
NE>object x = "Testing ";
NE>string i = "C#!";
NE>x = x + i;
NE>System.Console.WriteLine(x);
NE>

NE>Точнее, каким образом в результате мы получаем на консоли "Testing C#!"?

Результирующим выражением x + i будет объект типа string, т.к. компилятор разворачивает это в:
x = x.ToString() + i;


Следовательно этот трюк будет работать для любого типа:
object o = 10; // 'o' оборачивает Int32
string s = "aaa";
o = o + s; // o = "10aaa"
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: object + string
От: Saruwatari Россия  
Дата: 09.01.07 19:05
Оценка: -2
Здравствуйте, Denis2005, Вы писали:

D>Результирующим выражением x + i будет объект типа string, т.к. компилятор разворачивает это в:

D>
D>x = x.ToString() + i;
D>


Не компилятор, а перегрузка оператора + типа String.
Re: object + string
От: TK Лес кывт.рф
Дата: 09.01.07 19:14
Оценка: 2 (1)
Здравствуйте, NightElve, Вы писали:

NE>Здравствуйте.

NE>Не могли бы вы объяснить, что происходит при выполнении следующего кода:

Читаем C# Language Reference по operator +

Binary + operators are predefined for numeric and string types. For numeric types, + computes the sum of its two operands. When one or both operands are of type string, + concatenates the string representations of the operands.

Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: object + string
От: Denis2005 Россия  
Дата: 09.01.07 19:34
Оценка:
Здравствуйте, Saruwatari, Вы писали:

S>Здравствуйте, Denis2005, Вы писали:


D>>Результирующим выражением x + i будет объект типа string, т.к. компилятор разворачивает это в:

D>>
D>>x = x.ToString() + i;
D>>


S>Не компилятор, а перегрузка оператора + типа String.


Рекомендую перед тем как ставить минусы, разобраться в вопросе.
Если внимательно посмотреть на реализацию класса System.String то ты не увидишь там перегрузок оператора + вообще.
И еще ... ознакомьтесь со спецификацией языка C#.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: object + string
От: Lloyd Россия  
Дата: 09.01.07 19:38
Оценка: 2 (1)
Здравствуйте, Denis2005, Вы писали:

D>Рекомендую перед тем как ставить минусы, разобраться в вопросе.

D>Если внимательно посмотреть на реализацию класса System.String то ты не увидишь там перегрузок оператора + вообще.
D>И еще ... ознакомьтесь со спецификацией языка C#.

Не спорьте, горячие финские парни. Вы неправы оба:

.method private hidebysig static void Main(string[] args) cil managed
{
      .entrypoint
      .maxstack 2
      .locals init (
            [0] object obj1,
            [1] string text1)
      L_0000: nop 
      L_0001: ldstr "Testing "
      L_0006: stloc.0 
      L_0007: ldstr "C#!"
      L_000c: stloc.1 
      L_000d: ldloc.0 
      L_000e: ldloc.1 
      L_000f: call string string::Concat(object, object)
      L_0014: stloc.0 
      L_0015: ldloc.0 
      L_0016: call void [mscorlib]System.Console::WriteLine(object)
      L_001b: nop 
      L_001c: ret 
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: object + string
От: nikov США http://www.linkedin.com/in/nikov
Дата: 10.01.07 06:18
Оценка: 35 (6) :))) :)
Здравствуйте, NightElve, Вы писали:

NE>Здравствуйте.

NE>Не могли бы вы объяснить, что происходит при выполнении следующего кода:

Ну, это еще что!
Вы вот на такой код посмотрите.

using System;

class Program
{
    static void Main()
    {
        object o = typeof (int) + null;
        Console.WriteLine(o.GetType());
        Console.WriteLine(o);
    }
}
Re[2]: object + string
От: stump http://stump-workshop.blogspot.com/
Дата: 10.01.07 06:41
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, NightElve, Вы писали:


NE>>Здравствуйте.

NE>>Не могли бы вы объяснить, что происходит при выполнении следующего кода:

N>Ну, это еще что!

N>Вы вот на такой код посмотрите.

N>
N>using System;

N>class Program
N>{
N>    static void Main()
N>    {
N>        object o = typeof (int) + null;
N>        Console.WriteLine(o.GetType());
N>        Console.WriteLine(o);
N>    }
N>}
N>

Забавно

object o = typeof (int) + null;

->
IL_0000:  ldtoken    [mscorlib]System.Int32
IL_0005:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000a:  ldnull
IL_000b:  call       string [mscorlib]System.String::Concat(object, object)

в результате получаем строку.
Понедельник начинается в субботу
Re[2]: object + string
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.01.07 07:42
Оценка:
Здравствуйте, Denis2005, Вы писали:


D>Результирующим выражением x + i будет объект типа string, т.к. компилятор разворачивает это в:

D>
D>x = x.ToString() + i;
D>


Почти верно. Ошибка только в том, что компилятор разварачивает этот код в:
x = string.Conat(x.ToString(), i);

но это уже детали реализации конкатинации в компиляторе C#. Любой "+" переводится в такую же конструкцию.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: object + string
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.01.07 07:42
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Не спорьте, горячие финские парни. Вы неправы оба:


Ну, Denis2005 почти прав. Просто он видимо изучал генериуремый код Рефлектором, а тот "помогает" преобразуя вызов Concat в оператор "+".
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: object + string
От: nikov США http://www.linkedin.com/in/nikov
Дата: 10.01.07 07:47
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Почти верно. Ошибка только в том, что компилятор разварачивает этот код в:

VD>
VD>x = string.Conat(x.ToString(), i);
VD>


Это тоже почти верно. На самом деле:

x = string.Conсat(x, i);


безо всякого ToString.
Re[2]: object + string
От: desco США http://v2matveev.blogspot.com
Дата: 10.01.07 08:46
Оценка:
Здравствуйте, nikov, Вы писали:

N>Здравствуйте, NightElve, Вы писали:


NE>>Здравствуйте.

NE>>Не могли бы вы объяснить, что происходит при выполнении следующего кода:

N>Ну, это еще что!

N>Вы вот на такой код посмотрите.

N>
N>using System;

N>class Program
N>{
N>    static void Main()
N>    {
N>        object o = typeof (int) + null;
N>        Console.WriteLine(o.GetType());
N>        Console.WriteLine(o);
N>    }
N>}
N>


злобно

из той же оперы

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine(((object)null + null).GetType());
    }
}
Re[4]: object + string
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.01.07 10:28
Оценка:
Здравствуйте, nikov, Вы писали:

N>Это тоже почти верно. На самом деле:


N>
N>x = string.Conсat(x, i);
N>


N>безо всякого ToString.


Может быть, может быть. Но ToString() по любому будет вызвана. Не момпилятором, так реализаций string.Conсat().
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: object + string
От: Saruwatari Россия  
Дата: 10.01.07 10:34
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Lloyd, Вы писали:


L>>Не спорьте, горячие финские парни. Вы неправы оба:


VD>Ну, Denis2005 почти прав. Просто он видимо изучал генериуремый код Рефлектором, а тот "помогает" преобразуя вызов Concat в оператор "+".


Дело в том, что произвести подобный фокус в отношении другого типа не удастся. Поэтому я сделал вывод о том, что оператор + для случая, если одним из операндов является строкой, реализован специальным образом, что дает право, на мой взгляд говорить о его перегрузке, пусть даже на более высоком уровне, чем реализация в классе. С другой стороны, такую перегрузку так же можно назвать особенностью компилятора.

Поправьте обязательно, если не согласны или я не прав.
Re[7]: object + string
От: Lloyd Россия  
Дата: 10.01.07 10:54
Оценка: +1
Здравствуйте, Saruwatari, Вы писали:

S>Дело в том, что произвести подобный фокус в отношении другого типа не удастся. Поэтому я сделал вывод о том, что оператор + для случая, если одним из операндов является строкой, реализован специальным образом, что дает право, на мой взгляд говорить о его перегрузке, пусть даже на более высоком уровне, чем реализация в классе. С другой стороны, такую перегрузку так же можно назвать особенностью компилятора.


S>Поправьте обязательно, если не согласны или я не прав.


Скорее особенностью языка, раз такое описано в стандарте.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: object + string
От: nikov США http://www.linkedin.com/in/nikov
Дата: 10.01.07 10:55
Оценка: +2 :))
Здравствуйте, VladD2, Вы писали:

VD>Может быть, может быть. Но ToString() по любому будет вызвана. Не момпилятором, так реализаций string.Conсat().


К сожалению, это утверждение также неверно.
Метод ToString не будет вызван, к примеру, у аргумента равного null (это привело бы к возникновению исключения).
Вместо этого будет подставлена пустая строка.
Re[6]: object + string
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.01.07 12:07
Оценка:
Здравствуйте, nikov, Вы писали:

N>К сожалению, это утверждение также неверно.

N>Метод ToString не будет вызван, к примеру, у аргумента равного null (это привело бы к возникновению исключения).
N>Вместо этого будет подставлена пустая строка.

Мне казалось, что это и ежу понятно. А стало быть и обсуждать глупо.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: object + string
От: Morpheus_  
Дата: 10.01.07 12:27
Оценка:
Здравствуйте, desco, Вы писали:

N>>Вы вот на такой код посмотрите.


N>>
N>>using System;

N>>class Program
N>>{
N>>    static void Main()
N>>    {
N>>        object o = typeof (int) + null;
N>>        Console.WriteLine(o.GetType());
N>>        Console.WriteLine(o);
N>>    }
N>>}
N>>


D>злобно


D>из той же оперы


D>
D>using System;
D>class Program
D>{
D>    static void Main()
D>    {
D>        Console.WriteLine(((object)null + null).GetType());
D>    }
D>}
D>


Еще вариант:
using System;
class Program
{
    static void Main()
    {
        Console.WriteLine( (1 + null).GetType() );
    }
}


... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: object + string
От: Morpheus_  
Дата: 10.01.07 12:31
Оценка:
M_> Еще вариант:
M_>
M_>using System;
M_>class Program
M_>{
M_>    static void Main()
M_>    {
M_>        Console.WriteLine( (1 + null).GetType() );
M_>    }
M_>}
M_>


и еще:

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine( (null + null).GetType() );
    }
}


... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.