0Pricing
C# Academy · Lezione

Informazioni a livello di origine (attributi Caller)

Usate CallerMemberName, CallerFilePath e CallerLineNumber per acquisire informazioni sul punto di chiamata nei log, nei controlli di guardia e nelle notifiche delle proprietà.

Informazioni a livello di origine (attributi Caller) è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 2 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 3 lezioni in totale.

Perché usare le informazioni sul chiamante

Obiettivo: acquisire automaticamente le informazioni sul punto della chiamata.

  • CallerMemberName — chi ha effettuato la chiamata
  • CallerFilePath — quale file
  • CallerLineNumber — quale riga
  • Utile per log, controlli e notifiche

Nome del membro nei log

CallerMemberName inserisce automaticamente il nome del metodo o della proprietà del chiamante quando l'argomento viene omesso.

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
  }
}

Informazioni su file e riga

Aggiunga CallerFilePath e CallerLineNumber per diagnosticare con precisione l'origine dei problemi.

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();
  }
}

Notifiche delle proprietà

Usi CallerMemberName nei setter o negli helper degli eventi per evitare stringhe codificate direttamente nel codice.

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"
  }
}

Controlli con il nome del chiamante

Le informazioni sul chiamante rendono più chiari i messaggi dei controlli senza dover inserire manualmente le stringhe.

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);
    }
  }
}

Suggerimenti e note

Note:

  • Gli attributi del chiamante funzionano con i parametri facoltativi che hanno valori predefiniti.
  • Non faccia affidamento sui percorsi esatti dei file per i segreti: i percorsi possono rivelare le cartelle.
  • Sono molto utili per logging, diagnostica ed eventi di modifica delle proprietà.

Attributo del nome del chiamante

Verifica rapida: quale attributo consente a un metodo di ottenere il nome del chiamante come valore predefinito di un parametro?

Riepilogo

Riepilogo: aggiunga CallerMemberName, CallerFilePath e CallerLineNumber ai parametri facoltativi per acquisire gratuitamente il contesto del chiamante.

Domande Frequenti

La lezione «Informazioni a livello di origine (attributi Caller)» è gratuita?

Sì — il testo completo di «Informazioni a livello di origine (attributi Caller)» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 3 lezioni in totale.

Cosa imparerò in «Informazioni a livello di origine (attributi Caller)»?

Usate CallerMemberName, CallerFilePath e CallerLineNumber per acquisire informazioni sul punto di chiamata nei log, nei controlli di guardia e nelle notifiche delle proprietà. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 3.

Quanto tempo richiede la lezione «Informazioni a livello di origine (attributi Caller)»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Type, MethodInfo, attivazione, attributi personalizzati
  2. Informazioni a livello di origine (attributi Caller)
  3. Scenari di metaprogrammazione leggera
← Torna a C# Academy