2008-10-03 34 views
5

Mã nào là mã đúng nhất?Cách nào là đúng để kiểm tra ngoại lệ Null?

if (HttpContext.Current.Response.Cookies[authCookieName] != null) { 
    HttpContext.Current.Response.Cookies[authCookieName].Value = "New Value"; 
} 

hoặc

if (HttpContext.Current != null) 
    if (HttpContext.Current.Response != null) 
     if (HttpContext.Current.Response.Cookies != null) 
      if (HttpContext.Current.Response.Cookies[authCookieName] != null) 
       HttpContext.Current.Response.Cookies[authCookieName].Value = "New Value"; 

Trả lời

19

Nếu bất kỳ một trong HttpContext, HttpContext.Current, HttpContext.Current.Response, hoặc Http.Current.Response.Cookies là null, bạn đã gặp rắc rối. Hãy để ngoại lệ xảy ra và sửa máy chủ web của bạn.

+0

BTW: HttpContext là một lớp học. Nếu một lớp là null, bạn chắc chắn gặp rắc rối! : P – yfeldblum

+0

câu hỏi lừa .... drat! – craigmoliver

0

Không thực sự chính xác hơn, mặc dù tôi sẽ tránh điều thứ hai, vì các điều kiện lồng nhau sâu sắc có xu hướng khó hiểu và duy trì.

Nếu bạn muốn bạn có ngoại lệ con trỏ null, hãy sử dụng dấu đầu tiên. Nếu bạn muốn đối phó với null theo cách khác hoặc âm thầm, sử dụng thứ hai (hoặc một phiên bản được cấu trúc lại của thứ hai).

0

Nếu bạn nghĩ rằng có một cơ hội mà Current, Response, Cookies, hoặc có thể là Cookies[authCookieName]null, và bạn có một điều hợp lý để làm gì nếu bất kỳ trong số đó là, sau đó sau này là con đường để đi. Nếu cơ hội thấp, và/hoặc không có gì bạn có thể làm nếu các trung gian là null, đi cho cựu, vì nó ngắn gọn hơn - tốt nhất bạn có thể làm là để có được khai thác tốt hơn nếu bạn sử dụng ví dụ mở rộng.

4

có thể thử:

if(HttpContext.Current != null && 
    HttpContext.Current.Response != null && 
    HttpContext.Current.Response.Cookies != null && 
    HttpContext.Current.Response.Cookies[authCookieName] != null) 
{ 
    // do your thing 
} 
+0

lol, một loại không thể là null! HttpContext! = Null;) –

+0

ok vì vậy tôi có một chút mang đi đi lên chuỗi :) –

1

HttpContext.Current.Response.Cookies sẽ không bao giờ được null. Điều duy nhất có thể gây ra một null là nếu cookie bạn đang mong đợi không tồn tại, do đó, đầu tiên là chính xác. HttpContext.Current sẽ là null nếu bạn không chấp nhận yêu cầu web mặc dù :)

4

Cả hai đều tốt. Giả sử rằng bạn đã kiểm tra mọi thứ khác cần được kiểm tra trước. Ví dụ .:

private bool CheckSuspendersAndBelt() 
{ 
    try 
    { 
     //ensure that true is true... 
     if (true == true) 
     { 
      //...and that false is false... 
      if (false == false) 
      { 
       //...and that true and false are not equal... 
       if (false != true) 
       { 
        //don't proceed if we don't have at least one processor 
        if (System.Environment.ProcessorCount > 0) 
        { 
         //and if there is no system directory then something is wrong 
         if (System.Environment.SystemDirectory != null) 
         { 
          //hopefully the code is running under some version of the CLR... 
          if (System.Environment.Version != null) 
          { 
           //we don't want to proceed if we're not in a process... 
           if (System.Diagnostics.Process.GetCurrentProcess() != null) 
           { 
            //and code running without a thread would not be good... 
            if (System.Threading.Thread.CurrentThread != null) 
            { 
             //finally, make sure instantiating an object really results in an object... 
             if (typeof(System.Object) == (new System.Object()).GetType()) 
             { 
              //good to go 
              return true; 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
     return false; 
    } 
    catch 
    { 
     return false; 
    } 
} 

(xin lỗi, không thể cưỡng lại ... :))

1

Ví dụ đầu tiên bạn đã là quá đủ. Như đã đề cập, nếu bất kỳ đối tượng nào khác là null thì có vấn đề với ASP.NET.

if (HttpContext.Current.Response.Cookies[authCookieName] != null) { 
    HttpContext.Current.Response.Cookies[authCookieName].Value = "New Value"; 
} 

Nhưng thay vì xả rác mã của bạn với những thường nhiều séc, bạn nên tạo một số chức năng chung chung như setcookie, GetCookie, GetQueryStringGetForm, vv mà chấp nhận tên và value (đối với các hàm Set) làm tham số, xử lý kiểm tra null và trả về giá trị hoặc một chuỗi rỗng (để lấy hàm). Điều này sẽ làm cho mã của bạn dễ dàng hơn nhiều để duy trì và có thể cải thiện và nếu bạn quyết định sử dụng một cái gì đó không phải là Cookie để lưu trữ/truy xuất các tùy chọn trong tương lai, bạn sẽ chỉ phải thay đổi các chức năng.

Các vấn đề liên quan