CA1011: Considerare il passaggio di tipi di base come parametri

Articolo Valore
ID regola CA1011
Category Microsoft.Design
Modifica Interruzione

Causa

Una dichiarazione di metodo include un parametro formale che è un tipo derivato e il metodo chiama solo i membri del tipo di base del parametro.

Descrizione regola

Quando un tipo di base viene specificato come parametro in una dichiarazione di metodo, qualsiasi tipo derivato dal tipo di base può essere passato al metodo come argomento corrispondente. Quando l'argomento viene utilizzato all'interno del corpo del metodo, il metodo specifico eseguito dipende dal tipo dell'argomento. Se non è necessaria la funzionalità aggiuntiva fornita dal tipo derivato, l'uso del tipo di base consente un uso più ampio del metodo .

Come correggere le violazioni

Per correggere una violazione di questa regola, modificare il tipo del parametro impostandone il tipo di base.

Quando eliminare gli avvisi

È sicuro eliminare un avviso da questa regola

  • se il metodo richiede la funzionalità specifica fornita dal tipo derivato

    - oppure -

  • per imporre che solo il tipo derivato o un tipo più derivato venga passato al metodo .

In questi casi, il codice sarà più affidabile a causa del controllo del tipo sicuro fornito dal compilatore e dal runtime.

Esempio

Nell'esempio seguente viene illustrato un metodo , ManipulateFileStreamche può essere usato solo con un FileStream oggetto , che viola questa regola. Un secondo metodo, ManipulateAnyStream, soddisfa la regola sostituendo il FileStream parametro usando un oggetto 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: I membri non devono esporre tipi concreti specifici