Let me break that down into two questions:
1) When should one use ref/out formal parameter declarations when writing a method?
Use ref/out when you desire your method to be able to read and write a variable passed in from the caller, rather than merely reading a value.
2) Why does an "extract method" refactoring produce a ref parameter?
I don't know the details of Resharper, but I can make a guess. Consider the following evil mutable value type:
struct S
{
private int x;
public int X() { return this.x; }
public void M() { this.x += 1; }
}
You have a method:
void Foo()
{
S s = new S();
Fred(s);
Blah(s);
Bar(s);
s.M();
Console.WriteLine(s.X()); // prints 1
}
and you do "extract method" on the middle bit:
void NewMethod(ref S s)
{
Blah(s);
Bar(s);
s.M();
}
void Foo()
{
S s = new S();
Fred(s);
NewMethod(ref s);
Console.WriteLine(s.X()); // still prints 1
}
If instead you made a method without "ref" then calling NewMethod(s) would pass a copy of s to NewMethod. Remember, value types are copied by value; that's why we called them "value types". It would be the copy that gets mutated, and then s.X() returns zero. It is a bad idea for a refactoring to introduce a semantic change in a program, and it is difficult for a refactoring engine to know whether a given method relies on the mutability of a value type or not.
This is just another reason why you should avoid mutable value types.