0Pricing
C# Academy · Lekcja

Informacje na poziomie źródła (atrybuty Caller)

Proszę używać CallerMemberName, CallerFilePath i CallerLineNumber do przechwytywania informacji o miejscu wywołania na potrzeby logów, walidacji i powiadomień o właściwościach.

Informacje na poziomie źródła (atrybuty Caller) to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.

Po co informacje o wywołującym

Cel: Automatyczne przechwytywanie informacji o miejscu wywołania.

  • CallerMemberName — kto wywołał
  • CallerFilePath — który plik
  • CallerLineNumber — który wiersz
  • Świetnie sprawdza się w logach, walidacji i powiadomieniach

Nazwa składowej w logach

CallerMemberName automatycznie uzupełnia nazwę metody lub właściwości wywołującego, gdy argument zostanie pominięty.

using System;
using System.Runtime.CompilerServices;

public static class Log
{
  // Caller fills "member" automatically if not provided
  public static void Info(string msg, [CallerMemberName] string member = null)
  {
    Console.WriteLine("[" + (member ?? "?") + "] " + msg);
  }
}

public class Program
{
  static void DoWork() { Log.Info("started"); }

  public static void Main(string[] args)
  {
    Log.Info("app boot");
    DoWork(); // prints caller method name
  }
}

Informacje o pliku i wierszu

Należy dodać CallerFilePath i CallerLineNumber, aby uzyskać precyzyjne informacje diagnostyczne.

using System;
using System.Runtime.CompilerServices;

public static class Diag
{
  public static void Trace(string msg,
    [CallerFilePath] string file = null,
    [CallerLineNumber] int line = 0,
    [CallerMemberName] string member = null)
  {
    Console.WriteLine(file + ":" + line + " in " + member + " -> " + msg);
  }
}

public class Program
{
  static void Step() { Diag.Trace("stepping"); }

  public static void Main(string[] args)
  {
    Diag.Trace("start");
    Step();
  }
}

Powiadomienia o właściwościach

Należy używać CallerMemberName w setterach lub pomocniczych metodach zdarzeń, aby uniknąć ciągów wpisywanych na stałe.

using System;
using System.Runtime.CompilerServices;

public class Person
{
  private string _name;

  // Notify helper uses CallerMemberName so callers need not pass the property name
  void Notify([CallerMemberName] string property = null)
  {
    Console.WriteLine("Changed: " + property);
  }

  public string Name
  {
    get { return _name; }
    set { _name = value; Notify(); } // property name auto-filled
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Person p = new Person();
    p.Name = "Ada"; // prints "Changed: Name"
  }
}

Sprawdzanie z nazwą wywołującego

Informacje o wywołującym sprawiają, że komunikaty walidacyjne są bardziej zrozumiałe bez ręcznego wpisywania ciągów.

using System;
using System.Runtime.CompilerServices;

public static class Guard
{
  public static void NotNull(object x, [CallerMemberName] string caller = null)
  {
    if (x == null) throw new ArgumentNullException("value", "Null passed by " + (caller ?? "?"));
  }
}

public class Program
{
  static void Save(string path)
  {
    Guard.NotNull(path); // if null, message includes "Save"
    Console.WriteLine("Saving to " + path);
  }

  public static void Main(string[] args)
  {
    try
    {
      Save(null);
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.Message);
    }
  }
}

Wskazówki i uwagi

Uwagi:

  • Atrybuty wywołującego działają w przypadku parametrów opcjonalnych z wartościami domyślnymi.
  • Nie należy polegać na dokładnych ścieżkach plików w przypadku danych poufnych, ponieważ ścieżki mogą ujawniać foldery.
  • Świetnie sprawdzają się w logowaniu, diagnostyce i obsłudze zdarzeń zmiany właściwości.

Atrybut nazwy wywołującego

Szybkie sprawdzenie: który atrybut pozwala metodzie uzyskać nazwę wywołującego jako domyślną wartość parametru?

Podsumowanie

Podsumowanie: Należy dodać CallerMemberName, CallerFilePath i CallerLineNumber do parametrów opcjonalnych, aby bez dodatkowego kodu przechwytywać kontekst wywołującego.

Często zadawane pytania

Czy lekcja „Informacje na poziomie źródła (atrybuty Caller)” jest bezpłatna?

Tak — pełny tekst „Informacje na poziomie źródła (atrybuty Caller)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Informacje na poziomie źródła (atrybuty Caller)”?

Proszę używać CallerMemberName, CallerFilePath i CallerLineNumber do przechwytywania informacji o miejscu wywołania na potrzeby logów, walidacji i powiadomień o właściwościach. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 3.

Ile czasu zajmuje lekcja „Informacje na poziomie źródła (atrybuty Caller)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Type, MethodInfo, aktywacja i własne atrybuty
  2. Informacje na poziomie źródła (atrybuty Caller)
  3. Lekkie scenariusze metaprogramowania
← Powrót do C# Academy