مشاركة عبر


Refactor Database Code and Data CA1704:

TypeName

DoNotCastUnnecessarily

CheckId

ca1800

Category

Microsoft.الأداء

تعطيل تغيير

غير فاصلة

السبب

ويقوم أسلوب قوالب المكررة تشغيل إحدى الوسيطات الخاصة به أو المتغيرات المحلية. لتحليل كامل بهذه القاعدة، تجميع خضعت للاختبار يجب أن يتم إنشاؤها بواسطة معلومات تصحيح الأخطاء و يجب توفر ملف قاعدة بيانات (.pdb) البرنامج المقترن.

وصف القاعدة

قوالب مكررة بانخفاض الأداء، خاصة عندما يتم القيام قوالب في عبارات تكرار مضغوط. لعمليات تحويل صريح مكررة، تخزين نتيجة لفريق العمل في متغير محلي واستخدم المتغير المحلي بدلاً من العمليات المتكررة لفريق العمل.

إذا كان C# isيستخدم operaإلىr إلى اختبار ما إذا كان سينجح تحويل قبل تنفيذ فريق العمل الفعلي، قم باختبار النتيجة asoperaإلىr بدلاً من ذلك. ويوفر هذا الأمر نفس وظيفة بدون عملية تحويل الضمني تنفيذه بواسطة isعامل التشغيل.

كيف إلى الإصلاح انتهاكات

لإصلاح انتهاكا لهذه قاعدة، قم بتعديل تطبيق أسلوب لتقليل عدد العمليات تحويل.

عند إلى منع التحذيرات

هو الأمن لمنع ظهور تحذير من القيم بالموضع هو قاعدة، أو تجاهل قاعدة بالكامل، إذا كان الأداء هو ليس مهما.

مثال

يوضح المثال التالي أسلوب التي تخالف قاعدة استخدام C# isعامل التشغيل. ثانية أسلوب يفي قاعدة بواسطة استبدال isالعامل باختبار مقابل النتيجة asعامل التشغيل، مما يقلل عدد العمليات تحويل كل تكرار من الثاني إلى واحد.

using System;
using System.Collections;
using System.Windows.Forms;

namespace PerformanceLibrary
{
   public sealed class SomeClass
   {
      private SomeClass() {}

      // This method violates the rule.
      public static void UnderPerforming(ArrayList list)
      {
         foreach(object obj in list) 
         {
            // The 'is' statement performs a cast operation.
            if(obj is Control) 
            {
               // The 'as' statement performs a duplicate cast operation.
               Control aControl = obj as Control;
               // Use aControl.
            }

         }
      }

      // This method satisfies the rule.
      public static void BetterPerforming(ArrayList list)
      {
         foreach(object obj in list) 
         {
            Control aControl = obj as Control;
            if(aControl != null) 
            {
               // Use aControl.
            }
         }
      }
   }
}

يوضح المثال التالي طريقة start_Click، مع عدة مكررة صريحة قوالب، التي تخالف قاعدة، و الأسلوب، reset_Click، الذي يفي بالقاعدة بواسطة تخزين تحويل في متغير محلي.

Imports System
Imports System.Drawing
Imports System.Windows.Forms

Namespace PerformanceLibrary

   Public Class SomeForm : Inherits Form

      Dim start, reset As Button

      Sub New()

         start = New Button()
         reset = New Button()
         AddHandler start.Click, AddressOf start_Click
         AddHandler reset.Click, AddressOf reset_Click
         Controls.Add(start)
         Controls.Add(reset)

      End Sub

      ' This method violates the rule.
      Private Sub start_Click(sender As Object, e As EventArgs)

         Dim controlSize As Size = DirectCast(sender, Control).Size
         Dim rightToLeftValue As RightToLeft = _ 
            DirectCast(sender, Control).RightToLeft
         Dim parent As Control = DirectCast(sender, Control)

      End Sub

      ' This method satisfies the rule.
      Private Sub reset_Click(sender As Object, e As EventArgs)

         Dim someControl As Control = DirectCast(sender, Control)
         Dim controlSize As Size = someControl.Size
         Dim rightToLeftValue As RightToLeft = someControl.RightToLeft
         Dim parent As Control = someControl

      End Sub

   End Class

End Namespace
using System;
using System.Drawing;
using System.Windows.Forms;

namespace PerformanceLibrary
{
   public class SomeForm : Form
   {
      Button start, reset;

      public SomeForm()
      {
         start = new Button();
         reset = new Button();
         start.Click += new EventHandler(start_Click);
         reset.Click += new EventHandler(reset_Click);
         Controls.Add(start);
         Controls.Add(reset);
      }

      // This method violates the rule.
      void start_Click(object sender, EventArgs e)
      {
         Size controlSize = ((Control)sender).Size;
         RightToLeft rightToLeftValue = ((Control)sender).RightToLeft;
         Control parent = (Control)sender;
      }

      // This method satisfies the rule.
      void reset_Click(object sender, EventArgs e)
      {
         Control someControl = (Control)sender;
         Size controlSize = someControl.Size;
         RightToLeft rightToLeftValue = someControl.RightToLeft;
         Control parent = someControl;
      }
   }
}

راجع أيضًا:

المرجع

كما (C# مرجع)

هو (C# مرجع)