CA1011: Zvažte předání základních typů jako parametrů
Název_typu |
ConsiderPassingBaseTypesAsParameters |
CheckId |
CA1011 |
Kategorie |
Microsoft.design |
Změnit rozdělení |
Rozdělení |
Příčina
Deklarace metody obsahuje formální parametr, který je odvozený typ a volá metodu členy základní typ parametru.
Popis pravidla
Při základní typ je zadán jako parametr v deklaraci metody, může být libovolný typ odvozený z typu základní předán jako argument odpovídající metody.Při použití argumentu uvnitř těla metody specifické metody, která je spuštěna závisí na typu argumentu.Je-li další funkce poskytované odvozeného typu není vyžadováno, umožňuje použití základního typu širší použití metody.
Jak opravit porušení
Porušení tohoto pravidla opravit, změňte na základní typ typ parametru.
Při potlačení upozornění
Je bezpečné potlačí upozornění od tohoto pravidla
Pokud metoda vyžaduje konkrétní funkce poskytované odvozeného typu.
-nebo-
vynutit, aby odvozeného typu nebo více odvozený typ je předán metodě.
V těchto případech bude kód robustnější z důvodu silné typ kontroly poskytované kompilátor a runtime.
Příklad
Následující příklad ukazuje způsob, ManipulateFileStream, lze použít pouze FileStream objektu, který poruší toto pravidlo.Druhá metoda ManipulateAnyStream, splňuje pravidlo nahrazením FileStream pomocí parametru Stream.
Imports System
Imports System.IO
Namespace DesignLibrary
Public Class StreamUser
Sub ManipulateFileStream(ByVal stream As IO.FileStream)
If stream Is Nothing Then Throw New ArgumentNullException("stream")
Dim anInteger As Integer = stream.ReadByte()
While (anInteger <> -1)
' Do something.
anInteger = stream.ReadByte()
End While
End Sub
Sub ManipulateAnyStream(ByVal anyStream As IO.Stream)
If anyStream Is Nothing Then Throw New ArgumentNullException("anyStream")
Dim anInteger As Integer = anyStream.ReadByte()
While (anInteger <> -1)
' Do something.
anInteger = anyStream.ReadByte()
End While
End Sub
End Class
Public Class TestStreams
Shared Sub Main()
Dim someStreamUser As New StreamUser()
Dim testFileStream As New FileStream( _
"test.dat", FileMode.OpenOrCreate)
Dim testMemoryStream As New MemoryStream(New Byte() {})
' Cannot be used with testMemoryStream.
someStreamUser.ManipulateFileStream(testFileStream)
someStreamUser.ManipulateAnyStream(testFileStream)
someStreamUser.ManipulateAnyStream(testMemoryStream)
testFileStream.Close()
End Sub
End Class
End Namespace
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);
}
}
}
}
using namespace System;
using namespace System::IO;
namespace DesignLibrary
{
public ref class StreamUser
{
int anInteger;
public:
void ManipulateFileStream(FileStream^ stream)
{
while((anInteger = stream->ReadByte()) != -1)
{
// Do something.
}
}
void ManipulateAnyStream(Stream^ anyStream)
{
while((anInteger = anyStream->ReadByte()) != -1)
{
// Do something.
}
}
};
}
using namespace DesignLibrary;
static void main()
{
StreamUser^ someStreamUser = gcnew StreamUser();
FileStream^ testFileStream =
gcnew FileStream("test.dat", FileMode::OpenOrCreate);
MemoryStream^ testMemoryStream =
gcnew MemoryStream(gcnew array<Byte>{});
// Cannot be used with testMemoryStream.
someStreamUser->ManipulateFileStream(testFileStream);
someStreamUser->ManipulateAnyStream(testFileStream);
someStreamUser->ManipulateAnyStream(testMemoryStream);
testFileStream->Close();
}