Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met behulp van infokenmerken kunt u informatie over de aanroeper naar een methode ophalen. U kunt het bestandspad van de broncode, het regelnummer in de broncode en de lidnaam van de aanroeper ophalen. Als u informatie over ledenoproepen wilt ophalen, gebruikt u kenmerken die u toepast op optionele parameters. Elke optionele parameter geeft een standaardwaarde op.
De C#-taalreferentiedocumenten de laatst uitgebrachte versie van de C#-taal. Het bevat ook de eerste documentatie voor functies in openbare previews voor de aanstaande taalrelease.
De documentatie identificeert alle functies die voor het eerst zijn geïntroduceerd in de laatste drie versies van de taal of in de huidige openbare previews.
Aanbeveling
Raadpleeg het artikel over de versiegeschiedenis van de C#-taal om te achterhalen wanneer een functie voor het eerst is geïntroduceerd in C#.
In de volgende tabel bevat de bellerinformatie-kenmerken die zijn gedefinieerd in de System.Runtime.CompilerServices naamruimte:
| Eigenschap | Beschrijving | Typologie |
|---|---|---|
| CallerFilePathAttribute | Volledig pad van het bronbestand dat de aanroeper bevat. Het volledige pad is het pad tijdens het compileren. | String |
| CallerLineNumberAttribute | Regelnummer in het bronbestand waaruit de methode wordt aangeroepen. | Integer |
| CallerMemberNameAttribute | Methodenaam of eigenschapsnaam van de aanroeper. | String |
| CallerArgumentExpressionAttribute | Tekenreeksweergave van de argumentexpressie. | String |
Deze informatie helpt u bij het traceren en opsporen van fouten en helpt u bij het maken van diagnostische hulpprogramma's. In het volgende voorbeeld ziet u hoe u kenmerken van aanroepergegevens gebruikt. Bij elke aanroep naar de TraceMessage methode wordt de aanroepergegevens ingevoegd voor de argumenten voor de optionele parameters.
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
U geeft een expliciete standaardwaarde op voor elke optionele parameter. U kunt geen kenmerken van aanroepergegevens toepassen op parameters die niet optioneel zijn. De gegevenskenmerken van de aanroeper maken geen parameter optioneel. In plaats daarvan hebben ze invloed op de standaardwaarde die wordt doorgegeven wanneer het argument wordt weggelaten. De compiler verzendt gegevenswaarden van de aanroeper als letterlijke waarden in de Tussenliggende taal (IL) tijdens het compileren. In tegenstelling tot de resultaten van de StackTrace eigenschap voor uitzonderingen, heeft verdoezeling geen invloed op de resultaten. U kunt expliciet de optionele argumenten opgeven om de gegevens van de beller te beheren of om aanroepergegevens te verbergen.
Ledennamen
Gebruik het CallerMemberName kenmerk om te voorkomen dat u de lidnaam opgeeft als argument String voor de aangeroepen methode. Door deze techniek te gebruiken, voorkomt u het probleem dat Hernoemen Refactoring de String waarden niet wijzigt. Dit voordeel is vooral handig voor de volgende taken:
- Tracerings- en diagnostische processen gebruiken.
- De interface INotifyPropertyChanged implementeren bij het binden van gegevens. Met deze interface kan de eigenschap van een object een afhankelijk besturingselement waarschuwen dat de eigenschap is gewijzigd. Het besturingselement kan de bijgewerkte informatie weergeven. Zonder het
CallerMemberNamekenmerk moet u de naam van de eigenschap opgeven als een letterlijke waarde.
In de volgende grafiek ziet u de ledennamen die worden geretourneerd wanneer u het CallerMemberName kenmerk gebruikt.
| Aanroepen vinden plaats binnen | Resultaat van lidnaam |
|---|---|
| Methode, eigenschap of gebeurtenis | De naam van de methode, eigenschap of gebeurtenis waaruit de aanroep afkomstig is. |
| Constructeur | De tekenreeks ".ctor" |
| Statische constructor | De tekenreeks '.cctor' |
| Eindschutter | De tekst "Finalize" |
| Door de gebruiker gedefinieerde operators of conversies | De gegenereerde naam voor het lid, bijvoorbeeld 'op_Addition'. |
| Kenmerkconstructor | De naam van de methode of eigenschap waarop het kenmerk wordt toegepast. Als het kenmerk een element binnen een lid is (zoals een parameter, een retourwaarde of een algemene typeparameter), is dit resultaat de naam van het lid dat aan dat element is gekoppeld. |
| Geen omvattend lid (bijvoorbeeld assembly-niveau of kenmerken toegepast op typen) | De standaardwaarde van de optionele parameter. |
Argumentexpressies
Gebruik de System.Runtime.CompilerServices.CallerArgumentExpressionAttribute expressie die als argument wordt doorgegeven. Diagnostische bibliotheken kunnen meer informatie geven over de expressies die worden doorgegeven aan argumenten. Door de expressie op te geven die de diagnose heeft geactiveerd, hebben ontwikkelaars naast de parameternaam meer informatie over de voorwaarde die de diagnose heeft geactiveerd. Deze extra informatie maakt het gemakkelijker om dit op te lossen.
In het volgende voorbeeld ziet u hoe u gedetailleerde informatie over het argument kunt opgeven wanneer het ongeldig is:
public static void ValidateArgument(string parameterName, bool condition, [CallerArgumentExpression("condition")] string? message=null)
{
if (!condition)
{
throw new ArgumentException($"Argument failed validation: <{message}>", parameterName);
}
}
U roept deze aan, zoals wordt weergegeven in het volgende voorbeeld:
public void Operation(Action func)
{
Utilities.ValidateArgument(nameof(func), func is not null);
func();
}
De compiler injecteert de expressie die voor condition het message argument wordt gebruikt. Wanneer een ontwikkelaar een Operation argument aanroeptnull, wordt het volgende bericht opgeslagen in:ArgumentException
Argument failed validation: <func is not null>
Met dit kenmerk kunt u diagnostische hulpprogramma's schrijven die meer informatie bieden. Ontwikkelaars kunnen sneller begrijpen welke wijzigingen nodig zijn. U kunt ook de CallerArgumentExpressionAttribute expressie gebruiken om te bepalen welke expressie is gebruikt als ontvanger voor extensieleden. Met de volgende methode wordt een reeks met regelmatige tussenpozen gebruikt. Als de reeks minder elementen heeft dan de frequentie, wordt er een fout gerapporteerd:
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;
}
}
}
In het vorige voorbeeld wordt de nameof operator voor de parameter sequencegebruikt. U kunt deze methode als volgt aanroepen:
sample = Enumerable.Range(0, 10).Sample(100);
In het voorgaande voorbeeld wordt een ArgumentException bericht met de volgende tekst weergegeven:
Expression doesn't have enough elements: Enumerable.Range(0, 10) (Parameter 'sequence')