Skip to content

Commit fd9fe46

Browse files
authored
RichTextBoxTarget - Avoid enumerator allocations for row coloring (#199)
1 parent a29e95e commit fd9fe46

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

NLog.Windows.Forms/RichTextBoxTarget.cs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ private static IEnumerable<RichTextBoxTarget> GetRichTextBoxTargets(LoggingConfi
153153
return loggingConfiguration.AllTargets.OfType<RichTextBoxTarget>();
154154
}
155155

156-
private static ReadOnlyCollection<RichTextBoxRowColoringRule> CreateDefaultColoringRules()
156+
private static List<RichTextBoxRowColoringRule> CreateDefaultColoringRules()
157157
{
158158
return new List<RichTextBoxRowColoringRule>()
159159
{
@@ -163,7 +163,7 @@ private static ReadOnlyCollection<RichTextBoxRowColoringRule> CreateDefaultColor
163163
new RichTextBoxRowColoringRule() { Condition = "level == LogLevel.Info", FontColor = "Black" },
164164
new RichTextBoxRowColoringRule() { Condition = "level == LogLevel.Debug", FontColor = "Gray" },
165165
new RichTextBoxRowColoringRule() { Condition = "level == LogLevel.Trace", FontColor = "DarkGray", Style = FontStyle.Italic },
166-
}.AsReadOnly();
166+
};
167167
}
168168

169169
/// <summary>
@@ -209,7 +209,9 @@ public RichTextBoxTarget()
209209
/// <summary>
210210
/// Gets the default set of row coloring rules which applies when <see cref="UseDefaultRowColoringRules"/> is set to true.
211211
/// </summary>
212-
public static ReadOnlyCollection<RichTextBoxRowColoringRule> DefaultRowColoringRules { get; } = CreateDefaultColoringRules();
212+
public static ReadOnlyCollection<RichTextBoxRowColoringRule> DefaultRowColoringRules => _defaultRowColoringRules ?? (_defaultRowColoringRules = _defaultRowColoringRuleList.AsReadOnly());
213+
private static ReadOnlyCollection<RichTextBoxRowColoringRule>? _defaultRowColoringRules;
214+
private static readonly List<RichTextBoxRowColoringRule> _defaultRowColoringRuleList = CreateDefaultColoringRules();
213215

214216
/// <summary>
215217
/// Gets or sets the Name of RichTextBox to which Nlog will write.
@@ -235,14 +237,16 @@ public RichTextBoxTarget()
235237
/// </summary>
236238
/// <docgen category='Highlighting Options' order='10' />
237239
[ArrayParameter(typeof(RichTextBoxRowColoringRule), "row-coloring")]
238-
public IList<RichTextBoxRowColoringRule> RowColoringRules { get; } = new List<RichTextBoxRowColoringRule>();
240+
public IList<RichTextBoxRowColoringRule> RowColoringRules => _rowColoringRules;
241+
private readonly List<RichTextBoxRowColoringRule> _rowColoringRules = new List<RichTextBoxRowColoringRule>();
239242

240243
/// <summary>
241244
/// Gets the word highlighting rules.
242245
/// </summary>
243246
/// <docgen category='Highlighting Options' order='10' />
244247
[ArrayParameter(typeof(RichTextBoxWordColoringRule), "word-coloring")]
245-
public IList<RichTextBoxWordColoringRule> WordColoringRules { get; } = new List<RichTextBoxWordColoringRule>();
248+
public IList<RichTextBoxWordColoringRule> WordColoringRules => _wordColoringRules;
249+
private readonly List<RichTextBoxWordColoringRule> _wordColoringRules = new List<RichTextBoxWordColoringRule>();
246250

247251
/// <summary>
248252
/// Gets or sets a value indicating whether the created window will be a tool window.
@@ -911,9 +915,9 @@ private bool DoSendMessageToTextbox(string logMessage, RichTextBoxRowColoringRul
911915
private RichTextBoxRowColoringRule FindMatchingRule(LogEventInfo logEvent)
912916
{
913917
//custom rules first
914-
if (RowColoringRules.Count > 0)
918+
if (_rowColoringRules.Count > 0)
915919
{
916-
foreach (RichTextBoxRowColoringRule coloringRule in RowColoringRules)
920+
foreach (RichTextBoxRowColoringRule coloringRule in _rowColoringRules)
917921
{
918922
if (coloringRule.CheckCondition(logEvent))
919923
{
@@ -922,9 +926,9 @@ private RichTextBoxRowColoringRule FindMatchingRule(LogEventInfo logEvent)
922926
}
923927
}
924928

925-
if (UseDefaultRowColoringRules && DefaultRowColoringRules != null)
929+
if (UseDefaultRowColoringRules)
926930
{
927-
foreach (RichTextBoxRowColoringRule coloringRule in DefaultRowColoringRules)
931+
foreach (RichTextBoxRowColoringRule coloringRule in _defaultRowColoringRuleList)
928932
{
929933
if (coloringRule.CheckCondition(logEvent))
930934
{
@@ -957,10 +961,10 @@ private void SendTheMessageToRichTextBox(RichTextBox textBox, string logMessage,
957961
textBox.AppendText(logMessage + "\n");
958962
textBox.SelectionLength = textBox.TextLength - textBox.SelectionStart;
959963

960-
if (WordColoringRules.Count > 0)
964+
if (_wordColoringRules.Count > 0)
961965
{
962966
// find word to color
963-
foreach (RichTextBoxWordColoringRule wordRule in WordColoringRules)
967+
foreach (RichTextBoxWordColoringRule wordRule in _wordColoringRules)
964968
{
965969
var wordRulePattern = wordRule.Regex?.Render(logEvent) ?? string.Empty;
966970
var wordRuleText = wordRule.Text?.Render(logEvent) ?? string.Empty;

0 commit comments

Comments
 (0)