CA1011: 기본 형식을 매개 변수로 전달해 보십시오.
TypeName |
ConsiderPassingBaseTypesAsParameters |
CheckId |
CA1011 |
범주 |
Microsoft.Design |
변경 수준 |
주요 변경 |
원인
메서드 선언에 파생 형식인 정식 매개 변수가 포함되어 있고 메서드가 매개 변수의 기본 형식인 멤버만 호출합니다.
규칙 설명
기본 형식이 메서드 선언의 매개 변수로 지정된 경우 기본 형식에서 파생된 모든 형식을 해당 인수로 메서드에 전달할 수 있습니다.메서드 본문 안에서 인수가 사용될 경우 실행되는 특정 메서드는 인수의 형식에 따라 달라집니다.파생 형식에서 제공하는 추가 기능이 필요하지 않을 경우 기본 형식을 사용하면 메서드를 보다 광범위하게 사용할 수 있습니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 매개 변수의 형식을 기본 형식으로 변경합니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시하지 않아도 안전합니다.
파생된 형식에서 제공하는 특정 기능이 메서드에 필요한 경우
-또는-
파생된 형식만 또는 파생된 추가 형식을 메서드에 전달되도록 하려면.
이 경우 컴파일러 및 런타임에서 제공하는 강력한 형식 검사로 인해 코드가 더욱 강력해집니다.
예제
다음 예제에서는 FileStream 개체에서만 사용할 수 있는 ManipulateFileStream 메서드에서 이 규칙을 위반하는 예를 보여 줍니다.두 번째 메서드인 ManipulateAnyStream은 FileStream 매개 변수를 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();
}