C # yöntemi adlandırma kuralları: ToSomething vs. AsSomething


82

İş mantığı nesnelerim için bazı uzantı yöntemleri yazarken, dönüştürme yöntemlerini yeniden adlandırma sorusuna geldim. someObject.ToAnotherObject()yaygın olarak kullanılanlarla iyi gider object.ToString().

Bununla birlikte, örneğin LINQ, her iki çeşidi de karıştırıyor ve aralarında bir fark bulamıyorum. ToDictionary(), ToList(), AsParallel(), AsQueryable(), ...

Bu iki adlandırma kuralı arasındaki farklar nelerdir ve kendi sınıflarım için kullanıp kullanmamaya karar vermem için ne bilmeliyim?

Yanıtlar:


91

ToDictionaryve ToListöneki ile Tomutlaka orijinal koleksiyon veya özelliklerinin yapısal kimliğini korumak yok çünkü.

  • Bir Dönüşüm List<T>bir içine Dictionary<K, V>yepyeni bir yapıya sahip bir koleksiyon oluşturur.
  • A'yı a'ya HashSet<T>dönüştürmek List<T>, kümelerin benzersizlik özelliğini kaldırır.

Ön eki olan yöntemler Asbunlardan hiçbirini yapmaz - sadece orijinal koleksiyonun alternatif bir görünümünü sağlarlar . Zenginleştiriyorlar.


41
Yani, bir elmayı .AsCleanApple()sadece .ToFruitSalad()yıkamam
gerektiği

3
@Physikbuddha Temelde, evet.
MKII

38
@Physikbuddha O bana öyle geliyor AsCleanAppleedecektir değiştirmek elma hakkında bir şey. Daha iyi bir benzetme şöyle olabilirAsFruit
dcastro

4
.AsCleanAppleSource()elma kaynağı olan bir şeyi temiz elma kaynağı olan bir şeye dönüştürürdü; gerekirse bir yıkama adımı eklemek ama belki de hiçbir şey yapmamak elmaların zaten temiz olduğu biliniyordu. .ToPunnet()bu kaynağa erişir ve size bir elma sepeti verir.
Jon Hanna

2
Bu kesinlikle doğru değildir, ancak genel olarak "AsXXX ()" 'i bir kademe olarak ve "ToXXX ()" bir dönüşüm olarak düşünebilirsiniz.
nateirvin

26

Linq'te, ToXXXyöntemlerin tümü sorguyu yürütür ve sonuçlardan yeni bir nesne yaratırken, AsXXXyöntemler bir şekilde farklı olan yeni bir sorgu üretir. Aynı nesne olabilir ama (farklı arayüz üzerinden erişilen olabilir AsEnumerable()bunu yapar) ya da yeni bir nesne olabilir değiştirir işlevselliği (diğer yöntemler onlar sadece verilen nesneyi döndürmek eğer bazı onay görmek için olsa örneğin Bunu yapmak AsQueryable()olacak halihazırda sourceuygulanıyorsa return IQueryable<T>veya EnumerableQuery<TElement>aksi takdirde yeni bir tane oluştur ).


that alters how the functionality- howGereksiz mi yoksa ifadenin bir sonraki kısmı mı olmalı?
Kapol

@Kapol hayır, sadece aynı anda yazmanın ve yazmanın neden olduğu bir yazım hatası.
Jon Hanna

Bunun doğru yanıt olduğunu düşünüyorum, yani orijinal örneğin aktif ve statik projeksiyonu. ToXXX()verileri orijinaliyle hiçbir ilişkisi olmadan yansıtır. AsXXX()orijinal ile aktif bir ilişki sürdürür (en azından tartıştığımız Numaralandırılabilir / Sorgulanabilir örneklerde).
Tim Medora

+1 ToXXX execute the queryve AsXXX produce a new query. LINQ'da okuduklarımdan doğru geliyor ve MSDN ToXXX'i onaylıyor gibi görünüyor , ancak tüm AsXXX yöntemlerin ertelenmiş yürütme olup olmadığına dair herhangi birinin bir kaynağı olup olmadığını merak ediyorum.
brichins

1
@brichins, herhangi birimizin Linq'e AsXXXözgü olanların üstüne bir AsParallelyenisini ekleyen yeni bir sağlayıcıyla gelebileceğini göz önünde bulundurarak "tümü" demenin anlamlı bir yolu bile var (örneğin, PLinq tarafından eklenen, AsNoTrackingEntity Framework tarafından sağlanan, ve bunun gibi). Elbette, linq çekirdek olarak tabir edilir Queryableve Enumerableve bu iki sınıf hem takip kongre söyledi. "Hepsi" nin muhtemelen doğru olacağı ölçüde, çoğu ekleme yapar, ancak her zaman doğru olamayacak kadar açıktır (yine de herhangi bir kırılmayı bir tasarım hatası olarak düşünürdüm).
Jon Hanna
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.