如何确保某个类的某个实例永远不会为空?有人告诉我使用 Debug.Assert() 但这样做,我只会确保代码在调试模式下工作,而我也想确保发布时的 is-never-null 条件。
例如,过去我写的代码如下:
public string MyString
{
get
{
if(instance1.property1.Equals("bla"))
{
return bla;
}
}
}
但是,如果 instance1 为空,则会引发异常。我想避免在将来犯这样的错误并产生这样的异常。
谢谢,
请参阅下面说明问题的具体示例:
我有一种方法可以根据服务器的响应对用户进行身份验证。方法是这样的:
/// <summary>
/// attempts authentication for current user
/// </summary>
/// <returns></returns>
public AuthResult CheckUser()
{
WebRequest request = WebRequest.Create(GetServerURI);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
string postdata = "data=" + HttpUtility.UrlEncode(SerializeAuth());
byte[] arr = Utils.AppDefaultEncoding.GetBytes(postdata);
request.ContentLength = arr.Length;
request.Timeout = Convert.ToInt32(TimeUtils.GetMiliseconds(10, TimeUtils.TimeSelect.Seconds));
Stream strToWrite = request.GetRequestStream();
strToWrite.Write(arr, 0, arr.Length);
WebResponse response = request.GetResponse();
using (Stream dataFromResponse = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(dataFromResponse))
{
string readObj = reader.ReadToEnd();
return DeserializeAuth(readObj);
}
}
}
要调用此方法,我使用
_authenticationResult = authObj.CheckUser();
我也有这个属性,等等
public ResultType AuthResult
{
get
{
if (_authenticationResult.auth == "1")
return ResultType.Success;
if (_authenticationResult.auth == "0")
return ResultType.FailAccountExpired;
if (_authenticationResult.auth == "-1")
return ResultType.FailWrongUsernameOrPassword;
if (_authenticationResult.auth == "-2")
return ResultType.Banned;
return ResultType.NoAuthDone;
}
}
public enum ResultType { Success, FailWrongUsernameOrPassword, FailAccountExpired, NoAuthDone, Banned }
发生的事情是 _authenticationResult 曾经为 null,并且属性 AuthResult 在尝试“null.auth”时抛出了一个 nullref。我如何确保(可能在 CheckUser() 方法中)它永远不会返回 null。
当我调试应用程序时,它从未发生过。但是在生产中,当服务器超时时,该方法有时会返回 null。
谢谢,