Sdílet prostřednictvím


CA1011: Zvažte předání základních typů jako parametrů

Název_typu

ConsiderPassingBaseTypesAsParameters

CheckId

CA1011

Kategorie

Microsoft.design

Změnit rozdělení

Rozdělení

Příčina

Deklarace metody obsahuje formální parametr, který je odvozený typ a volá metodu členy základní typ parametru.

Popis pravidla

Při základní typ je zadán jako parametr v deklaraci metody, může být libovolný typ odvozený z typu základní předán jako argument odpovídající metody.Při použití argumentu uvnitř těla metody specifické metody, která je spuštěna závisí na typu argumentu.Je-li další funkce poskytované odvozeného typu není vyžadováno, umožňuje použití základního typu širší použití metody.

Jak opravit porušení

Porušení tohoto pravidla opravit, změňte na základní typ typ parametru.

Při potlačení upozornění

Je bezpečné potlačí upozornění od tohoto pravidla

  • Pokud metoda vyžaduje konkrétní funkce poskytované odvozeného typu.

    -nebo-

  • vynutit, aby odvozeného typu nebo více odvozený typ je předán metodě.

V těchto případech bude kód robustnější z důvodu silné typ kontroly poskytované kompilátor a runtime.

Příklad

Následující příklad ukazuje způsob, ManipulateFileStream, lze použít pouze FileStream objektu, který poruší toto pravidlo.Druhá metoda ManipulateAnyStream, splňuje pravidlo nahrazením FileStream pomocí parametru 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();
}

Souvisejících pravidel

CA1059: Členové by neměli zveřejňovat určité konkrétní typy