2012-08-16 21 views
8

thể trùng lặp:
Is it better to declare a variable inside or outside a loop?Đây có phải là "tuyên bố di chuyển gần hơn với việc sử dụng" thực sự thích hợp hơn không?

Resharper muốn tôi thay đổi điều này:

int Platypus; 
string duckBill1; 
string duckBill2; 
string duckBill3; 
. . . 
using (OracleDataReader odr = ocmd.ExecuteReader()) { 
    while (odr.Read()) { 
     Platypus = odr.GetInt32("Platypus"); 
     duckBill1 = odr.GetString("duckBill1"); 
     duckBill2 = odr.GetString("duckBill2"); 
     duckBill3 = odr.GetString("duckBill3"); 
     switch (Platypus) { 
     . . . 

... như thế này:

using (OracleDataReader odr = ocmd.ExecuteReader()) { 
    while (odr.Read()) { 
     int Platypus = odr.GetInt32("Platypus"); 
     string duckBill1 = odr.GetString("duckBill1"); 
     string duckBill2 = odr.GetString("duckBill2"); 
     string duckBill3 = odr.GetString("duckBill3"); 
     switch (Platypus) { 
     . . . 

... nhưng theo cách này (có vẻ như, ít nhất, đó) các vars đang được tuyên bố N lần, một lần cho mỗi lần thông qua các vòng lặp while. Là cách Resharperized thực sự tốt hơn so với bản gốc?

Trả lời

16

Vâng, nó là tốt hơn bởi vì bạn đang giới hạn phạm vi của các biến khai báo. Sẽ không có tác động hiệu suất nào để khai báo chúng bên trong vòng lặp. Lý do Resharper cho thấy sự thay đổi này là bạn không sử dụng chúng ngoài vòng lặp.

+5

Và nếu bạn khai báo chúng ngoài vòng lặp, phạm vi của chúng sẽ rộng hơn, có nghĩa là sẽ mất nhiều thời gian hơn để chúng được phát hành. +1 –

+1

@AndreCalil Không, điều đó sẽ không xảy ra vì phạm vi không liên quan gì đến việc thu thập đủ điều kiện. Tác động hiệu suất là không, như rsbarro nói. –

+0

@JonHanna Tôi xin lỗi, tôi không thấy bộ sưu tập nằm trong chủ đề nào. Nếu bạn khai báo một biến trên phạm vi của một phương thức, nó sẽ không được phát hành cho đến khi kết thúc phương thức. Nếu phạm vi chỉ là một vòng lặp (giống như 'while'), nó sẽ được phát hành sớm hơn. Và thậm chí một chuỗi rỗng phân bổ bộ nhớ: http://stackoverflow.com/a/6601485/1484750 –

2

Trình biên dịch thường sẽ tối ưu hóa biểu thức như vậy và "nâng đỡ" khai báo biến bên ngoài vòng lặp, vì biến chính nó là không phụ thuộc vào các điều kiện vòng lặp. Điều này tạo ra mã mà bạn đã minh họa một cách hiệu quả trong ví dụ đầu tiên.

Trong trường hợp này, đề nghị Resharper là chỉ để loại bỏ một số dòng dư thừa mã, ngoài việc giảm phạm vi tiền biên dịch của họ.

+0

Thậm chí không có gì để nâng, tuyên bố chỉ nói "khi tên này được sử dụng trong phạm vi này, nó có nghĩa là ...", không dịch sang mã được biên dịch. Tuy nhiên, nếu nó được gán với tuyên bố, và nhiệm vụ đó không được viết quá muộn trong vòng lặp (điều đó sẽ thay đổi ý nghĩa anyway) thì điều đó thực sự rất có thể sẽ được dỡ bỏ. –

4

Có, nhưng tuyên bố chúng không mất thời gian khi chạy. Chúng không chiếm nhiều bộ nhớ hơn vì trình biên dịch sẽ chỉ tái sử dụng các vị trí bộ nhớ của chúng.

8

Nói chung, một thói quen lập trình tốt để khai báo các biến trong một phạm vi hẹp như càng tốt. Lý do là:

  1. Ẩn thông tin.
  2. Dễ hiểu hơn.
  3. Ít có khả năng xảy ra sự cố bollux.

Mặc dù có vẻ như các biến mới được khai báo với mỗi lần lặp qua vòng lặp, chúng được khai báo tại thời gian biên dịch, không chạy thời gian. Không gian được phân bổ trên khung ngăn xếp cho các biến [s], và cùng một không gian được tái sử dụng cho mỗi lần lặp qua vòng lặp.

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