C# : Cần lưu ý áp dụng từ khóa const khi muốn chia sẻ assembly

C# : Cần lưu ý áp dụng từ khóa const khi muốn chia sẻ assembly

 

Bài viết này tôi muốn đưa ra cái tình huống nguy hiểm mà nhiều khi quên, chưa hiểu rõ hoặc vận dụng sai từ khóa const trong lập trình C#.

 

I.            Tình huống

Thực tế, khi phát triển phần mềm, người ta muốn module hóa, chia thành nhiều project vật lý để cho tiện quản lý, tái sử dụng, phân phối, bảo trì.  Và song đó, sử dụng hằng số trong lập trình là nhu cầu thiết yếu cho các dự án. Sau đây tôi sẽ đưa ra 1 ví dụ đơn giản nhất có thể để mọi người hiểu:

clip_image001[6]

·         MyApp là 1 C# Console Application là của mình.

·         MyConstant là 1 C# Class Library. Và MyApp add reference MyConstant.dll

Mục đích hướng tới là sau khi triển khai ứng dụng MyApp, thì nếu như cần sửa cái gì đó ở MyConstant thì chỉ cần build project MyConstant và copy MyConstant.dll vào ứng dụng MyApp đang triển khai mà không cần biên dịch và copy lại toàn bộ.

Và đây là nội dung mã nguồn của 2 project trên: (chú ý vào hằng CODE)

clip_image002[6]

clip_image003[6]

Và kết quả khi execute MyApp

clip_image004[6]

Giả sử có 1 yêu cầu đặt ra cần sử lại hằng CODE:

clip_image006[6]

clip_image007[6]

Kết quả chương trình vẫn không có gì đáng lo.

Giả sử chúng ta đóng gói và phân phối cho khách hàng sử dụng chương trình trên. Tôi sẽ mô phỏng bằng cách copy thư mục Debug ra 1 chỗ khác.

 

clip_image009[6]

Test lại bằng cách dùng CMD truy cập đến đây và mở MyApp.exe lên thì kết quả vẫn chính xác.

clip_image010[6]

1 ngày nọ, ta cần sửa lại CODE. Và như tôi nói từ đầu, mục đích chia ra project MyConstant riêng là để có thể lúc này đây, ta chỉ cần build và copy lại mỗi MyConstant.dll

clip_image012[6]

Đây là tình hình sau khi copy xong.

clip_image014[6]

Cái mình mong đợi là khi chạy lại MyApp.exe này kết quả sẽ là “789”. Tuy nhiên kết quả lại như cũ:

clip_image015[6]

Quay lại nếu execute lại MyApp trong Visual Studio thì kết quả:

clip_image016[6]

Chuyện gì đã xảy ra?

 

II.          Giải thích

Khi biên dịch MyApp, chỗ sử dụng hằng CODE được trong main đã được thay thế bằng giá trị thật sự của nó lúc đó. Tức là trong MyConstant.dll cũ. Khi thay thế bằng MyConstant.dll mới thì cũng không ảnh hưởng gì đến giá trị CODE trong MyApp.

 

III.        Giải pháp

       Nếu như chọn sử dụng từ khóa const thì phải hết sức cẩn thận những trường hợp trên.

       Thay thế bằng từ khóa readonly là 1 lựa chọn tốt nếu không quan tâm đến tối ưu thực thi của chương trình.

       Ngoài ra, khi thiết kế chương trình, trước hết nên xem xét kĩ để đáp ứng yêu cầu đặt ra thì cần chọn phương pháp lưu trữ nào phù hợp: variable, constant, enum, hashtable, markup, relational database,…

 

Tình huống tôi viết khá dài.

Kinh nghiệm của tôi khi cần nhớ 1 điều gì đó, thì cần nhớ dẫn chứng kèm theo J

Hy vọng có ích! Xin cám ơn bạn đã ghé qua blog tôi.

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s