Suppose you have a class Person :
public class Person
{
public string Name { get; set;}
public IEnumerable Roles {get; set;}
}
On the performance front, let's see how Enumerable.Empty is implemented.
It returns EmptyEnumerable, which is defined as:
internal class EmptyEnumerable
{
public static readonly T[] Instance = new T[0];
}
Static fields on generic types are allocated per generic type parameter. This means that the runtime can lazily create these empty arrays only for the types user code needs, and reuse the instances as many times as needed without adding any pressure on the garbage collector.
To wit:
Debug.Assert(ReferenceEquals(Enumerable.Empty(), Enumerable.Empty()));