Skip to content

Commit af2a142

Browse files
authored
Added documentation for new rule CA1847 - Use string.Contains(char) whenever possible (#23377)
1 parent caf41a8 commit af2a142

File tree

4 files changed

+78
-0
lines changed

4 files changed

+78
-0
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
---
2+
title: "CA1847: Use char literal for a single character lookup"
3+
description: "Use string.Contains(char) instead of string.Contains(string) when searching for a single character"
4+
ms.date: 03/03/2021
5+
ms.topic: reference
6+
f1_keywords:
7+
- "CA1847"
8+
helpviewer_keywords:
9+
- "CA1847"
10+
author: MeikTranel
11+
dev_langs:
12+
- CSharp
13+
- VB
14+
---
15+
16+
# CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters
17+
18+
| | Value |
19+
|-|-|
20+
| **Rule ID** |CA1847|
21+
| **Category** |[Performance](performance-warnings.md)|
22+
| **Fix is breaking or non-breaking** |Non-breaking|
23+
24+
## Cause
25+
26+
`string.Contains(string)` is used when `string.Contains(char)` was available.
27+
28+
## Rule description
29+
30+
When searching for a single character, using `string.Contains(char)` offers better performance than `string.Contains(string)`.
31+
32+
## How to fix violations
33+
34+
In general, the rule is fixed simply by using a char literal instead of a string literal.
35+
36+
```csharp
37+
public bool ContainsLetterI()
38+
{
39+
var testString = "I am a test string.";
40+
return testString.Contains("I");
41+
}
42+
```
43+
44+
```vb
45+
Public Function ContainsLetterI() As Boolean
46+
Dim testString As String = "I am a test string."
47+
Return testString.Contains("I")
48+
End Function
49+
```
50+
51+
This code can be changed to use a char literal instead.
52+
53+
```csharp
54+
public bool ContainsLetterI()
55+
{
56+
var testString = "I am a test string.";
57+
return testString.Contains('I');
58+
}
59+
```
60+
61+
```vb
62+
Public Function ContainsLetterI() As Boolean
63+
Dim testString As String = "I am a test string."
64+
Return testString.Contains("I"c)
65+
End Function
66+
```
67+
68+
## When to suppress warnings
69+
70+
Suppress a violation of this rule if you're not concerned about the performance impact of the search invocation in question.
71+
72+
## See also
73+
74+
- [Performance rules](performance-warnings.md)

docs/fundamentals/code-analysis/quality-rules/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ The following table lists code quality analysis rules.
133133
> | [CA1844: Provide memory-based overrides of async methods when subclassing 'Stream'](ca1844.md) | To improve performance, override the memory-based async methods when subclassing 'Stream'. Then implement the array-based methods in terms of the memory-based methods. |
134134
> | [CA1845: Use span-based 'string.Concat'](ca1845.md) | It is more efficient to use `AsSpan` and `string.Concat`, instead of `Substring` and a concatenation operator. |
135135
> | [CA1846: Prefer `AsSpan` over `Substring`](ca1846.md) | `AsSpan` is more efficient than `Substring`. `Substring` performs an O(n) string copy, while `AsSpan` does not and has a constant cost. `AsSpan` also does not perform any heap allocations. |
136+
> | [CA1847: Use char literal for a single character lookup](ca1847.md) | Use `string.Contains(char)` instead of `string.Contains(string)` when searching for a single character. |
136137
> | [CA2000: Dispose objects before losing scope](ca2000.md) | Because an exceptional event might occur that will prevent the finalizer of an object from running, the object should be explicitly disposed before all references to it are out of scope. |
137138
> |[CA2002: Do not lock on objects with weak identity](ca2002.md) |An object is said to have a weak identity when it can be directly accessed across application domain boundaries. A thread that tries to acquire a lock on an object that has a weak identity can be blocked by a second thread in a different application domain that has a lock on the same object. |
138139
> | [CA2007: Do not directly await a Task](ca2007.md) | An asynchronous method [awaits](../../../csharp/language-reference/operators/await.md) a <xref:System.Threading.Tasks.Task> directly. When an asynchronous method awaits a <xref:System.Threading.Tasks.Task> directly, continuation occurs in the same thread that created the task. This behavior can be costly in terms of performance and can result in a deadlock on the UI thread. Consider calling <xref:System.Threading.Tasks.Task.ConfigureAwait(System.Boolean)?displayProperty=nameWithType> to signal your intention for continuation. |

docs/fundamentals/code-analysis/quality-rules/performance-warnings.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,4 @@ Performance rules support high-performance libraries and applications.
5353
| [CA1844: Provide memory-based overrides of async methods when subclassing 'Stream'](ca1844.md) | To improve performance, override the memory-based async methods when subclassing 'Stream'. Then implement the array-based methods in terms of the memory-based methods. |
5454
| [CA1845: Use span-based 'string.Concat'](ca1845.md) | It is more efficient to use `AsSpan` and `string.Concat`, instead of `Substring` and a concatenation operator. |
5555
| [CA1846: Prefer `AsSpan` over `Substring`](ca1846.md) | `AsSpan` is more efficient than `Substring`. `Substring` performs an O(n) string copy, while `AsSpan` does not and has a constant cost. `AsSpan` also does not perform any heap allocations. |
56+
| [CA1847: Use char literal for a single character lookup](ca1847.md) | Use `string.Contains(char)` instead of `string.Contains(string)` when searching for a single character. |

docs/fundamentals/toc.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,8 @@ items:
927927
href: code-analysis/quality-rules/ca1845.md
928928
- name: CA1846
929929
href: code-analysis/quality-rules/ca1846.md
930+
- name: CA1847
931+
href: code-analysis/quality-rules/ca1847.md
930932
- name: SingleFile rules
931933
items:
932934
- name: Overview

0 commit comments

Comments
 (0)