Partilhar via


Considere passando tipos base sistema autônomo parâmetros

TypeName

ConsiderPassingBaseTypesAsParameters

CheckId

CA1011

Category (Categoria)

Microsoft.Design

Quebrando alterar

Quebrando

Causa

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

Descrição da regra

Quando um tipo de base é especificado sistema autônomo um parâmetro em uma declaração de método, qualquer tipo derivado do tipo de base pode ser passado sistema autônomo o argumento correspondente para o método.Quando o argumento é usado dentro do corpo de método, o método específico que é executado depende do tipo do argumento.Se a funcionalidade adicional fornecida pelo tipo derivado não for necessária, o uso do tipo de base permite que o método a ser mais amplamente usado.

Como corrigir violações

Para corrigir uma violação dessa regra, altere o tipo do parâmetro para seu tipo de base.

Quando suprimir avisos

É seguro eliminar um aviso essa regra se o método requer a funcionalidade específica fornecida pelo tipo derivado de ou para garantir que somente o tipo derivado, ou uma mais tipo derivado, passados para o método.Nesse caso, o código será mais robusto por causa da verificação tipo de alta segurança fornecidos pelo compilador e tempo de execução.

Exemplo

O exemplo a seguir mostra um método, ManipulateFileStream, que pode ser usado somente com um FileStream objeto viola essa regra. Um segundo método, ManipulateAnyStream, satisfaz a regra, substituindo o FileStream parâmetro com um 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

Os membros não devem expor certos tipos concretos