浏览代码

Reduce allocations.

Gert Driesen 8 年之前
父节点
当前提交
ea36b240aa
共有 1 个文件被更改,包括 28 次插入12 次删除
  1. 28 12
      src/Renci.SshNet/Messages/Message.cs

+ 28 - 12
src/Renci.SshNet/Messages/Message.cs

@@ -1,5 +1,4 @@
 using System.IO;
-using System.Linq;
 using Renci.SshNet.Common;
 using System.Globalization;
 using Renci.SshNet.Abstractions;
@@ -31,13 +30,22 @@ namespace Renci.SshNet.Messages
         /// </summary>
         protected override void WriteBytes(SshDataStream stream)
         {
-            var messageAttribute = GetType().GetCustomAttributes<MessageAttribute>(true).FirstOrDefault();
-
-            if (messageAttribute == null)
-                throw new SshException(string.Format(CultureInfo.CurrentCulture, "Type '{0}' is not a valid message type.", GetType().AssemblyQualifiedName));
+            var enumerator = GetType().GetCustomAttributes<MessageAttribute>(true).GetEnumerator();
+            try
+            {
+                if (!enumerator.MoveNext())
+                {
+                    throw new SshException(string.Format(CultureInfo.CurrentCulture, "Type '{0}' is not a valid message type.", GetType().AssemblyQualifiedName));
+                }
 
-            stream.WriteByte(messageAttribute.Number);
-            base.WriteBytes(stream);
+                var messageAttribute = enumerator.Current;
+                stream.WriteByte(messageAttribute.Number);
+                base.WriteBytes(stream);
+            }
+            finally
+            {
+                enumerator.Dispose();
+            }
         }
 
         internal byte[] GetPacket(byte paddingMultiplier, Compressor compressor)
@@ -155,12 +163,20 @@ namespace Renci.SshNet.Messages
         /// </returns>
         public override string ToString()
         {
-            var messageAttribute = GetType().GetCustomAttributes<MessageAttribute>(true).SingleOrDefault();
-
-            if (messageAttribute == null)
-                return string.Format(CultureInfo.CurrentCulture, "'{0}' without Message attribute.", GetType().FullName);
+            var enumerator = GetType().GetCustomAttributes<MessageAttribute>(true).GetEnumerator();
+            try
+            {
+                if (!enumerator.MoveNext())
+                {
+                    return string.Format(CultureInfo.CurrentCulture, "'{0}' without Message attribute.", GetType().FullName);
+                }
 
-            return messageAttribute.Name;
+                return enumerator.Current.Name;
+            }
+            finally
+            {
+                enumerator.Dispose();
+            }
         }
 
         /// <summary>