CA1011: Consider passing base types as parameters

 

For the latest documentation on Visual Studio 2017, see Visual Studio 2017 Documentation.

TypeNameConsiderPassingBaseTypesAsParameters
CheckIdCA1011
CategoryMicrosoft.Design
Breaking ChangeBreaking

A method declaration includes a formal parameter that is a derived type, and the method calls only members of the base type of the parameter.

When a base type is specified as a parameter in a method declaration, any type that is derived from the base type can be passed as the corresponding argument to the method. When the argument is used inside the method body, the specific method that is executed depends on the type of the argument. If the additional functionality that is provided by the derived type is not required, use of the base type allows wider use of the method.

To fix a violation of this rule, change the type of the parameter to its base type.

It is safe to suppress a warning from this rule

  • if the method requires the specific functionality that is provided by the derived type

    - or -

  • to enforce that only the derived type, or a more derived type, is passed to the method.

In these cases, the code will be more robust because of the strong type checking that is provided by the compiler and runtime.

The following example shows a method, ManipulateFileStream, that can be used only with a FileStream object, which violates this rule. A second method, ManipulateAnyStream, satisfies the rule by replacing the FileStream parameter by using a 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

CA1059: Members should not expose certain concrete types

Show: