Random string of variable length generator
Just two remarks:


RandomChar should be a method because it returns a different result each time - this is just a convention that we usually follow in C#



  In general, methods represent actions and properties represent data. Properties are meant to be used like fields, meaning that properties should not be computationally complex or produce side effects.


from Choosing Between Properties and Methods

so


  Do use a property, rather than a method, if the value of the property is stored in the process memory and the property would just provide access to the value.


but


  Do use a method, rather than a property, in the following situations.


amonong many others:


  
  The operation returns a different result each time it is called, even if the parameters do not change. For example, the NewGuid method returns a different value each time it is called.
  





You can cast the result to char and don't need the Convert.ToChar


_

private static char RandomChar() =&gt; (char)Random.Next(char.MinValue, char.MaxValue);




You can also improve the performance by precalculating the array with chars:

private static readonly char[] Chars = 
    Enumerable
    .Range(char.MinValue, char.MaxValue)
    .Select(x =&gt; (char)x)
    .Where(c =&gt; !char.IsControl(c))
    .ToArray();


the RandomChar method would take the values from this array:

private static char RandomChar() =&gt; Chars[Random.Next(0, Chars.Length)];


so building the string can be a simple loop:

for (int i = 0; i &lt; length; i++)
{
    stringBuilder.Append(RandomChar());
}




Without the StringBuilder this seems to be faster in tests by just ~8ms for 100.000 loops and a string lenght of 1.000

var chars = new char[length];
for (int i = 0; i &lt; length; i++)
{
    chars[i] = RandomChar();
}
return new string(chars);


StringBuilder.ToString processes the data in order to build the string. It's quite fast but in this particular situation the minimal overhead is noticable. Generally the StringBuilder is the fastet way to build strings so using it is definitely the right choice.



Changing the Random.Next(0, max) to Random.Next(max) improves the performance by another 10ms for the same tests.