﻿<?xml version="1.0" encoding="utf-8"?><Type Name="AvoidSwitchStatementsRule" FullName="Gendarme.Rules.Smells.AvoidSwitchStatementsRule"><TypeSignature Language="C#" Value="public class AvoidSwitchStatementsRule : Gendarme.Framework.Rule, Gendarme.Framework.IMethodRule" /><TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit AvoidSwitchStatementsRule extends Gendarme.Framework.Rule implements class Gendarme.Framework.IMethodRule, class Gendarme.Framework.IRule" /><AssemblyInfo><AssemblyName>Gendarme.Rules.Smells</AssemblyName><AssemblyVersion>4.2.0.0</AssemblyVersion></AssemblyInfo><Base><BaseTypeName>Gendarme.Framework.Rule</BaseTypeName></Base><Interfaces><Interface><InterfaceName>Gendarme.Framework.IMethodRule</InterfaceName></Interface></Interfaces><Attributes><Attribute><AttributeName>Gendarme.Framework.Problem("The problem with switch statements is the duplication.  You may find the same switch in several places.")</AttributeName></Attribute><Attribute><AttributeName>Gendarme.Framework.Solution("You should consider polymorphism.")</AttributeName></Attribute></Attributes><Docs><summary>
             This rule checks for the Switch Statements smell.  This can
             lead to code duplication, because the same switch could
             be repeated in various places in your program.  Also, if
             need to do a little change, you may have to change every switch
             statement. The preferred way to do this is with virtual methods and polymorphism.
             </summary><remarks>This rule is available since Gendarme 2.4</remarks><example>
             Bad example:
             <code>
             int balance = 0;
             foreach (Movie movie in movies) {
             	switch (movie.GetTypeCode ()) {
            	 	case MovieType.OldMovie: {
             			balance += movie.DaysRented * movie.Price / 2;
             			break;
            	 	}
             		case MovieType.ChildMovie: {
            	 		//its an special bargain !!
             			balance += movie.Price;
             			break;
            		}
            		case MovieType.NewMovie: {
            			balance += (movie.DaysRented + 1) * movie.Price;
            			break:
            		}
             	}
             }
             </code></example><example>
             Good example:
             <code>
             abstract class Movie {
            	abstract int GetPrice ();
             }
             class OldMovie : Movie {
            	public override int GetPrice ()
            	{
            		return DaysRented * Price / 2;
            	}
             }
             class ChildMovie : Movie {
            	public override int GetPrice ()
            	{
            		return movie.Price;
            	}
             }
             class NewMovie : Movie {
            	public override int GetPrice ()
            	{
            		return (DaysRented + 1) * Price;
            	}
             }
            
             int balance = 0;
             foreach (Movie movie in movies) {
             	balance += movie.GetPrice ()
             }
             </code></example></Docs><Members><Member MemberName=".ctor"><MemberSignature Language="C#" Value="public AvoidSwitchStatementsRule ();" /><MemberSignature Language="ILAsm" Value=".method public hidebysig specialname rtspecialname instance void .ctor() cil managed" /><MemberType>Constructor</MemberType><AssemblyInfo><AssemblyVersion>4.2.0.0</AssemblyVersion></AssemblyInfo><Parameters /><Docs><summary>To be added.</summary><remarks>To be added.</remarks></Docs></Member><Member MemberName="CheckMethod"><MemberSignature Language="C#" Value="public Gendarme.Framework.RuleResult CheckMethod (Mono.Cecil.MethodDefinition method);" /><MemberSignature Language="ILAsm" Value=".method public hidebysig newslot virtual instance valuetype Gendarme.Framework.RuleResult CheckMethod(class Mono.Cecil.MethodDefinition method) cil managed" /><MemberType>Method</MemberType><AssemblyInfo><AssemblyVersion>4.2.0.0</AssemblyVersion></AssemblyInfo><ReturnValue><ReturnType>Gendarme.Framework.RuleResult</ReturnType></ReturnValue><Parameters><Parameter Name="method" Type="Mono.Cecil.MethodDefinition" /></Parameters><Docs><param name="method">To be added.</param><summary>To be added.</summary><returns>To be added.</returns><remarks>To be added.</remarks></Docs></Member></Members></Type>