C# derleyicisi tarafından yorumlanan öznitelikleri kullanarak çağıran bilgilerini belirleme

Bilgi özniteliklerini kullanarak, bir yönteme çağıran hakkında bilgi edinirsiniz. Kaynak kodun dosya yolunu, kaynak kodundaki satır numarasını ve çağıranın üye adını alırsınız. Üye çağıran bilgilerini almak için isteğe bağlı parametrelere uygulanan öznitelikleri kullanırsınız. İsteğe bağlı her parametre bir varsayılan değer belirtir. Aşağıdaki tabloda, ad alanında System.Runtime.CompilerServices tanımlanan Arayan Bilgisi öznitelikleri listelenir:

Öznitelik Açıklama Tür
CallerFilePathAttribute Kaynak dosyasının arayanı içeren tam yolu. Tam yol, derleme zamanındaki yoldur. String
CallerLineNumberAttribute Yönteminin çağrıldığı kaynak dosyadaki 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ıklama konusunda size yardımcı olur ve tanılama araçları oluşturmanıza yardımcı olur. Aşağıdaki örnekte, çağıran bilgi özniteliklerinin nasıl kullanılacağı gösterilmektedir. yöntemine yapılan TraceMessage her çağrıda, isteğe bağlı parametrelerin bağımsız değişkenleri 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 belirtilmeyen parametrelere çağıran bilgi özniteliklerini uygulayamazsınız. Çağıran bilgi öznitelikleri bir parametreyi isteğe bağlı yapmaz. Bunun yerine, bağımsız değişken atlandığında geçirilen varsayılan değeri etkilerler. Çağıran bilgi değerleri, derleme zamanında Ara Dile (IL) değişmez değer olarak yayılır. Özel durumlar için özelliğinin StackTrace 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ı çağrılan yöntemin CallerMemberName bağımsız String değişkeni olarak belirtmekten kaçınmak için özniteliğini kullanabilirsiniz. Bu tekniği kullanarak, Yeniden Düzenlemeyi Yeniden Adlandır'ın değerleri değiştirmemesi String sorununu önlersiniz. Bu, özellikle aşağıdaki görevler için yararlı olur:

  • İzleme ve tanılama yordamlarını kullanma.
  • Verileri bağlarken arabirimi uygulama INotifyPropertyChanged . Bu arabirim, bir nesnenin özelliğinin, özelliğin değiştirildiğini ilişkili denetime bildirmesine olanak tanır. Denetim güncelleştirilmiş bilgileri görüntüleyebilir. CallerMemberName özniteliği olmadan, özellik adını değişmez değer olarak belirtmeniz gerekir.

Aşağıdaki grafik, özniteliğini kullandığınızda CallerMemberName döndürülen üye adlarını gösterir.

Aramalar Ü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çirilmesini istediğinizde öğesini kullanırsınız. Tanılama kitaplıkları, bağımsız değişkenlere geçirilen ifadeler hakkında daha fazla ayrıntı sağlamak isteyebilir. 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 sahiptir. Bu ek bilgiler düzeltmeyi kolaylaştırır.

Aşağıdaki örnekte bağımsız değişken geçersiz olduğunda bağımsız değişken hakkında nasıl ayrıntılı bilgi sağlayabileceğiniz gösterilmektedir:

public static void ValidateArgument(string parameterName, bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
    if (!condition)
    {
        throw new ArgumentException($"Argument failed validation: <{message}>", parameterName);
    }
}

Aşağıdaki örnekte gösterildiği gibi çağırabilirsiniz:

public void Operation(Action func)
{
    Utilities.ValidateArgument(nameof(func), func is not null);
    func();
}

için condition kullanılan ifade, derleyici tarafından bağımsız değişkene message eklenir. Bir geliştirici bağımsız null değişkenle çağırdığındaOperation, aşağıdaki ileti içinde ArgumentExceptiondepolanır:

Argument failed validation: <func is not null>

Bu öznitelik, daha fazla ayrıntı sağlayan tanılama yardımcı programları yazmanızı sağlar. Geliştiriciler hangi değişikliklerin gerekli olduğunu daha hızlı anlayabilir. Uzantı yöntemleri için alıcı olarak hangi ifadenin kullanıldığını belirlemek için de kullanabilirsiniz CallerArgumentExpressionAttribute . Aşağıdaki yöntem düzenli aralıklarla bir diziyi örneklemektedir. Dizi sıklık değerinden daha az öğeye sahipse bir hata bildirir:

public static IEnumerable<T> Sample<T>(this IEnumerable<T> sequence, int frequency, 
    [CallerArgumentExpression(nameof(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;
    }
}

Önceki örnekte parametresi sequenceiçin işleci kullanılırnameof. Bu özellik C# 11'de kullanılabilir. C# 11'in öncesinde parametrenin adını dize olarak yazmanız gerekir. Bu yöntemi aşağıdaki gibi çağırabilirsiniz:

sample = Enumerable.Range(0, 10).Sample(100);

Yukarıdaki örnek, iletisi aşağıdaki metin olan bir ArgumentException ileti oluşturur:

Expression doesn't have enough elements: Enumerable.Range(0, 10) (Parameter 'sequence')

Ayrıca bkz.