Skip to content

BRO1137: Remove a redundant 'return;' or 'yield break;'

A return; as the last statement of a body, or a yield break; as the last statement of an iterator, does nothing: the body ends there anyway. Not a StyleCop rule (proposed in StyleCop issue #760; Roslynator RCS1134).

Example

Before

using System.Collections.Generic;

public class Log
{
    private readonly List<string> lines = new List<string>();

    public void Add(string line)
    {
        if (line.Length == 0)
        {
            return;
        }

        lines.Add(line);
        return;
    }

    public IEnumerable<string> Errors()
    {
        foreach (var line in lines)
        {
            if (line.StartsWith("error"))
            {
                yield return line;
            }
        }

        yield break;
    }
}

After

using System.Collections.Generic;

public class Log
{
    private readonly List<string> lines = new List<string>();

    public void Add(string line)
    {
        if (line.Length == 0)
        {
            return;
        }

        lines.Add(line);
    }

    public IEnumerable<string> Errors()
    {
        foreach (var line in lines)
        {
            if (line.StartsWith("error"))
            {
                yield return line;
            }
        }
    }
}

Why

A jump that goes where the code would go anyway makes the reader look for a reason that isn't there.

How the fix works

The statement's line is removed, with the blank lines above it (they would end up before the body's }, which BRO1518 reports). A statement that shares its line with other code is removed with the spaces before it: void M() { return; } becomes void M() { }.

Not reported

  • A return; or yield break; in a nested block (if (x) { ...; return; }): code after the block would run.
  • A yield break; that is the iterator's only yield (it is what makes the method an iterator).
  • A statement with a comment on it or above it, or a label (end: return;).
  • A directive right above the statement (#endif, #if): which statement is last can depend on it.
  • return x; (a value) and expression-bodied members.

Compared with StyleCop

StyleCop has no such rule. stylebro-migrate turns it off (see Rules beyond StyleCop).