what is the difference between a 'ref' parameter and 'out' parameter

They're pretty much the same - the only difference is that a variable you pass as an out parameter doesn't need to be initialized, and the method using the ref parameter has to set it to something.
int x;Foo(out x); // OK
int y;Foo(ref y); // Error
Ref parameters are for data that might be modified, out parameters are for data that's an additional output for the function (eg int.TryParse) that are already using the return value for something