Aracılığıyla paylaş


CA1011: Temel türleri parametre olarak geçirmeyi düşünün

TypeName

ConsiderPassingBaseTypesAsParameters

CheckId

CA1011

Kategori

Microsoft.Design

Değişiklik kesiliyor

Bölme

Neden

Yöntem bildiriminde türetilmiş bir tür bir biçimsel parametre içerir ve yalnızca temel tür parametresinin üyeleri yöntemini çağırır.

Kural Tanımı

Temel tür yöntem bildiriminde parametre olarak belirtildiğinde temel türünden türetilen her türlü yöntemine karşılık gelen bağımsız değişken olarak geçirilebilir.Yöntem gövdesi içinde bağımsız değişkeni kullanıldığında, yürütülen özel yöntemi bağımsız değişkenin türüne bağlıdır.Türetilmiş bir tür tarafından sağlanan ek işlevler gerekmiyorsa, temel tür kullanımını yönteminin daha geniş kullanım sağlar.

İhlalleri düzeltmek nasıl

Bu kuralı ihlal düzeltmek için parametre türü temel türünü değiştirin.

Uyarıları ne zaman

Uyarı Bu kuraldan bastırmak güvenlidir

  • yöntem türetilmiş bir tür tarafından sağlanan belirli işlevleri gerektiriyorsa

    - veya -

  • yalnızca türetilmiş bir tür veya daha türetilmiş bir tür yönteme geçirilen zorlamak için.

Bu gibi durumlarda, kodu derleyici ve çalışma zamanı tarafından sağlanan güçlü tür denetlemesi nedeniyle daha güçlü olacaktır.

Örnek

Bir yöntem, aşağıdaki örnekte gösterildiği ManipulateFileStream, yalnızca ile kullanılabilecek bir FileStream nesnesi, bu kuralı ihlal ediyor.İkinci bir yöntem ManipulateAnyStream, kural değiştirerek karşılayan FileStream parametresini kullanarak bir Stream.

Imports System
Imports System.IO

Namespace DesignLibrary

    Public Class StreamUser

        Sub ManipulateFileStream(ByVal stream As IO.FileStream)
            If stream Is Nothing Then Throw New ArgumentNullException("stream")

            Dim anInteger As Integer = stream.ReadByte()
            While (anInteger <> -1)
                ' Do something.
                anInteger = stream.ReadByte()
            End While 
        End Sub 

        Sub ManipulateAnyStream(ByVal anyStream As IO.Stream)
            If anyStream Is Nothing Then Throw New ArgumentNullException("anyStream")

            Dim anInteger As Integer = anyStream.ReadByte()
            While (anInteger <> -1)
                ' Do something.
                anInteger = anyStream.ReadByte()
            End While 
        End Sub 
    End Class 


   Public Class TestStreams

      Shared Sub Main()
            Dim someStreamUser As New StreamUser()
            Dim testFileStream As New FileStream( _
               "test.dat", FileMode.OpenOrCreate)
            Dim testMemoryStream As New MemoryStream(New Byte() {})

            ' Cannot be used with testMemoryStream.
            someStreamUser.ManipulateFileStream(testFileStream)
            someStreamUser.ManipulateAnyStream(testFileStream)
            someStreamUser.ManipulateAnyStream(testMemoryStream)
            testFileStream.Close()
        End Sub 
   End Class 
End Namespace
using System;
using System.IO;

namespace DesignLibrary
{
    public class StreamUser
    {
        int anInteger;

        public void ManipulateFileStream(FileStream stream)
        {
            while ((anInteger = stream.ReadByte()) != -1)
            {
                // Do something.
            }
        }

        public void ManipulateAnyStream(Stream anyStream)
        {
            while ((anInteger = anyStream.ReadByte()) != -1)
            {
                // Do something.
            }
        }
    }

    class TestStreams
    {
        static void Main()
        {
            StreamUser someStreamUser = new StreamUser();
            MemoryStream testMemoryStream = new MemoryStream(new byte[] { });
            using (FileStream testFileStream =
                     new FileStream("test.dat", FileMode.OpenOrCreate))
            {
                // Cannot be used with testMemoryStream.
                someStreamUser.ManipulateFileStream(testFileStream);

                someStreamUser.ManipulateAnyStream(testFileStream);
                someStreamUser.ManipulateAnyStream(testMemoryStream);
            }
        }
    }
}
using namespace System;
using namespace System::IO;

namespace DesignLibrary
{
   public ref class StreamUser
   {
      int anInteger;

   public:
      void ManipulateFileStream(FileStream^ stream)
      {
         while((anInteger = stream->ReadByte()) != -1)
         {
            // Do something.
         }
      }

      void ManipulateAnyStream(Stream^ anyStream)
      {
         while((anInteger = anyStream->ReadByte()) != -1)
         {
            // Do something.
         }
      }
   };
}

using namespace DesignLibrary;

static void main()
{
   StreamUser^ someStreamUser = gcnew StreamUser();
   FileStream^ testFileStream = 
      gcnew FileStream("test.dat", FileMode::OpenOrCreate);
   MemoryStream^ testMemoryStream = 
      gcnew MemoryStream(gcnew array<Byte>{});

   // Cannot be used with testMemoryStream.
   someStreamUser->ManipulateFileStream(testFileStream);

   someStreamUser->ManipulateAnyStream(testFileStream);
   someStreamUser->ManipulateAnyStream(testMemoryStream);

   testFileStream->Close();
}

İlgili kuralları

CA1059: Üyeler belli somut türleri göstermemelidir