However, let's say you want to put a touch of logic into the Age property and let it accept values only greater than 18. At this point, is it necessary to create a private variable?
Yes. You will need a backing field.
you don't need a private backing-variable if you simply use get/set,
For auto implemented properties, compiler will add the backing field.
See: Auto-Implemented Properties (C# Programming Guide)
In C# 3.0 and later, auto-implemented properties make property-declaration more concise when no additional logic is required in the property accessors. They also enable client code to create objects. When you declare a property as shown in the following example, the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors.
Your property would look like:
private int _age;
public int Age
{
get { return _age; }
set
{
if (_age > 18)
_age = value;
else
{
//throw exception, Show message etc
}
}
}