CA1011: Temel türleri parametre olarak geçirmeyi düşünün
TypeName |
ConsiderPassingBaseTypesAsParameters |
CheckId |
CA1011 |
Kategori |
Microsoft.Design |
Değişiklik kesiliyor |
Bölme |
Neden
Yöntem bildiriminde türetilmiş bir tür bir biçimsel parametre içerir ve yalnızca temel tür parametresinin üyeleri yöntemini çağırır.
Kural Tanımı
Temel tür yöntem bildiriminde parametre olarak belirtildiğinde temel türünden türetilen her türlü yöntemine karşılık gelen bağımsız değişken olarak geçirilebilir.Yöntem gövdesi içinde bağımsız değişkeni kullanıldığında, yürütülen özel yöntemi bağımsız değişkenin türüne bağlıdır.Türetilmiş bir tür tarafından sağlanan ek işlevler gerekmiyorsa, temel tür kullanımını yönteminin daha geniş kullanım sağlar.
İhlalleri düzeltmek nasıl
Bu kuralı ihlal düzeltmek için parametre türü temel türünü değiştirin.
Uyarıları ne zaman
Uyarı Bu kuraldan bastırmak güvenlidir
yöntem türetilmiş bir tür tarafından sağlanan belirli işlevleri gerektiriyorsa
- veya -
yalnızca türetilmiş bir tür veya daha türetilmiş bir tür yönteme geçirilen zorlamak için.
Bu gibi durumlarda, kodu derleyici ve çalışma zamanı tarafından sağlanan güçlü tür denetlemesi nedeniyle daha güçlü olacaktır.
Örnek
Bir yöntem, aşağıdaki örnekte gösterildiği ManipulateFileStream, yalnızca ile kullanılabilecek bir FileStream nesnesi, bu kuralı ihlal ediyor.İkinci bir yöntem ManipulateAnyStream, kural değiştirerek karşılayan FileStream parametresini kullanarak bir 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();
}