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
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
- Type, MethodInfo, aktywacja i własne atrybuty
- Informacje na poziomie źródła (atrybuty Caller)
- Lekkie scenariusze metaprogramowania