Be careful with objects in .NET passing ByVal.  Many objects are passed ByRef even with the ByVal declaration since a pointer only is passed. In several examples from MS, they actually populate datasets passed in ByVal in Sub Procedures.....took me a while to figure out what was going on cause I'd prefer to always use a function if i'm grabbing data if possible.