Ayrılmış öznitelikler: Çağıranın bilgilerini belirleme
Bilgi özniteliklerini kullanarak, bir yönteme çağıran hakkında bilgi edinebilirsiniz. Kaynak kodun dosya yolunu, kaynak kodundaki satır numarasını ve çağıranın üye adını elde edin. Üye çağıranı bilgilerini almak için isteğe bağlı parametrelere uygulanan öznitelikleri kullanırsiniz. Her isteğe bağlı parametre varsayılan bir değer belirtir. Aşağıdaki tabloda, ad alanı içinde tanımlanan Çağıran Bilgisi öznitelikleri System.Runtime.CompilerServices liste almaktadır:
| Öznitelik | Açıklama | Tür |
|---|---|---|
| CallerFilePathAttribute | Kaynak dosyasının arayanı içeren tam yolu. Tam yol, derleme zamanında yoldur. | String |
| CallerLineNumberAttribute | Yöntemin çağrıldı olduğu kaynak dosyada satır numarası. | Integer |
| CallerMemberNameAttribute | Çağıranın yöntem adı veya özellik adı. | String |
| CallerArgumentExpressionAttribute | Bağımsız değişken ifadesinin dize gösterimi. | String |
Bu bilgiler, izleme ve hata ayıklamada size yardımcı olur ve tanılama araçları oluşturmanıza yardımcı olur. Aşağıdaki örnekte, çağıranın bilgi özniteliklerini nasıl kullanabileceğiniz gösterir. Yöntemine yapılan her TraceMessage çağrıda, isteğe bağlı parametrelere bağımsız değişkenler için çağıran bilgileri eklenir.
public void DoProcessing()
{
TraceMessage("Something happened.");
}
public void TraceMessage(string message,
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
{
Trace.WriteLine("message: " + message);
Trace.WriteLine("member name: " + memberName);
Trace.WriteLine("source file path: " + sourceFilePath);
Trace.WriteLine("source line number: " + sourceLineNumber);
}
// Sample Output:
// message: Something happened.
// member name: DoProcessing
// source file path: c:\Visual Studio Projects\CallerInfoCS\CallerInfoCS\Form1.cs
// source line number: 31
İsteğe bağlı her parametre için açık bir varsayılan değer belirtirsiniz. İsteğe bağlı olarak belirtilmemiş parametrelere çağıranın bilgi özniteliklerini uygulayayazın. Çağıran bilgi öznitelikleri parametreyi isteğe bağlı hale değildir. Bunun yerine, bağımsız değişken atlandığında geçirilen varsayılan değeri etkilerler. Çağıran bilgisi değerleri, derleme zamanında Ara Dile (IL) değişmez değerler olarak yayılıyor. Özel durumlar için StackTrace özelliğinin sonuçlarından farklı olarak, sonuçlar karartmadan etkilenmez. Arayan bilgisini denetlemek veya gizlemek için isteğe bağlı bağımsız değişkenleri açıkça sağlayabilirsiniz.
Üye adları
Üye adını CallerMemberName çağrılı yönteme bağımsız değişken olarak belirtmekten String kaçınmak için özniteliğini kullanabilirsiniz. Bu tekniği kullanarak Yeniden Adlandırma Yeniden Düzenlemesi'nin değerleri değiştirmesi sorununu String önlersiniz. Bu, özellikle aşağıdaki görevler için yararlı olur:
- İzleme ve tanılama yordamlarını kullanma.
- Verileri INotifyPropertyChanged bağlarken arabirimi uygulama. Bu arabirim, bir nesnenin özelliğinin, özelliğin değiştiğini bir bağlı denetime bildirmesi için izin verir. Denetim güncelleştirilmiş bilgileri görüntüler. özniteliği
CallerMemberNameolmadan özellik adını değişmez değer olarak belirtmeniz gerekir.
Aşağıdaki grafik, özniteliğini kullanırken döndürülen üye adlarını CallerMemberName gösterir.
| Çağrılar şu içinde gerçekleşir: | Üye adı sonucu |
|---|---|
| Yöntem, özellik veya olay | Yöntemin, özelliğin veya aramanın kaynaklandığı olayın adı. |
| Oluşturucu | ".ctor" dizesi |
| Statik oluşturucu | ".cctor" dizesi |
| Sonlandırıcıyı | "Finalize" dizesi |
| Kullanıcı tanımlı işleçler veya dönüştürmeler | Üye için oluşturulan "op_Addition" gibi bir ad. |
| Öznitelik oluşturucu | Özniteliğin uygulandığı yöntemin veya özelliğin adı. Öznitelik bir üye içerisindeki herhangi bir öğeyse (parametre, dönüş değeri veya genel tür parametresi gibi), bu sonuç bu öğeyle ilişkili öğenin adıdır. |
| İçeren üye yok (örneğin, derleme düzeyi veya türlere uygulanan öznitelikler) | İsteğe bağlı parametrenin varsayılan değeri. |
Bağımsız değişken ifadeleri
İfadenin System.Runtime.CompilerServices.CallerArgumentExpressionAttribute bağımsız değişken olarak geçirilemesi için kullanın. Tanılama kitaplıkları, bağımsız değişkenlere geçirilen ifadeler hakkında daha fazla ayrıntı sağlamak istiyor olabilir. Geliştiriciler parametre adına ek olarak tanılamayı tetikleyen ifadeyi sağlayarak tanılamayı tetikleyen koşul hakkında daha fazla ayrıntıya sahip olur. Bu ek bilgiler düzeltmeyi kolaylaştırır.
Aşağıdaki örnek, geçersiz olduğunda bağımsız değişken hakkında nasıl ayrıntılı bilgi sağyul sağlaycazı gösterir:
public static void ValidateArgument(string parameterName, bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
if (!condition)
{
throw new ArgumentException($"Argument failed validation: <{message}>", parameterName);
}
}
Bunu aşağıdaki örnekte gösterildiği gibi çağırırken:
public void Operation(Action func)
{
Utilities.ValidateArgument(nameof(func), func is not null);
func();
}
için kullanılan condition ifade, derleyici tarafından bağımsız değişkenine message eklemedir. Bir geliştirici bağımsız Operation null değişkenle çağırsa, aşağıdaki ileti içinde ArgumentException depolanır:
Argument failed validation: <func is not null>
Bu öznitelik, daha fazla ayrıntı sağlayan tanılama yardımcı programları yazmanız için olanak sağlar. Geliştiriciler hangi değişikliklerin gerektiğini daha hızlı anlayacaktır. Uzantı yöntemleri için CallerArgumentExpressionAttribute alıcı olarak kullanılan ifadeyi belirlemek için de kullanabilirsiniz. Aşağıdaki yöntem düzenli aralıklarla bir dizi örneği gösterir. Dizi sıklıktan daha az öğeye sahipse bir hata raporlar:
public static IEnumerable<T> Sample<T>(this IEnumerable<T> sequence, int frequency,
[CallerArgumentExpression("sequence")] string? message = null)
{
if (sequence.Count() < frequency)
throw new ArgumentException($"Expression doesn't have enough elements: {message}", nameof(sequence));
int i = 0;
foreach (T item in sequence)
{
if (i++ % frequency == 0)
yield return item;
}
}
Bu yöntemi aşağıdaki gibi çağırabilirsiniz:
sample = Enumerable.Range(0, 10).Sample(100);
Yukarıdaki örnek, iletisi aşağıdaki ArgumentException metin olan bir atar:
Expression doesn't have enough elements: Enumerable.Range(0, 10) (Parameter 'sequence')