다음을 통해 공유


기본 형식을 매개 변수로 전달해 보십시오.

업데이트: 2007년 11월

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();
}

관련 규칙

멤버는 구체적인 특정 형식을 노출하면 안 됩니다.