مشاركة عبر


CA1007: Use generics where appropriate

TypeName

UseGenericsWhereAppropriate

CheckId

ca1007

Category

Microsoft.تصميم

تعطيل تغيير

فصل

السبب

أسلوب مرئي خارجياً يحتوي على معلمة مرجع نوع System.Object، والأهداف التي تحتوي على تجميع .NET Framework 2.0.

وصف القاعدة

معلمة مرجع هو معلمة تعديلها باستخدام الكلمة أساسى ref(ByRefفي Vهوual أساسى). يجب أن تتطابق تماما مع نوع وسيطة الذي تم توفيره لمعلمة مرجع نوع معلمة مرجع. يجب استخدام نوع مشتق من نوع معلمة مرجع، النوع أول تحويل والمعينة إلى متغير من نوع معلمة مرجع. استخدام أسلوب عام يسمح لالجميع أنواع، يخضع للقيود لتمريرها إلى الأسلوب بدون بث نوع إلى نوع مرجع معلمة.

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

إلى إصلاح انتهاكا لهذه قاعدة وجعل الأسلوب العام واستبدال Objectالمعلمة مع معلمة نوع.

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

لا بمنع تحذير من هذه قاعدة.

مثال

يظهر المثال التالي إجراء تبادل العام تنفيذ كـ الأساليب غير عام وعام. لاحظ كيف كفاءة السلاسل التي يتم تبديل على استخدام الأسلوب العام بواسطة مقارنة إلى الأسلوب غير عام.

Imports System

Namespace DesignLibrary

   Public NotInheritable Class ReferenceParameters

      Private Sub New()
      End Sub

      ' This method violates the rule.
      Public Shared Sub Swap( _  
         ByRef object1 As Object, ByRef object2 As Object)

         Dim temp As Object = object1
         object1 = object2
         object2 = temp

      End Sub

      ' This method satifies the rule.
      Public Shared Sub GenericSwap(Of T)( _ 
         ByRef reference1 As T, ByRef reference2 As T)

         Dim temp As T = reference1
         reference1 = reference2
         reference2 = temp

      End Sub

   End Class

   Class Test

      Shared Sub Main()

         Dim string1 As String = "Swap"
         Dim string2 As String = "It"

         Dim object1 As Object = DirectCast(string1, Object)
         Dim object2 As Object = DirectCast(string2, Object)
         ReferenceParameters.Swap(object1, object2)
         string1 = DirectCast(object1, String)
         string2 = DirectCast(object2, String)
         Console.WriteLine("{0} {1}", string1, string2)

         ReferenceParameters.GenericSwap(string1, string2)
         Console.WriteLine("{0} {1}", string1, string2)

      End Sub

   End Class

End Namespace
using System;

namespace DesignLibrary
{
   public sealed class ReferenceParameters
   {
      private ReferenceParameters(){}

      // This method violates the rule.
      public static void Swap(ref object object1, ref object object2)
      {
         object temp = object1;
         object1 = object2;
         object2 = temp;
      }

      // This method satifies the rule.
      public static void GenericSwap<T>(ref T reference1, ref T reference2)
      {
         T temp = reference1;
         reference1 = reference2;
         reference2 = temp;
      }
   }

   class Test
   {
      static void Main()
      {
         string string1 = "Swap";
         string string2 = "It";

         object object1 = (object)string1;
         object object2 = (object)string2;
         ReferenceParameters.Swap(ref object1, ref object2);
         string1 = (string)object1;
         string2 = (string)object2;
         Console.WriteLine("{0} {1}", string1, string2);

         ReferenceParameters.GenericSwap(ref string1, ref string2);
         Console.WriteLine("{0} {1}", string1, string2);
      }
   }
}

القواعد ذات الصلة

ca1005: تجنب الإفراط معلمات تشغيل الأنواع العامة

ca1303: لا تمرير القيم الحرفية كمترجم معلمات

ca1000: لا بتعريف الأعضاء ثابتة تشغيل الأنواع العامة

ca1002: لا تعرض القوائم العامة

CA1006: Do not nest generic types in member signatures

ca1004: يجب توفير وظائف عامة معلمة نوع

ca1003: استخدام مثيلات معالج حدث العام

راجع أيضًا:

المرجع

generics (C# البرمجة الدليل)