Si la expresión "con" es un tipo de clase, la instrucción "Con" es equivalente a crear una nueva variable temporal de ese tipo, inicializada a la expresión "Con" y precediendo a cada una "." con esa variable. Si es un tipo de estructura, sin embargo, las cosas son más complicadas. Considere el código (obviamente no de la manera que normalmente cabría escribir algo, pero escrito como lo es para hacer un punto:.
With MyPoints(N) ' Array of Point
N=SomeNewValue
.X = MyPoints(N).X
.Y = MyPoints(N).Y
End With
La expresión "with" engancha efectivamente una referencia a MyPoints (N) Incluso si MyPoints es cambiado a alguna otra matriz, o se cambia N, la referencia retenida aún apuntará al mismo elemento de la misma matriz que cuando se ejecutó la instrucción With. Si se declara una variable local P de tipo Point y se agarraron MyPoints (N), y luego escribir en PX y PY, las escrituras solo llegarían a la copia local P, en lugar de actualizar la matriz. Para lograr una semántica similar en C#, uno tendría que usar variables locales para contener tanto MyPoints como N, o bien coloque el contenido de la instrucción With dentro de una función anónima que tenga un parámetro ref de tipo Point. Para evitar tener que crear un cierre en tiempo de ejecución, la función anónima también debe aceptar, probablemente por referencia, cualquier variable local que necesite del alcance externo.
Unas cuantas personas están diciendo que es malo, pero me gustaría señalar que las convenciones de codificación de Microsoft para VB.NET dice que debe usar la palabra clave 'With' al hacer una serie de llamadas a un objeto - http://msdn.microsoft.com/en-us/library/h63fsef3.aspx –