2012-04-07 38 views
10

Giả sử tôi có một số mã như thế này:C# tránh khai báo biến

public string SomeMethod(int Parameter) 
{ 
    string TheString = ""; 

    TheString = SomeOtherMethod(Parameter); 

    return TheString; 
} 

Tất nhiên, mã này là tương đương với điều này:

public string SomeMethod(int Parameter) 
{ 
    return SomeOtherMethod(Parameter); 
} 

Tôi nghĩ rằng phiên bản đầu tiên là dễ đọc hơn và đó là cách Tôi đang viết mã của tôi, thậm chí nghĩ rằng tôi đang sử dụng một biến khi tôi biết tôi có thể tránh được nó. Câu hỏi của tôi là: trình biên dịch biên dịch mã theo cùng một cách (tức là hiệu suất tương tự) hoặc là tùy chọn thứ hai thực sự tốt hơn về hiệu suất.

Cảm ơn.

+0

Tôi muốn có "chuỗi TheString =" ";" xem xét sử dụng chuỗi.Empty –

+1

Biểu mẫu đầu tiên có thể dễ đọc hơn như thế nào? Phải mất nhiều thời gian để đọc và có nhiều thứ để xử lý. –

+0

@ alpha123: Tôi có tất cả các biến của mình được khai báo ở đầu phương thức – frenchie

Trả lời

19

Tôi muốn nói rằng biểu mẫu đầu tiên là ít hơn có thể đọc được nó chứa bộ khởi tạo dự phòng. Tại sao khởi tạo biến thành "" nếu bạn sắp đặt cho nó một giá trị khác? Ít nhất thay đổi nó thành:

public string SomeMethod(int parameter) 
{ 
    string returnValue = SomeOtherMethod(parameter);  
    return returnValue; 
} 

hoặc nếu bạn thực sự muốn tách riêng tuyên bố từ khởi:

public string SomeMethod(int parameter) 
{ 
    string returnValue; 
    returnValue = SomeOtherMethod(parameter);  
    return returnValue; 
} 

(Lưu ý rằng tôi cũng đã điều chỉnh tên theo quy ước đặt tên NET và để đặt tên có ý nghĩa hơn cho biến cục bộ - "TheString" truyền tải không có ý nghĩa hữu ích.)

Bạn thực sự sẽ không thấy bất kỳ vấn đề hiệu suất nào khi sử dụng biến cục bộ, nhưng tôi thực sự khuyến khích bạn suy nghĩ về e khả năng đọc. Mục đích của biến cục bộ ở đây là gì? Bạn có thể mô tả phương pháp như sau: "Trả về kết quả gọi SomeOtherMethod với thông số đã cho" - tại thời điểm đó, phiên bản một dòng thực hiện chính xác mô tả đó.

+0

Mã tôi đã cung cấp thực sự là một sự đơn giản: biến returnValue đi qua một vài câu lệnh if và đôi khi các cuộc gọi hàm khác. Tôi sẽ sử dụng chuỗi TheString; thay vì chuỗi TheString = ""; để khởi tạo. Tôi đã vào thói quen sử dụng The ở phía trước của tên biến của tôi để tôi có thể tìm thấy chúng một cách dễ dàng với intellisense và không có thực sự được đặt tên TheString nhưng thay vì TheCounter hoặc ThePermission .... Cảm ơn câu trả lời. – frenchie

+0

Hoàn toàn đồng ý, tôi muốn thêm. Tôi yêu cầu rằng, ít nhất mọi phương thức, thuộc tính hoặc lớp công khai, phải được mô tả trong chức năng, tham số và giá trị trả về của nó được mong đợi bằng cách sử dụng nhận xét XML. – Steve

+10

@frenchie: Thật khó để đưa ra lời khuyên về mã hoàn toàn khác với ví dụ bạn đã đưa ra. Tôi cũng đề nghị rằng nếu bạn đang tìm kiếm các biến cục bộ của bạn khó theo dõi, các phương pháp của bạn có thể dài hơn chúng. Bạn không cần phải sử dụng tiền tố để hiểu mã của mình. –

13

Trình biên dịch sẽ tạo mã rất giống với hai ví dụ của bạn. Một sửa đổi nhỏ mặc dù là để tránh khởi tạo một chuỗi rỗng mà bạn không bao giờ sử dụng.

public string SomeMethod(int Parameter) 
{ 
    string result; 
    result = SomeOtherMethod(Parameter); 
    return result; 
} 

Tôi không chắc viết lại mã theo cách này làm cho nó dễ đọc hơn, nhưng nó không có nghĩa là bạn có thể thêm một breakpoint và thấy giá trị của result trước khi trở về phương pháp. Điều này có thể hữu ích khi gỡ lỗi.

Lưu ý bạn có thể kết hợp dòng đầu tiên và thứ hai và vẫn nhận được lợi ích này:

public string SomeMethod(int Parameter) 
{ 
    string result = SomeOtherMethod(Parameter); 
    return result; 
} 

Tôi nghĩ rằng phiên bản cuối cùng này là cả hai rất dễ đọc và dễ dàng để gỡ lỗi.

+0

ok, cảm ơn cho mẹo khởi tạo: Tôi sẽ xóa dấu ""; từ mã của tôi. – frenchie

+0

Trong một số trường hợp, tôi có một khởi tạo với = ""; và sau đó tôi có nhiệm vụ trong một tuyên bố nếu. Nếu câu lệnh if không bao giờ được thực hiện, thì biến trả về chỉ bằng "". Vì vậy, trong một số trường hợp, tôi thực sự cần phải có chuỗi TheString = ""; Có cách nào khác để làm điều đó không? – frenchie

+2

@frenchie: Bạn có thể sử dụng 'theString = null' trong khối khác. Trong hầu hết các trường hợp, bạn có thể cấu trúc lại mã để tránh phải tạm thời khởi tạo biến thành null trước khi đặt giá trị thực, nhưng bạn phải đăng mã cụ thể của mình trước khi tôi có thể nhận xét. –

4

trả lời đã được đăng tải mặc dù tôi xin trình bày một thử khác nhau:

Có 3 điều mà bạn đang tìm kiếm:

Độ khó, hiệu suất, tính hữu dụng (chẳng hạn như gỡ lỗi, đăng nhập vv ..)

1. Khả năng đọc có phần tương đối. Điều gì Eric Lippert/Jon Skeet tìm thấy một cái gì đó dễ đọc hơn, điều tương tự sẽ không được áp dụng cho tôi.Bạn càng viết nhiều mã, nhiều thứ và quan điểm của bạn sẽ thay đổi theo hướng xem mã.

Cả hai lựa chọn bạn đã cung cấp đều có thể đọc được, cho tôi thứ hai dễ đọc hơn.

2. Performance: Trong sự lựa chọn đầu tiên, như bạn có thể cho tôi biết về chuỗi bất biến rằng nếu bạn khởi tạo lại một chuỗi nó sẽ không rõ ràng tên trước đó (thực tập) và nó sẽ tạo ra chuỗi mới và biến sẽ chỉ nó vào nó.

Vì vậy, từ quan điểm hiệu suất, việc thực hiện một biến thành giá trị mới (không cần thiết) sẽ gây ra tắc nghẽn hiệu suất. Một lần nữa đây là tương đối, và phụ thuộc vào kích thước/coplexity của ứng dụng. Đối với điều này, bạn cần phải đi với tùy chọn thứ hai. Lựa chọn thứ hai của bạn và câu trả lời của Jon sẽ dẫn đến hiệu suất giống nhau.

3. Phối cảnh gỡ lỗi: bạn sẽ muốn có biến cục bộ nếu bạn đang tìm kiếm nội dung này.