You can't resize an existing array, however, you can use:
Array.Resize(ref arr, newSize);
This allocates a new array, copies the data from the old array into the new array, and updates the arr variable (which is passed by-ref in this case). Is that what you mean?
However, any other references still pointing at the old array will not be updated. A better option might be to work with List<T> - then you don't need to resize it manually, and you don't have the issue of out-of-date references. You just Add/Remove etc. Generally, you don't tend to use arrays directly very often. They have their uses, but they aren't the default case.
Re your comments;
- boxing: List<T>doesn't box. That is one of the points about generics; under the hood,List<T>is a wrapper aroundT[], so aList<int>has anint[]- no boxing. The olderArrayListis a wrapper aroundobject[], so that does box; of course, boxing isn't as bad as you might assume anyway.
- workings of Array.Resize;if I recall, it finds the size of T, then usesBuffer.BlockCopyto blit the contents
the actual details are hidden by an internal call - but essentially after allocating a new array it is a blit (memcpy) of the data between the two arrays, so it should be pretty quick; note that for reference-types this only copies the reference, not the object on the heap. However, if you are resizing regularly,List<T>would usually be a lot simpler (and quicker unless you basically re-implement whatList<T>does re spare capacity to minimise the number of resizes).