CA1011: Considerar a passagem de tipos base como parâmetros
Item | Valor |
---|---|
RuleId | CA1011 |
Categoria | Microsoft.Design |
Alteração da falha | Quebra |
Causa
Uma declaração de método inclui um parâmetro formal que é um tipo derivado e o método chama apenas membros do tipo base do parâmetro.
Descrição da regra
Quando um tipo de base é especificado como um parâmetro em uma declaração de método, qualquer tipo derivado do tipo de base pode ser passado como o argumento correspondente ao método. Quando o argumento é usado dentro do corpo do 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 permitirá um uso mais amplo do método.
Como corrigir violações
Para corrigir uma violação dessa regra, altere o tipo do parâmetro para seu tipo base.
Quando suprimir avisos
É seguro suprimir um aviso desta regra
se o método exigir a funcionalidade específica fornecida pelo tipo derivado
- ou -
para impor que apenas o tipo derivado ou um tipo mais derivado seja passado para o método .
Nesses casos, o código será mais robusto devido à verificação de tipo forte fornecida pelo compilador e pelo runtime.
Exemplo
O exemplo a seguir mostra um método ManipulateFileStream
, que pode ser usado apenas com um objeto FileStream, que viola essa regra. Um segundo método ManipulateAnyStream
satisfaz a regra substituindo o parâmetro FileStream usando um Stream.
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);
}
}
}
}
Regras relacionadas
CA1059: Membros não devem expor determinados tipos concretos
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de