From: David H. <dav...@bl...> - 2006-08-14 23:46:18
|
Sandro Magi wrote: > C# supports a number of additional side-effects to method invocation > than Java. The following method: > > string foo(string input, int param2) { ... } > > is implicitly: > > string foo(in int input, in int param2) { ... } > > The other variants are: > > string foo(ref int input, out int param2) { ... } > > "ref" is used to pass parameters by reference, ie. setting a ref > parameter induces the local variable in the caller to be modified. The C# does appear to specify pass-by-reference for these parameters: <http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csspec/html/vclrfcsharpspec_10_5_1.asp> but it is not clear to me whether they actually meant to specify pass-by-value-return. (In a shared-state concurrent language like C#, or when there is aliasing between parameters, pass-by-reference is not equivalent to pass-by-value-return: in the former the variable is set once at the end of the call; in the latter it can be set multiple times before the end of the call. I think Henry Baker originally pointed out this issue for Ada89.) Still, it doesn't really matter to my argument below. > "out" is similar to "ref", except that "out" parameters can be used > with uninitialized variables in the caller, and they must be > initialized by the called function ("foo" in this case). IMHO, pass-by-reference or pass-by-value-return parameters are simply a bad idea. The fact that a function can modify a variable of the caller should always be explicit *at each call site*. It is not sufficient for it to be specified in the declaration of the function (especially in languages that allow overloading). Just Say No to implicitly modifying caller variables. Uses of these parameter types can always be more clearly expressed by multiple return values. -- David Hopwood <dav...@bl...> |