Aracılığıyla paylaş


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ğrıcı 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, System.Runtime.CompilerServices ad alanında tanımlanan Arayan Bilgilerine ait öznitelikler listelenir.

Özellik Açıklama Türü
CallerFilePathAttribute Çağıranı içeren kaynak dosyanın 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 etkiler. Ç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, belirsizleştirme sonuçları etkilemez. Arayan bilgilerini denetlemek veya arayan bilgilerini gizlemek için isteğe bağlı bağımsız değişkenleri açıkça sağlayabilirsiniz.

Üye adları

Özniteliği, üye adını çağrılan yönteme bağımsız bir değişken olarak belirtmekten kaçınmak amacıyla kullanabilirsiniz. Bu tekniği kullanarak, Yeniden Adlandırma Yeniden Düzenleme değerleri değiştirmediği için ortaya çıkan String sorununu önlersiniz. Bu avantaj özellikle aşağıdaki görevler için kullanışlıdır:

  • İzleme ve tanılama yordamlarını kullanma.
  • Verileri bağlarken INotifyPropertyChanged arabirimini uygulama. Bu arabirim, bir nesnenin özelliğinin, bir bağlı denetime özelliğin değiştiğini bildirmesini sağlar. 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 Çağrının kaynaklandığı yöntemin, özelliğin veya olayın adı.
Yapıcı ".ctor" dizesi
Statik oluşturucu ".cctor" dizesi
Sonlandırıcı "Finalize" dizesi
Kullanıcı tanımlı işleçler veya dönüştürmeler Üye için oluşturulan ad( örneğin, "op_Addition").
Öznitelik oluşturucu Özniteliğin uygulandığı yöntemin veya özelliğin adı. Öznitelik bir üyenin içindeki herhangi bir öğeyse (parametre, dönüş değeri veya genel tür parametresi gibi), bu sonuç bu öğeyle ilişkilendirilmiş üyenin 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ğlayabilir. 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();
}

Derleyici, için condition kullanılan ifadeyi bağımsız değişkenine message ekler. Bir geliştirici bağımsız Operation değişkenle çağırdığındanull, 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ı üyeleri 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:

extension<T>(IEnumerable<T> sequence)
{
    public IEnumerable<T> Sample(int frequency, 
        [CallerArgumentExpression(nameof(sequence))] string? message = null)
    {
        if (sequence.Count() < frequency)
            throw new InvalidOperationException($"Expression doesn't have enough elements: {message}");
        int i = 0;
        foreach (T item in sequence)
        {
            if (i++ % frequency == 0)
                yield return item;
        }
    }
}

Önceki örnekte parametresi nameofiçin işleci kullanılırsequence. 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 bakınız