Skip to content

Commit ea36b24

Browse files
committed
Reduce allocations.
1 parent b4841ba commit ea36b24

File tree

1 file changed

+28
-12
lines changed

1 file changed

+28
-12
lines changed

src/Renci.SshNet/Messages/Message.cs

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.IO;
2-
using System.Linq;
32
using Renci.SshNet.Common;
43
using System.Globalization;
54
using Renci.SshNet.Abstractions;
@@ -31,13 +30,22 @@ protected override int BufferCapacity
3130
/// </summary>
3231
protected override void WriteBytes(SshDataStream stream)
3332
{
34-
var messageAttribute = GetType().GetCustomAttributes<MessageAttribute>(true).FirstOrDefault();
35-
36-
if (messageAttribute == null)
37-
throw new SshException(string.Format(CultureInfo.CurrentCulture, "Type '{0}' is not a valid message type.", GetType().AssemblyQualifiedName));
33+
var enumerator = GetType().GetCustomAttributes<MessageAttribute>(true).GetEnumerator();
34+
try
35+
{
36+
if (!enumerator.MoveNext())
37+
{
38+
throw new SshException(string.Format(CultureInfo.CurrentCulture, "Type '{0}' is not a valid message type.", GetType().AssemblyQualifiedName));
39+
}
3840

39-
stream.WriteByte(messageAttribute.Number);
40-
base.WriteBytes(stream);
41+
var messageAttribute = enumerator.Current;
42+
stream.WriteByte(messageAttribute.Number);
43+
base.WriteBytes(stream);
44+
}
45+
finally
46+
{
47+
enumerator.Dispose();
48+
}
4149
}
4250

4351
internal byte[] GetPacket(byte paddingMultiplier, Compressor compressor)
@@ -155,12 +163,20 @@ private static byte GetPaddingLength(byte paddingMultiplier, long packetLength)
155163
/// </returns>
156164
public override string ToString()
157165
{
158-
var messageAttribute = GetType().GetCustomAttributes<MessageAttribute>(true).SingleOrDefault();
159-
160-
if (messageAttribute == null)
161-
return string.Format(CultureInfo.CurrentCulture, "'{0}' without Message attribute.", GetType().FullName);
166+
var enumerator = GetType().GetCustomAttributes<MessageAttribute>(true).GetEnumerator();
167+
try
168+
{
169+
if (!enumerator.MoveNext())
170+
{
171+
return string.Format(CultureInfo.CurrentCulture, "'{0}' without Message attribute.", GetType().FullName);
172+
}
162173

163-
return messageAttribute.Name;
174+
return enumerator.Current.Name;
175+
}
176+
finally
177+
{
178+
enumerator.Dispose();
179+
}
164180
}
165181

166182
/// <summary>

0 commit comments

Comments
 (0)