Q:

How do I know if an object property has a default value?

I use the following piece of pseudo code to clarify my question (the used class is immaterial): 
var client = new SmtpClient();
client.Credentials = ...;

Now if I want to use this code. How do I know how to use it. I could try to set the property value like this:
client.Credentials.User = "MyUsername";

which should give me a NullReferenceException because there is no default credential object assigned. Or I could use it like this:
client.Credentials = new Credentials("MyUsername",...);

But the correct way to initialize the property would be to set the DefaultNetworkCredentials myself like this:
client.Credentials = CredentialCache.DefaultNetworkCredentials;

How do I know if an object property has a default value at design time without looking into documentation (if some exists)? 
What is the best practice / design guideline for object properties? Should there always be a default value for a property?

A:

In general, it is a bad idea to design an API where the caller must routinely "skip a level". Your example requires the user of your API to know about the inner structure of the credentials - specifically, that credentials feature a user name. This is an indication of tight coupling - a thing that your API design should strive to avoid.
A way around this would be exposing methods that skip that level of indirection for the user of your API, for example, like this:
void SetCredentialsUser(string user) {
    // Do the checks necessary to see if credentials are there;
    // create a new instance if necessary.
}

Now the user of your API can deal only with your API, not with the API of the Credentials object. The fact that Credentials may not be set is hidden behind the method. You can even guard against attempts at writing the user name by exposing a read-only version of credentials through your API, while employing a read-write version under the covers.

