2010-09-03 32 views

Trả lời

5

Bạn thường sử dụng một const trong toàn bộ giải pháp của mình. Nhưng những lợi ích để sử dụng trong phạm vi địa phương, sẽ là bạn biết một số nơi khác trong phạm vi của bạn, bạn sẽ không thay đổi nó. Và nếu người khác đang làm việc trên mã này, họ cũng sẽ không biết thay đổi mã đó. Điều này làm cho chương trình của bạn dễ bảo trì hơn, vì bạn chỉ cần duy trì const (ngay cả khi chỉ trong phạm vi địa phương)

3

Có. Bạn sẽ bảo vệ mã của bạn khỏi vô tình thay đổi biến này.

2

Khai báo địa phương dưới dạng const sẽ cho trình biên dịch biết bạn có ý định để bạn không thể thay đổi giá trị biến của bạn ở nơi khác trong hàm của bạn.

1

Ngoài các câu trả lời hợp lệ, bạn không chỉ cho trình biên dịch biết giá trị sẽ không thay đổi, bạn nhanh chóng nói với bất kỳ ai khác sẽ xem mã của bạn.

+1

Tôi khai báo các const địa phương cho các lập trình viên khác nhiều hơn bất kỳ lý do nào khác. –

0

Tùy thuộc vào trường hợp sử dụng ..

Ví dụ,

void Foo() 
{ 
    const string xpath = "//pattern/node"; 

    new XmlDocument().SelectNodes(xpath); 
} 

trong trường hợp này tôi nghĩ rằng tuyên bố const là vô nghĩa

+1

Tôi nghĩ rằng điều này vẫn có giá trị, một lý do cho sự nhất quán. Nếu bạn luôn sử dụng quy tắc const phạm vi cục bộ, bạn ít có khả năng quên nó ở một vị trí mà nó có thể mang lại lợi ích hơn (bạn không mất bất cứ thứ gì ở đây bằng cách sử dụng nó, và nó không có nhiều kiểu gõ thừa). Ngoài ra, nếu chức năng này được phát triển lớn hơn trong tương lai, bạn không cần phải lo lắng về việc ai đó thay đổi giá trị hơn nữa trong phạm vi mà không nhận ra ý định ban đầu của bạn. – cweston

5

Tuyên bố const biến cũng sẽ cho phép trình biên dịch để làm tối ưu hóa - thay vì nói phân bổ một int trên stack và đặt giá trị của nó ở đó, trình biên dịch có thể chỉ sử dụng giá trị trực tiếp với mã của bạn

ie Sau đây:

const int test = 4; 
DoSomething(test); 

thể được biên dịch như

DoSomething(4); 

bởi trình biên dịch

Edit: Trả lời "tuyên truyền liên tục" như các ý kiến ​​hộp có giới hạn kích thước

Sử dụng ildasm để kiểm tra betweeen const và không có const để phát hành với tối ưu hóa:

int test = 4; 
Console.WriteLine(test*2); 

Biên dịch để

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  11 (0xb) 
    .maxstack 2 
    .locals init ([0] int32 test) 
    IL_0000: ldc.i4.4 
    IL_0001: stloc.0 
    IL_0002: ldloc.0 
    IL_0003: ldc.i4.2 
    IL_0004: mul 
    IL_0005: call  void [mscorlib]System.Console::WriteLine(int32) 
    IL_000a: ret 
} // end of method Program::Main 

Trong khi

const int test = 4; 
Console.WriteLine(test*2); 

được tối ưu hóa để

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  7 (0x7) 
    .maxstack 8 
    IL_0000: ldc.i4.8 
    IL_0001: call  void [mscorlib]System.Console::WriteLine(int32) 
    IL_0006: ret 
} // end of method Program::Main 

này được sử dụng năm 2010 tại r elease với optimisations.

Tôi đã làm một tìm kiếm để tìm hiểu thêm về công tác tuyên truyền liên tục và trong khi posible, trình biên dịch hiện tại không làm được điều này như đã đề cập here

+0

Thậm chí nếu bạn không gắn thẻ biến của mình dưới dạng const, trình tối ưu hóa sẽ dễ dàng xác định rằng biến của bạn là hằng số và sau đó sẽ tạo mã ở trên. Nó được gọi là "tuyên truyền liên tục". – Roubachof

+0

@Roubachof Tôi không nghe nói về "tuyên truyền liên tục" trước đây, cảm ơn cho bình luận. Tôi đã chỉnh sửa câu trả lời của mình bằng một liên kết mà tôi đã tìm thấy khi đọc về nó; nó chỉ ra trình biên dịch hiện tại không làm điều đó - có thể trong tương lai! (Một khi họ đã sửa các lỗi hiện tại trong năm 2010!) – JLWarlow

+0

thực sự ?? đây là một kỹ thuật tối ưu hóa cơ bản, tôi thực sự ngạc nhiên trước tin tức này. Làm tốt lắm! – Roubachof

3

Tôi muốn làm điều này khi tôi đang đi qua một chỉ số cờ boolean đến một phương pháp :

const bool includeFoo = true; 
int result = bar.Compute(10, includeFoo); 

Điều này dễ đọc hơn so với đơn giản/sai, yêu cầu đọc khai báo phương pháp để xác định ý nghĩa.

+1

Tôi thích Dan này. Tôi đã nhận thấy rằng MS dường như làm điều này trong mã nguồn của họ: base.Compute (10, true/* includeFoo * /); có lợi ích của một dòng còn lại. – Nik

+1

Trong C# 4.0, bạn có thể sử dụng các tham số có tên để thực hiện điều tương tự (hy vọng các tham số có tên hợp lý!) Không phải những gì chúng được giới thiệu, nhưng chúng có lợi thế là đảm bảo bạn sử dụng tên chính xác (sử dụng const constals hoặc comments) trong một cuộc gọi với nhiều cờ như vậy có thể khiến họ vô tình bị lộn xộn). – shambulator

+1

Khi tôi thiết kế giao diện của riêng mình, tôi có xu hướng cố gắng tránh các tham số boolean ở vị trí đầu tiên và tạo các phương thức công khai khác nhau ánh xạ tới phương thức nội bộ bằng cờ hoặc sử dụng giá trị enum cho cờ. Tôi vẫn thấy kỹ thuật này hữu ích khi tương tác với các API có tham số boolean hoặc 'ma thuật' (như string.Empty để chỉ ra 'missing'). –

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