Compartilhar via


CA1011: considere a passagem dos tipos base como parâmetros

TypeName

ConsiderPassingBaseTypesAsParameters

CheckId

CA1011

Categoria

Microsoft.Design

Alteração Significativa

Quebra

Causa

Uma declaração do método inclui um parâmetro formal que é um tipo derivado, e o método chama somente membros de tipo base do parâmetro.

Descrição da Regra

Quando um tipo de base é especificado como um parâmetro em uma declaração do método, qualquer tipo derivado do tipo de base pode ser passado como o argumento correspondente ao método.Quando o argumento é usado no corpo do método, o método específico executado dependerá do tipo de argumento.Se a funcionalidade extra fornecida por tipo derivado não for necessária, o uso do tipo de base permite um uso mais amplo do método.

Como Corrigir Violações

Para corrigir uma violação desta regra, altere o tipo do parâmetro ao seu tipo base.

Quando Suprimir Alertas

É seguro suprimir um aviso desta regra

  • se o método requer a funcionalidade específica que é fornecida por derivada digite

    - ou -

  • para impor que somente o tipo derivado, ou um tipo mais derivada, são passados para o método.

Nesses casos, o código será mais robusto devido à verificação de tipo forte que é fornecida no compilador e o tempo de execução.

Exemplo

O exemplo a seguir mostra um método, ManipulateFileStream, que pode ser usado somente com um objeto de FileStream , que viola esta regra.Um segundo método, ManipulateAnyStream, obedece à regra substituindo o parâmetro de FileStream usando 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();
}

Regras Relacionadas

CA1059: os membros não devem expor determinados tipos concretos