クラスの特定のインスタンスが null にならないようにするにはどうすればよいですか? 誰かが私に Debug.Assert() を使用するように言いましたが、そうすることで、コードがデバッグモードで機能することだけを保証しますが、リリースでも is-never-null 条件を保証したいと考えています。
たとえば、過去に次のようなコードを書きました。
public string MyString
{
get
{
if(instance1.property1.Equals("bla"))
{
return bla;
}
}
}
ただし、instance1 が null の場合、これは例外をスローします。このような間違いを犯したり、将来的にそのような例外を生成したりすることは避けたいと思います。
ありがとう、
問題を説明する以下の特定の例を参照してください。
サーバーからの応答に基づいてユーザーを認証する方法があります。メソッドは次のとおりです。
/// <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 が 1 回 null で、プロパティ AuthResult が「null.auth」の試行時に nullref をスローしたことです。どうすれば(おそらくCheckUser()メソッド内で)nullを返さないことを確認できますか?
アプリをデバッグしたとき、それは起こりませんでした。しかし本番環境では、サーバーがタイムアウトしたときに、メソッドが null を返すことがありました。
ありがとう、