2010-03-25 51 views
21

Tôi mong muốn biết sự khác biệt giữa biến const và biến tĩnh.Sự khác nhau giữa Const và Static trong C# là gì?

Theo như tôi biết một const cũng là tĩnh và không thể truy cập trên biến mẫu giống như tĩnh, thì sự khác biệt giữa chúng là gì?

Vui lòng giải thích ...

+9

Không có biến số const như vậy. –

Trả lời

29

Trường const chỉ có thể chứa các loại giá trị hoặc System.String. Chúng phải không thay đổi và có thể giải quyết được trong thời gian biên dịch.

static readonly trường có thể và thường giữ các loại tham chiếu, trong đó (ngoài chuỗi) chỉ có thể được tạo khi chạy. Đây có thể (nhưng không nên) là các loại có thể thay đổi; điều duy nhất không thể thay đổi chính là tham chiếu.

Nếu bạn cần duy trì một tập hợp các trường hợp "liên tục" là loại tham chiếu, bạn thường làm điều đó với một tập hợp các trường public static readonly, chẳng hạn như các thành viên của System.Drawing.SystemColors.

Cuối cùng nhưng không kém, khởi tạo trường readonly có thể được trì hoãn cho đến khi thực thi hàm tạo, có nghĩa là nó chỉ có thể là được ghi thành một lần, không phải lúc nào cũng được khởi tạo bằng chính xác cùng một giá trị. Hằng số thực được khai báo với const chỉ có thể có một giá trị duy nhất (được chỉ định tại thời gian biên dịch).

+1

Cũng có thể thay đổi một chỉ đọc tĩnh trong một hàm tạo, vì vậy các hàm tạo khác nhau có thể cung cấp các giá trị khác nhau cho trường chỉ đọc tĩnh. –

+0

@ Jeff: Tôi không phải là Joel. : P – Aaronaught

2

Một (không đọc) tĩnh có thể được thay đổi sau khi được khai báo trong khi hằng số không thể. Ngoài ra, một hằng số không thể được thiết lập bằng cách sử dụng một hàm trong khi một biến tĩnh có thể.

6

Như bạn nói, cả tĩnh và const được gắn vào một loại thay vì một ví dụ của một loại. Tuy nhiên, bạn vẫn có thể thay đổi các mục tĩnh. Bạn không thể thay đổi các mục const.

Hãy cẩn thận với điều này. Nếu mục const của bạn là kiểu tham chiếu, biểu thức được gán phải được đánh giá tại thời gian biên dịch và điều đó có nghĩa là giá trị duy nhất bạn có thể cung cấp tham chiếu là null (với ngoại lệ đáng chú ý và hữu ích của chuỗi).

+0

Điều này nghe không đúng. Tĩnh là hợp lệ trên một lĩnh vực là tốt. Và loại tham chiếu const duy nhất có thể là một chuỗi. Bạn không thể thay đổi chuỗi. –

+0

Cũng đáng chú ý rằng chỉ có hai loại tham chiếu mà một const có thể giữ là chuỗi và null –

+0

Nó nghe có vẻ sai với tôi, quá, ngay sau khi tôi đã viết nó. Vì vậy, tôi đã đi và kiểm tra - bạn _can_ có một loại tham chiếu. Tôi _knew_ điều đó là có thể. Nhưng ngoại trừ các chuỗi khi bạn thực hiện nó phải là null. Cập nhật câu trả lời của tôi để phản ánh điều đó. –

11

Một khác biệt tinh tế nhưng quan trọng là consts được đánh giá tại thời gian biên dịch, trong khi statics được đánh giá vào thời gian chạy. Điều này có tác động quan trọng đến việc tạo phiên bản. Ví dụ: giả sử bạn viết:

public const int MaxValue = 100; 

Bạn biên dịch và giao hàng lắp ráp (Lắp ráp A). Sau đó, người khác viết một assembly (Assembly B) tham chiếu MaxValue. Trong trường hợp này, giá trị 100 được biên dịch thành assembly của chúng cũng như của bạn.

Nếu bạn đã viết này:

public static readonly int MaxValue = 100; 

sau đó tham chiếu trong lắp ráp của họ sẽ vẫn chỉ là một tài liệu tham khảo. Khi ai đó chạy Assembly B, giá trị 100 sẽ được tải từ lắp ráp của bạn, Assembly A.

Điều này có thể ảnh hưởng đến các tình huống vá đơn giản.Nếu bạn phát hành một Assembly A cập nhật, MaxValues ​​được khai báo là 200, và người dùng copy phiên bản đó lên phiên bản trước (nhưng không biên dịch lại B), thì trong kịch bản đầu tiên Assembly B sẽ tiếp tục hoạt động như thể MaxValues ​​là 100, bởi vì đó là giá trị const được biên dịch thành Assembly B. Trong kịch bản thứ hai, Assembly B sẽ nhận giá trị mới vì nó tải biến không phải là static khi chạy.

0

Hằng số là một biến không thể thay đổi về giá trị.

Tĩnh là biến không thể sử dụng ngoài phạm vi khai báo. Nghĩa là, nếu nó là một biến toàn cục thì nó chỉ có thể được sử dụng trong tệp khai báo nó. Nếu nó là một biến bên trong một hàm, thì nó có thể được sử dụng chỉ bên trong hàm đó.

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