Compartir a través de


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);
            }
        }
    }
}

CA1059: Los miembros no deben exponer algunos tipos concretos