Skip to content

Commit 402deb3

Browse files
committed
Add code example for CA1844 rule (#48966)
1 parent 905d0e3 commit 402deb3

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ In order to realize these performance benefits, types that derive from <xref:Sys
4040

4141
The easiest way to fix violations is to rewrite your array-based implementation as a memory-based implementation, and then implement the array-based methods in terms of the memory-based methods.
4242

43+
## Example
44+
45+
:::code language="csharp" source="snippets/csharp/all-rules/ca1844.cs" id="snippet1":::
46+
4347
## When to suppress warnings
4448

4549
It's safe to suppress a warning from this rule if any of the following situations apply:
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
namespace ca1844
2+
{
3+
//<snippet1>
4+
// This class violates the rule.
5+
public class BadStream : Stream
6+
{
7+
private readonly Stream _innerStream;
8+
9+
public BadStream(Stream innerStream)
10+
{
11+
_innerStream = innerStream;
12+
}
13+
14+
public override bool CanRead => _innerStream.CanRead;
15+
public override bool CanSeek => _innerStream.CanSeek;
16+
public override bool CanWrite => _innerStream.CanWrite;
17+
public override long Length => _innerStream.Length;
18+
public override long Position { get => _innerStream.Position; set => _innerStream.Position = value; }
19+
20+
public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
21+
{
22+
// ...
23+
return await _innerStream.ReadAsync(buffer, offset, count, cancellationToken);
24+
}
25+
26+
public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
27+
{
28+
// ...
29+
await _innerStream.WriteAsync(buffer, offset, count, cancellationToken);
30+
}
31+
32+
// Other required overrides
33+
public override void Flush() => _innerStream.Flush();
34+
public override int Read(byte[] buffer, int offset, int count) => _innerStream.Read(buffer, offset, count);
35+
public override long Seek(long offset, SeekOrigin origin) => _innerStream.Seek(offset, origin);
36+
public override void SetLength(long value) => _innerStream.SetLength(value);
37+
public override void Write(byte[] buffer, int offset, int count) => _innerStream.Write(buffer, offset, count);
38+
}
39+
40+
41+
// This class satisfies the rule.
42+
public class GoodStream : Stream
43+
{
44+
private readonly Stream _innerStream;
45+
46+
public GoodStream(Stream innerStream)
47+
{
48+
_innerStream = innerStream;
49+
}
50+
51+
public override bool CanRead => _innerStream.CanRead;
52+
public override bool CanSeek => _innerStream.CanSeek;
53+
public override bool CanWrite => _innerStream.CanWrite;
54+
public override long Length => _innerStream.Length;
55+
public override long Position { get => _innerStream.Position; set => _innerStream.Position = value; }
56+
57+
public override async ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = default)
58+
{
59+
// ...
60+
return await _innerStream.ReadAsync(buffer, cancellationToken);
61+
}
62+
63+
public override async ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default)
64+
{
65+
// ...
66+
await _innerStream.WriteAsync(buffer, cancellationToken);
67+
}
68+
69+
public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
70+
{
71+
return await this.ReadAsync(buffer.AsMemory(offset, count), cancellationToken);
72+
}
73+
74+
public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
75+
{
76+
await this.WriteAsync(buffer.AsMemory(offset, count), cancellationToken);
77+
}
78+
79+
// Other required overrides
80+
public override void Flush() => _innerStream.Flush();
81+
public override int Read(byte[] buffer, int offset, int count) => _innerStream.Read(buffer, offset, count);
82+
public override long Seek(long offset, SeekOrigin origin) => _innerStream.Seek(offset, origin);
83+
public override void SetLength(long value) => _innerStream.SetLength(value);
84+
public override void Write(byte[] buffer, int offset, int count) => _innerStream.Write(buffer, offset, count);
85+
}
86+
//</snippet1>
87+
}

0 commit comments

Comments
 (0)