Cày .NET
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Nên sử dụng readonly hơn là dùng const

Go down

Nên sử dụng readonly hơn là dùng const Empty Nên sử dụng readonly hơn là dùng const

Bài gửi  MrNguyen Wed Apr 09, 2008 1:17 am

hey, mình mới vào nhóm mong các pác chỉ giáo afro afro afro
part 1-Nên sử dụng readonly hơn là dùng const :
C# có 2 kiểu hằng là hằng runtime(runtime const) và hằng Compile-time (khái niệm có vẻ mới so với DQT);
Nói về Run time Const (RTC)được tạo ra với từ khóa readonly ; Còn Compile time const(CTC) thì được tạo ra bởi từ khóa const:

// Compile time constant:
public const int _Millennium = 2000;

// Runtime constant:
public static readonly int _ThisYear = 2004;

sự khác biệt trong run time const và compile-time const chỉ là trong cách mà các hằng này được truy xuất:
CTC được thay thế bởi giá trị của chính hằng trong đoạn mã của bạn:
ví dụ
if ( myDateTime.Year == _Millennium )

khi dịch về ngôn ngữ trung gian ^^(IL) thì nó giống y hệt như khi bạn có đoạn mã sau:
if ( myDateTime.Year == 2000 );

RTC được định trị trong thời gian runtime;Và ngôn ngữ trung gian(IL) được sinh ra khi bạn tham chiếu một hằng read only tham chiếu đến biến readonly chứ không phải là giá trị của nó;
CTC chỉ sử dụng cho kiểu built in , floating point, hay là kiểu string..chúng là những kiểu duy nhất mà bạn có thể khởi tạo một hằng có ý nghĩa;

Khởi dựng (construct) sau sẽ không bao giờ dịch được; không thể khởi tạo một CTC sử dụng toán tư new thậm chí kiểu khởi tạo có là một kiểu giá trị đi chăng nữa.

EX:// Does not compile, use readonly instead:sẽ không dịch trừ khi sử dụng readonly
private const DateTime _classCreation = new
DateTime( 2000, 1, 1, 0, 0, 0 );

CTC bị giới hạn bởi numbers và strings;readonly const thì không bị giới hạn này; bạn sẽ phải khai báo nó trong hàm khởi dựng (Constructor) hoặc bộ khởi gán (initializer); bạn có thể tạo cấu trúc datetime và tạo giá trị của datetime như một hằng


Nhưng điều quan trọng nhất là readonly được sử lý lại (resolve) trong thời gian chạy; còn CTC thì chỉ tạo ra 1 IL duy nhất và được sử dụng qua lại trong nhiều dây chuyền (assembly) mà một hằng số trong một dây chuyền
vẫn bị thay đổi khi được sử dụng qua một dây chuyền khác;
Chúng ta cùng khởi tạo hằng trong cùng một trường assembly tên là :
Infrastructure:

public class UsefulValues
{
public static readonly int StartValue = 5;

public const int EndValue = 10;
}
trong assembly khác bạn tham chiếu lại giá trị trên:(Application assembly )

for ( int i = UsefulValues.StartValue;
i < UsefulValues.EndValue;
i++ )
Console.WriteLine( "value is {0}", i );

Nếu bạn kiểm tra thử thì kết xuất sẽ là

Value is 5
Value is 6
...
Value is 9
Thời gian trôi qua ^^ bạn tạo một version mới cho Infrastructure assembly với một vài thay đổi sau:

public class UsefulValues
{
public static readonly int StartValue = 105;

public const int EndValue = 120;
}

bạn phân phối lại Infrastructure assembly mà không làm thay đổi assembly còn lại; và bạn đoán là sẽ nhận được kết xuất như sau đúng không:

Value is 105
Value is 106
...
Value is 119


Trong thực tế thì chẳng có kết xuất nào hết; vòng lặp sẽ bắt đầu bởi giá trị là 105 và kết thúc sẽ là 10
affraid ;
Trình biên dịch bây giờ đã đặt giá trị hằng số 10 cho Application assembly mà không thèm tham chiếu đến vùng kí ức của EndValue;như vậy chỉ một thay đổi nhỏ của Infrastructure:assembly đã làm cho hệ thống client(cờ lai ơn) ăn theo sụp đổ;
Tuy nhiên điểm tiến bộ duy nhất của const so với readonly là thời gian chạy const sẽ ít hơn;
vậy nếu phải chọn một trong 2 : một cái thì chạy nhanh nhưng bấp bênh, một cái thì chạy chậm nhưng an toàn,bạn chắc hẳn đã biết phải chọn cái nào;

CHỈ NÊN chọn const khi sử dụng dạng enum và không thay đổi assembly;còn nếu không thì đẻ tăng tính năng động ta nên sử dụng readonly;


part II Nên sử dụng toán tử is ,as hơn là casts

Sleep

MrNguyen

Tổng số bài gửi : 3
Join date : 08/04/2008

Về Đầu Trang Go down

Nên sử dụng readonly hơn là dùng const Empty Re: Nên sử dụng readonly hơn là dùng const

Bài gửi  MrNguyen Wed Apr 09, 2008 3:57 pm

Đã test
Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace Tester1
{
    public class UsefulValues
    {  public static readonly int StartValue = 5;

        public const int EndValue = 10;}
  public class application {
                static int Main()
            {
                        for (int i = UsefulValues.StartValue; i < UsefulValues.EndValue; i++)
                        Console.WriteLine("value is {0}", i); Console.ReadLine(); return (0);
           
              }
    }
}

MrNguyen

Tổng số bài gửi : 3
Join date : 08/04/2008

Về Đầu Trang Go down

Nên sử dụng readonly hơn là dùng const Empty Re: Nên sử dụng readonly hơn là dùng const

Bài gửi  MrNguyen Wed Apr 09, 2008 4:18 pm



XIN LỖI Đoạn Code trên là không đúng theo ý đồ của tác giả;
Crying or Very sad

Trong nhóm ai đã đọc quyển 2 về Assembly làm ơn test hộ với
Mình cũng đang băn khoăn là không biết có đúng hay không nữa;
Crying or Very sad

MrNguyen

Tổng số bài gửi : 3
Join date : 08/04/2008

Về Đầu Trang Go down

Nên sử dụng readonly hơn là dùng const Empty Re: Nên sử dụng readonly hơn là dùng const

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

Về Đầu Trang


 
Permissions in this forum:
Bạn không có quyền trả lời bài viết