CA1011: Considerar pasar los tipos base como parámetros
Elemento | Valor |
---|---|
RuleId | CA1011 |
Category | Microsoft.Design |
Cambio importante | Problemático |
Causa
Una declaración de método incluye un parámetro formal que es un tipo derivado, y el método llama solo a los miembros del tipo base del parámetro.
Descripción de la regla
Cuando en una declaración de método se especifica un tipo base como parámetro, cualquier tipo derivado del tipo base puede pasarse al método como el argumento correspondiente. Cuando el argumento se usa dentro del cuerpo del método, el método específico que se ejecuta depende del tipo del argumento. Si la funcionalidad adicional proporcionada por el tipo derivado no resulta necesaria, la utilización del tipo base permite el uso más amplio del método.
Cómo corregir infracciones
Para corregir una infracción de esta regla, cambie el tipo del parámetro a su tipo base.
Cuándo suprimir las advertencias
Se puede suprimir una advertencia de esta regla de forma segura
si el método requiere la funcionalidad específica proporcionada por el tipo derivado.
O bien
para exigir que solo el tipo derivado, o un tipo más derivado, se pase al método.
En estos casos, el código será más sólido debido a la comprobación de tipos segura proporcionada por el compilador y el tiempo de ejecución.
Ejemplo
En el ejemplo siguiente se muestra un método, ManipulateFileStream
, que solo se puede usar con un objeto FileStream, que infringe esta regla. Un segundo método, ManipulateAnyStream
, satisface la regla reemplazando el parámetro FileStream mediante 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);
}
}
}
}
Reglas relacionadas
CA1059: Los miembros no deben exponer algunos tipos concretos
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de