İle örneklenen, C # sınıflarında bir model vardır Dictionary.TryGetValue
ve int.TryParse
: bir yöntem olup döner bir işlem ve gerçek sonucu içeren bir takım parametre başarısını belirten bir Boole; işlem başarısız olursa, out parametresi null değerine ayarlanır.
C # 8'e bağlanamaz referansları kullandığımı ve kendi sınıfım için bir TryParse yöntemi yazmak istediğimi varsayalım. Doğru imza şudur:
public static bool TryParse(string s, out MyClass? result);
Sonuç yanlış durumda boş olduğundan, çıkış değişkeninin boş olarak işaretlenmesi gerekir.
Ancak, Try paterni genellikle şöyle kullanılır:
if (MyClass.TryParse(s, out var result))
{
// use result here
}
Sadece işlem başarılı olduğunda şubeye girdiğim için, sonuç o dalda asla boş olmamalıdır. Fakat onu null olarak işaretleyebildiğim için şimdi kontrol etmem ya da !
geçersiz kılmak için kullanmam gerekiyor:
if (MyClass.TryParse(s, out var result))
{
Console.WriteLine("Look: {0}", result.SomeProperty); // compiler warning, could be null
Console.WriteLine("Look: {0}", result!.SomeProperty); // need override
}
Bu çirkin ve biraz unergonomic.
Tipik kullanım şekli nedeniyle, başka bir seçeneğim var: sonuç türü hakkında yalan:
public static bool TryParse(string s, out MyClass result) // not nullable
{
// Happy path sets result to non-null and returns true.
// Error path does this:
result = null!; // override compiler complaint
return false;
}
Şimdi tipik kullanım daha da güzelleşiyor:
if (MyClass.TryParse(s, out var result))
{
Console.WriteLine("Look: {0}", result.SomeProperty); // no warning
}
ancak atipik kullanım aşağıdakileri yapması gerektiği uyarısını almaz:
else
{
Console.WriteLine("Fail: {0}", result.SomeProperty);
// Yes, result is in scope here. No, it will never be non-null.
// Yes, it will throw. No, the compiler won't warn about it.
}
Şimdi hangi yoldan gideceğimi bilmiyorum. C # dil ekibinden resmi bir öneri var mı? Bana bunun nasıl yapılacağını gösterebilecek null edilemeyen referanslara dönüştürülmüş herhangi bir CoreFX kodu var mı? ( TryParse
Yöntemleri aramaya başladım . IPAddress
Biri olan bir sınıftır, fakat corefx'in ana dalına dönüştürülmedi.)
Peki genel kod Dictionary.TryGetValue
bununla nasıl başa çıkıyor? (Muhtemelen MaybeNull
bulduğum şeyden özel bir nitelik ile.) Dictionary
NULL olmayan bir değer türünü başlattığımda ne olur ?
MyClass?
), ve üzerinde bircase MyClass myObj:
(ve isteğe bağlı) ile bir anahtar yapıncase null:
.