Export (0) Print
Expand All
Expand Minimize

Consider passing base types as parameters

TypeName

ConsiderPassingBaseTypesAsParameters

CheckId

CA1011

Category

Microsoft.Design

Breaking Change

Breaking

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

When a base type is specified as a parameter in a method declaration, any type 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 provided by the derived type is not required, use of the base type allows the method to be more widely utilized.

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

It is safe to exclude a warning from this rule if the method requires the specific functionality provided by the derived type or to enforce that only the derived type, or a more derived type, is passed to the method. In this case, the code will be more robust due to the strong type checking provided by the compiler and runtime.

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

While this rule currently fires on virtual methods in Visual Studio 2005, in future versions of Visual Studio this will be changed so that following will no longer cause ConsiderPassingBaseTypesAsParameters to fire.

Community Additions

ADD
Show:
© 2015 Microsoft