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 , ManipulateFileStream
che 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);
}
}
}
}
Regole correlate
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per