c# - Genel tür kodunda (köşeli parantez tarzı) tür parametresi için bir adlandırma kuralı var mı?
Genel tür kodunda tür parametreleri için bir adlandırma kuralı var mı?
Şu anda biraz TypeScript yapıyorum ama C#, Java, AS3 vb. ile aynı tür parametreleştirme tarzına sahip.
En çok kullanılan T yi görüyorum, ayrıca şunlarda:
interface Container<T> {
getContent(): List<T>;
}
Ama ya birden fazla tipe ihtiyacınız olursa? Genellikle T, U ve V gibi tek harfler görüyorum. Bazen K ve V de eşlemelerin anahtarı ve değeri için kullanılır.
Bunun için mutlaka en iyi uygulama olmalı değil mi?
Cevap #1
Yaygın olarak benimsenmiş bir standart, birden fazla amaçsız genel tür parametresi varsa (yani parametrelerin amacı sınıfın kendisinden bilinmiyorsa, bu yüzden onlara daha açıklayıcı bir isim veremezsiniz) T1, T2, T3 vb.'dir.
İyi bir örnek olarak buradaki Tuple sınıfına bakın.
Tuple aşağıdaki biçimlere sahiptir:
Tuple<T1>
Tuple<T1, T2>
Tuple<T1, T2, T3>
Tuple<T1, T2, T3, T4>
Tuple<T1, T2, T3, T4, T5>
Tuple<T1, T2, T3, T4, T5, T6>
Tuple<T1, T2, T3, T4, T5, T6, T7>
Böyle durumlarda başka bir şey kullanmak, kodunuzu okuyan herkes için muhtemelen kafa karıştırıcı olacaktır. T1, T2, T3 gördüklerinde, herkes bunların genel tür parametreleri olduğunu anlayacaktır.
Ancak, önceden tanımlanmış amaçlara sahip genel parametreler durumunda, belirli isimler daha uygundur. @AlexeiLevenkov'un belirttiği gibi, dönüş değerleri için de herhangi bir başka tür argümanından ayırt etmek amacıyla TResult kullanmak çok yaygındır. Func bunun iyi bir örneğini, aşağıdaki örnekle birlikte, belgede burada açıklanmıştır:
public delegate TResult Func<in T, out TResult>(
T arg
)
Benzer şekilde, Dictionary tür parametreleri olarak <TKey, TValue> kullanır. Bunun nedeni, hangisinin hangisi olduğunu hemen anlamanın gerekmesidir. Sınıf kodu TKey veya TValue'nin ne olduğunu bilmez, ama bu parametrelerin anahtarları ve değerleri temsil ettiğini bilir, bu yüzden bu bilgiyi parametre adında koymak mantıklıdır.
Microsoft'un burada bazı (eski!) isimlendirme yönergeleri var, ve başka ilginç bir durumu ele alıyorlar. Bir tür parametresine konulan kısıtlamaların parametrenin kendi isminde belirtilmesini öneriyorlar, şu şekilde:
public interface ISessionChannel<TSession> where TSession : ISession
{
TSession Session { get; }
}
Bu durumda, genel parametrenin bir ISession olması gerektiği kısıtlandığı için, bu durumu parametreyi TSession olarak adlandırarak ifade etmek mantıklıdır.
