Her zaman uygundur ancak sergilediklerinizin ardındaki niyetleri dikkatlice değerlendirin
Daha iyi bir soru sormak olacaktır:
ToString () neden geçersiz kılınsın?
ToString (), bir nesnenin durumuna açılan penceredir. Bir gereklilik olarak devlete vurgu . Java / C # gibi güçlü OOP dilleri, bir sınıftaki her şeyi kapsayarak OOP modelini kötüye kullanır. Güçlü OOP modelini takip etmeyen bir dilde kodladığınızı hayal edin; Bir sınıf mı yoksa bir işlev mi kullanacağınızı düşünün. Bunu bir işlev (yani fiil, eylem) olarak kullanırsanız ve dahili durum yalnızca giriş / çıkış arasında geçici olarak korunursa, ToString () değer katmaz.
Diğerleri de söylediğim gibi, dikkate almak önemlidir ne hata ayıklayıcı veya diğer sistemler tarafından kullanılabilir çünkü () ToString ile çıkış.
ToString yöntemini bir nesnenin --help parametresi olarak hayal etmeyi seviyorum. Kısa, okunabilir, açık ve gösterimi kolay olmalıdır. Nesnenin yaptığı şey olmadığını göstermelidir . Tüm bunları akılda tutarak düşünelim ...
Kullanım Örneği - Bir TCP paketini ayrıştırma:
Yalnızca uygulama düzeyinde bir ağ yakalama değil, pcap yakalama gibi daha fazla et içeren bir şey.
Yalnızca TCP katmanı için ToString () 'i aşırı yüklemek istiyorsunuz, böylece verileri konsola yazdırabilirsiniz. Neleri içerir? Delirebilir ve tüm TCP ayrıntılarını ayrıştırabilirsiniz (yani TCP karmaşıktır) ...
Aşağıdakileri içerir:
- Kaynak bağlantı noktası
- Hedef Bağlantı Noktası
- Sıra numarası
- Onay numarası
- Veri ofseti
- Bayraklar
- Pencere Uzaklığı
- Sağlama toplamı
- Acil İşaretçi
- Seçenekler ( oraya bile gitmiyorum)
Ancak, TCP.ToString () 'i 100 paket üzerinde ararsanız, tüm bu gereksiz dosyaları almak ister miydiniz? Tabii ki hayır, bilgi aşırı yüklemesi olur. Kolay ve açık seçim aynı zamanda en mantıklı olanıdır ...
İnsanların görmeyi bekleyeceği şeyleri ortaya çıkarın:
- Kaynak bağlantı noktası
- Hedef Bağlantı Noktası
İnsanların çözümlemesi kolay, ancak YMMV olan mantıklı bir çıktıyı tercih ederim .
TCP:[destination:000, source:000]
Karmaşık bir şey değil, çıktı makinelerin ayrıştırması için değildir (yani, insanlar kodunuzu kötüye kullanmadıkça), amaçlanan amaç insanın okunabilirliği içindir.
Peki ya daha önce bahsettiğim tüm bu sulu bilgilerin geri kalanı, bu da yararlı değil mi? Buna ulaşacağım ama önce ...
ToString () tüm zamanların en değerli ve az kullanılan yöntemlerinden biri
İki nedenden dolayı:
- İnsanlar ToString () 'in ne için olduğunu anlamıyor
- Temel 'Object' sınıfında aynı derecede önemli başka bir dize yöntemi eksik.
Sebep 1 - ToString'in () faydasını kötüye kullanmayın:
Pek çok kişi, bir nesnenin basit bir dizgi temsilini çekmek için ToString () kullanır. C # kılavuzu bile şunu belirtir:
ToString, .NET Framework'teki ana biçimlendirme yöntemidir. Bir nesneyi gösterime uygun olacak şekilde dizgi temsiline dönüştürür.
Daha fazla işleme değil , görüntüleyin . Bu, yukarıdaki TCP paketinin güzel dize temsilini alıp bir regex :: cringe :: kullanarak kaynak bağlantı noktasını çekin anlamına gelmez.
Doğru şeyleri yapmanın yolu, SourcePort mülkiyet doğrudan çağrı ToString () (BTW ToString böylece ushort () zaten mevcut olmalıdır) 'dir.
Makine ayrıştırması için karmaşık bir nesnenin durumunu paketlemek için daha sağlam bir şeye ihtiyacınız varsa, yapılandırılmış bir serileştirme stratejisi kullanmanız daha iyi olacaktır.
Neyse ki, bu tür stratejiler çok yaygındır:
- ISerializable (C #)
- Turşu (Python)
- JSON (Javascript veya onu uygulayan herhangi bir dil)
- SABUN
- vb...
Not: PHP'yi kullanmıyorsanız, çünkü herp-derp, bunun için bir işlev vardır :: snicker ::
Neden 2 - ToString () yeterli değil:
Henüz bunu özünde uygulayan bir dil görmedim, ancak bu yaklaşımın varyasyonlarını vahşi doğada gördüm ve kullandım.
Bunlardan bazıları şunları içerir:
- ToVerboseString ()
- ToString (ayrıntılı = doğru)
Temel olarak, bir TCP paketinin en durumunun o kıllı karışıklık gerektiğini insan okunabilmesi için tarif edilebilir. TCP hakkında konuşurken 'ölü bir atı dövmekten' kaçınmak için, ToString () ve ToVerboseString () 'nin yetersiz kullanıldığını düşündüğüm 1 numaralı duruma' parmağımı göstereceğim '...
Kullanım Örneği - Diziler:
Öncelikle bir dil kullanıyorsanız, muhtemelen o dilin yaklaşımından memnunsunuzdur. Benim gibi farklı diller arasında geçiş yapan insanlar için çeşitli yaklaşımların sayısı rahatsız edici olabilir.
Yani, bunun beni kaç kez sinirlendirdiği, her Hindu tanrısının tüm parmaklarının toplamından daha fazla.
Orada çeşitli diller ortak kullanım durumları kesmek ve bir kaç olduğunu olsun onu doğru . Bazıları tekerleği yeniden icat etmeyi gerektirir, bazıları sığ bir çöplük yapar, diğerleri derin bir çöplük yapar, hiçbiri benim istediğim gibi çalışmaz ...
İstediğim şey çok basit bir yaklaşım:
print(array.ToString());
Çıktılar: 'Dizi [x]' veya 'Dizi [x] [y]'
Burada x, birinci boyuttaki öğe sayısı ve y, ikinci boyuttaki öğe sayısı veya 2. boyutun pürüzlü olduğunu gösteren bir değerdir (min / maks aralık olabilir mi?).
Ve:
print(array.ToVerboseString());
Güzel şeyleri takdir ettiğim için tüm o-patlamasını güzel baskılı çıktılar.
Umarım bu beni uzun zamandır rahatsız eden bir konuya biraz ışık tutar. En azından PHP'çıların bu yanıta olumsuz oy vermeleri için küçük bir trol yemi serptim.
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
veya benzerini kullanarak dışarı atmak için kullanıyor gibi görünüyor .