一位同事向我展示了一個非常奇怪的行爲,我想知道是否有人能解釋我爲什麼。+帶有空操作數的字符串concat運算符
2個PARAMS一個基本的構造:
public MyClass(string str1, string str2)
{
this.s1 = str1;
this.s2 = str2;
this.s3 = Method(str2 + "._className", str1);
}
方法是:
public string Method(string key, string defaultValue)
{
List<string> list = _vars[key];
if (list == null) return defaultValue;
string res = "";
foreach (string s in list)
{
if (res != "") res += ",";
res += s;
}
return res;
}
當這個構造函數是一個aspx頁面中調用str2
爲null
,一切工作正常,因爲如果一個操作數字符串連接+
爲null
,空字符串被替換。
但是,當在背景線程中使用str2
作爲null
調用此ctor時,會觸發NullReferenceException
。
問題是由使用它之前測試str2 != null
解決,但我真的很想知道,爲什麼相同的代碼,有時觸發一個例外,有時不!
這裏是堆棧跟蹤:
Exception: System.NullReferenceException
Message: Object reference not set to an instance of an object.
StackTrace:
at MyClass..ctor(String str1, String str2)
at AbandonedCartsNotificationJob.NotifyAbandonedCarts() in AbandonedCartsNotificationJobPartial.cs:line 39
at AbandonedCartsNotificationJob.work() in AbandonedCartsNotificationJob.cs:line 15
at MyRuntime.JobManager.run()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
我覺得這裏還有別的事情要做。什麼是'this.s2'用於?什麼是堆棧跟蹤?你可以發佈可重複的代碼供我們測試嗎?你在哪裏做空檢查?是在實例化MyClass之前還是在執行Method之前或者在構造函數的開頭? –
您確定您已將問題追蹤到正確的代碼片段嗎? 'Method'做什麼? –
你確定嗎?你在後臺線程中嘗試過相同的組合嗎 –