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

항목
RuleId CA1011
범주 Microsoft.Design
주요 변경 내용 주요 변경

원인

메서드 선언에 파생 형식인 정식 매개 변수가 포함되어 있는데 메서드는 기본 형식의 매개 변수 멤버만 호출합니다.

규칙 설명

기본 형식이 메서드 선언의 매개 변수로 지정된 경우 기본 형식에서 파생된 모든 형식을 해당 인수로 메서드에 전달할 수 있습니다. 메서드 본문 내에서 인수를 사용하는 경우 실행되는 특정 메서드는 인수의 형식에 따라 달라집니다. 파생 형식에서 제공하는 추가 기능이 필요 없는 경우 기본 형식을 사용하면 메서드를 더 폭넓게 사용할 수 있습니다.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 매개 변수의 형식을 기본 형식으로 변경합니다.

경고를 표시하지 않는 경우

이 규칙의 경고는 표시하지 않아도 됩니다.

  • 메서드에 파생 형식에서 제공하는 특정 기능이 필요한 경우

    -또는-

  • 파생 형식이나 추가 파생 형식만 메서드에 전달되도록 하려는 경우

이 경우 컴파일러와 런타임에서 제공하는 강력한 형식 검사로 인해 코드가 더 강력해집니다.

예시

다음 예제에서는 이 규칙을 위반하는 FileStream 개체에서만 사용할 수 있는 ManipulateFileStream 메서드를 보여 줍니다. 두 번째 메서드인 ManipulateAnyStreamFileStream 매개 변수를 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);
            }
        }
    }
}

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