2013-11-26 21 views
7

Ben şu ifadelere bakıyordu:Neden string.Join (string, object []) özeldir?

onlar aynı değeri döndürecektir sanırdım
string.Join(",", new object[] { null, "StackOverflow" }) 
string.Join(",", new string[] { null, "StackOverflow" }) 
string.Join(",", new object[] { string.Empty, "StackOverflow" }) 
string.Join(",", new string[] { string.Empty, "StackOverflow" }) 

:

,StackOverflow 

Ancak, ilk ifadesi aslında string.Empty döndürür. Bu is actually defined behavior:

değerlerin birinci elemanı boş ise, katıl yöntem değerlerinde elemanları birleştirmek etmez (String, [] Nesne), fakat bunun yerine String.Empty döndürür. Bu sorun için bir dizi geçici çözüm bulunmaktadır. Aşağıdaki örnekte gösterildiği gibi, en kolay dizi dizinin ilk elemanına String.Empty değerini atamaktır.

Bu tutarsızlığın nedenini bilen var mı? favori decompiler olarak

+0

olan ("geçici çözüm", "mesele"), ben bir hata değil, bir hedeflenen bir davranış olduğu varsayılabilir ... – Vache

+0

@Vache No, Bu kasıtlı olarak kodlanmıştır. Bunu görmek için reflektörde açın .. –

+0

@SriramSakthivel Evet, bunu görebiliyorum, ancak birkaç satır aşağıda bu davranışla çelişen bazı kodlar var. İlk öğenin dize temsili için bir null değeriyle ilgilenen bir "var" var. – Vache

cevap

3

Eğer yöntem için kodu özel davranış için

public static string Join(string separator, params object[] values) 
{ 
    if (values == null) 
    throw new ArgumentNullException("values"); 
    if (values.Length == 0 || values[0] == null) 
    return string.Empty; 
    if (separator == null) 
    separator = string.Empty; 
    StringBuilder sb = StringBuilderCache.Acquire(16); 
    string str1 = values[0].ToString(); 
    if (str1 != null) 
    sb.Append(str1); 
    for (int index = 1; index < values.Length; ++index) 
    { 
    sb.Append(separator); 
    if (values[index] != null) 
    { 
     string str2 = values[index].ToString(); 
     if (str2 != null) 
     sb.Append(str2); 
    } 
    } 
    return StringBuilderCache.GetStringAndRelease(sb); 
} 

parçası sorumlu olduğunu görüyoruz

if (values.Length == 0 || values[0] == null) 
    return string.Empty; 

ama biz

altında birkaç satır görebileceğini
string str1 = values[0].ToString(); 
    if (str1 != null) 
    sb.Append(str1); 

values[0] == null'a dönmek benim için oldukça garip görünüyor amaişlemek için. MSDN ("issue", "workaround") üzerindeki ifadeyle birlikte, bu aşırı yükün nispeten yeni olduğu (.NET 4.0) ve diğer Join s ilk eleman olarak null kabul eden farklı bir uygulamaya sahip olması gerçeği. bana bir hata gibi görünüyor ve amaçlanan bir istisna değil. Tabii

, bu sadece benim yorumum değil kesin bir cevap ... phrasing bu tür ile

+1

Emin değil 'değerler [0] .ToString() == null' bir şey gösterir. Değerler [0] '' null' ise bir 'NullReferenceException 'atardı. Birisinin “ToString” den 'null' döndürmediğinden emin olmak için kontrol ediyor. – Anthony

+0

Benim için değerlerin kontrol edilmesi önemlidir [0] .ToString() == null' çünkü 'değerler [0]' null olmayabilir ama 'ToString() ' –

+0

@Anthony' yi geçersiz kılarak boşverir. 'Null' dize temsili olan nesneleri ele alıyoruz, niçin null 'nı işlemeyelim? Bu bana tutarsız görünüyor. – Vache

İlgili konular