No estoy seguro si puedan sustituir a un puntero, pero si funcionan perfectamente. Sobretodo cuando el codigo es no seguro.
El parámetro ref en una variable, obtiene un valor de retorno. Y el parametro out envía un valor. Supongo que estás trabajando con una DLL de C++.
Y si yo mientras no encuentre solucion al reemplazo de los structs, tuve que dejar en espera lo que estoy haciendo. El manejo de estructuras en C# es mucho mas cerrado, que en C++, por ejemplo, en C++ estructuras y clases son lo mismo, en C# se distinguen claramente.