Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usando gli attributi delle informazioni, si ottengono informazioni sul chiamante a un metodo. Si ottiene il percorso del file del codice sorgente, il numero di riga nel codice sorgente e il nome del membro del chiamante. Per ottenere informazioni sul chiamante membro, usare gli attributi applicati ai parametri facoltativi. Ogni parametro facoltativo specifica un valore predefinito. Nella tabella seguente sono elencati gli attributi delle informazioni chiamante definiti nello spazio dei nomi System.Runtime.CompilerServices.
| Attributo | Descrizione | TIPO |
|---|---|---|
| CallerFilePathAttribute | Percorso completo del file di origine che contiene il chiamante. Il percorso completo è il percorso in fase di compilazione. | String |
| CallerLineNumberAttribute | Numero di riga nel file di origine da cui viene chiamato il metodo . | Integer |
| CallerMemberNameAttribute | Nome del metodo o nome della proprietà del chiamante. | String |
| CallerArgumentExpressionAttribute | Rappresentazione di stringa dell'espressione dell'argomento. | String |
Queste informazioni consentono di tracciare e eseguire il debug e consentono di creare strumenti di diagnostica. Nell'esempio seguente viene illustrato come usare gli attributi delle informazioni sul chiamante. In ogni chiamata al TraceMessage metodo, le informazioni sul chiamante vengono inserite per gli argomenti ai parametri facoltativi.
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
Specificare un valore predefinito esplicito per ogni parametro facoltativo. Non è possibile applicare attributi di informazioni sul chiamante ai parametri non specificati come facoltativi. Gli attributi delle informazioni sul chiamante non rendono facoltativo un parametro. Influiscono invece sul valore predefinito passato quando l'argomento viene omesso. I valori delle informazioni sul chiamante vengono generati come valori letterali nel linguaggio intermedio (IL) in fase di compilazione. A differenza dei risultati della StackTrace proprietà per le eccezioni, l'offuscamento non influisce sui risultati. È possibile specificare in modo esplicito gli argomenti facoltativi per controllare le informazioni sul chiamante o nascondere le informazioni sul chiamante.
Nomi dei membri
È possibile usare l'attributo CallerMemberName per evitare di specificare il nome del membro come String argomento per il metodo chiamato. Usando questa tecnica, si evita il problema per cui la Rifattorizzazione di rinomina non modifica i valori di String. Questo vantaggio è particolarmente utile per le attività seguenti:
- Uso di routine di tracciamento e diagnostica.
- Implementazione dell'interfaccia INotifyPropertyChanged durante l'associazione dei dati. Questa interfaccia consente alla proprietà di un oggetto di notificare a un controllo associato che la proprietà è stata modificata. Il controllo può visualizzare le informazioni aggiornate. Senza l'attributo
CallerMemberName, è necessario specificare il nome della proprietà come valore letterale.
Il grafico seguente mostra i nomi dei membri restituiti quando si usa l'attributo CallerMemberName .
| Le chiamate si verificano all'interno | Risultato del nome del membro |
|---|---|
| Metodo, proprietà o evento | Nome del metodo, della proprietà o dell'evento da cui ha avuto origine la chiamata. |
| Costruttore | Stringa ".ctor" |
| Costruttore statico | Stringa ".cctor" |
| Finalizzatore | La stringa "Finalizzare" |
| Operatori o conversioni definiti dall'utente | Nome generato per il membro, ad esempio "op_Addition". |
| Costruttore di attributi | Nome del metodo o della proprietà a cui viene applicato l'attributo. Se l'attributo è un elemento all'interno di un membro , ad esempio un parametro, un valore restituito o un parametro di tipo generico, questo risultato è il nome del membro associato a tale elemento. |
| Nessun membro contenitore (ad esempio, a livello di assembly o attributi applicati ai tipi) | Valore predefinito del parametro facoltativo. |
Espressioni di argomento
Usare quando System.Runtime.CompilerServices.CallerArgumentExpressionAttribute si desidera che l'espressione sia passata come argomento. Le librerie di diagnostica possono fornire altri dettagli sulle espressioni passate agli argomenti. Fornendo l'espressione che ha attivato la diagnostica, oltre al nome del parametro, gli sviluppatori hanno maggiori dettagli sulla condizione che ha attivato la diagnostica. Queste informazioni aggiuntive semplificano la correzione.
Nell'esempio seguente viene illustrato come fornire informazioni dettagliate sull'argomento quando non è valido:
public static void ValidateArgument(string parameterName, bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
if (!condition)
{
throw new ArgumentException($"Argument failed validation: <{message}>", parameterName);
}
}
È necessario richiamarlo come illustrato nell'esempio seguente:
public void Operation(Action func)
{
Utilities.ValidateArgument(nameof(func), func is not null);
func();
}
Il compilatore inserisce l'espressione utilizzata per condition nell'argomento message . Quando uno sviluppatore chiama Operation con un null argomento , il messaggio seguente viene archiviato in ArgumentException:
Argument failed validation: <func is not null>
Questo attributo consente di scrivere utilità di diagnostica che forniscono altri dettagli. Gli sviluppatori possono comprendere più rapidamente quali modifiche sono necessarie. È anche possibile usare per CallerArgumentExpressionAttribute determinare quale espressione è stata usata come ricevitore per i membri dell'estensione. Il metodo seguente esegue l'esempio di una sequenza a intervalli regolari. Se la sequenza ha meno elementi della frequenza, segnala un errore:
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;
}
}
}
Nell'esempio precedente viene usato l'operatore nameof per il parametro sequence. È possibile chiamare questo metodo come segue:
sample = Enumerable.Range(0, 10).Sample(100);
L'esempio precedente genera un oggetto ArgumentException il cui messaggio è il testo seguente:
Expression doesn't have enough elements: Enumerable.Range(0, 10) (Parameter 'sequence')