2012-08-24 79 views
9

我需要檢查cookie是否存在值或不存在。但我不知道是否有一些快速和良好的方式這樣做,因爲如果我需要檢查3個餅乾,使用iftry檢查似乎不好。如何檢查cookie是否爲空

如果cookie不存在,爲什麼它不會將空字符串分配給我的變量?相反,它表明Object reference not set to an instance of an object.

我的代碼(它的工作原理,但似乎太大了這個任務,我覺得應該有這樣做的更好的方法),正如你可以看到我有這個巨大的

// First I need to asign empty variables and I don't like this 
string randomHash = string.Empty; 
string browserHash = string.Empty; 
int userID = 0; 

// Second I need to add this huge block of try/catch just to get cookies 
// It's fine since I need all three values in this example so if one fails all fails 
try 
{ 
    randomHash = Convert.ToString(Request.Cookies["randomHash"].Value); 
    browserHash = Convert.ToString(Request.Cookies["browserHash"].Value); 
    userID = Convert.ToInt32(Request.Cookies["userID"].Value); 
} 
catch 
{ 
    // And of course there is nothing to catch here 
} 

阻止只是爲了得到餅乾。我想是這樣的:

// Gives value on success, null on cookie that is not found 
string randomHash = Convert.ToString(Request.Cookies["randomHash"].Value); 
string browserHash = Convert.ToString(Request.Cookies["browserHash"].Value); 
int userID = Convert.ToInt32(Request.Cookies["userID"].Value); 

編輯 也許我能以某種方式重寫.Value方法符合我的心意?

+0

也許這不是理想的,但這塊代碼真的沒有什麼「巨大的」。 –

+0

我仍然喜歡使用第二個。如果這是唯一的方式而不是罰款,但在我看來,應該有一個更好的。 – sed

+1

好吧,你可以使用像'Convert.ToString(Request.Cookies [「randomHash」]!= null?Request.Cookies [「randomHash」]。Value:「」);'每行,但只是提供更長的行。 –

回答

11

只是檢查如果cookie爲null:

if(Request.Cookies["randomHash"] != null) 
{ 
    //do something 
} 

注意:這樣做的「更好」的方式是編寫好的代碼爲可讀可靠。它不會分配空字符串,因爲這不是C#的工作原理,您正試圖調用null對象(HttpCookie)上的Value屬性 - 因爲沒有任何可用的內容,所以不能使用空對象。

轉換到int你仍然需要避免解析錯誤,但你可以使用這個內置的方法:

int.TryParse(cookieString, out userID); 

帶來的另一點?爲什麼你要將用戶標識存儲在cookie中?這可以由最終用戶改變 - 我不知道你打算如何使用它,但我認爲這是一個很大的安全漏洞是否正確?


或用小幫手功能:

public string GetCookieValueOrDefault(string cookieName) 
{ 
    HttpCookie cookie = Request.Cookies[cookieName]; 
    if(cookie == null) 
    { 
     return ""; 
    } 
    return cookie.Value; 
} 

然後...

string randomHash = GetCookieValueOrDefault("randomHash"); 

或與擴展方法:

public static string GetValueOrDefault(this HttpCookie cookie) 
{ 
    if(cookie == null) 
    { 
     return ""; 
    } 
    return cookie.Value; 
} 

然後...

string randomHash = Request.Cookies["randomHash"].GetValueOrDefault(); 
+2

對您的其他重要答案進行一次更正 - int.TryParse不使用try/catch。它出於效率原因避免了try/catch。這就是爲什麼它總是**使用TryParse方法更好,而不是包裝在try/catch塊中。 – MgSam