2011-09-06 53 views
10

Gần đây tôi thấy một người nặng nề sử dụng var và mặc định từ khóa cho tuyên bố của các biến (và cho mỗi khai), một cái gì đó như thế này:Sử dụng var và mặc định cho khai trong C#

var employee = default(Employee); //Employee is a class 
var errorInfo = default(ErrorInfo); //ErrorInfo is struct; Blank is default value 
var salary = default(Double); 
var isManager = default(Boolean?); 

thay vì sử dụng :

Employee employee = null;   //Employee is a class 
ErrorInfo errorInfo = Blank;  //ErrorInfo is struct; Blank is default value 
Double salary = 0.0; 
Boolean? isManager = null; 

hay, thay vì sử dụng thậm chí:

Employee employee;     //Employee is a class 
ErrorInfo errorInfo;    //ErrorInfo is struct; Blank is default value 
Double salary; 
Boolean? isManager; 

Bây giờ sử dụng var và mặc định cho khai báo cho mỗi biến là một cái gì đó tôi không quen với.

Bạn muốn biết:
- Nếu đây là phương pháp được khuyến nghị?
- Chế độ xem và tùy chọn của bạn?

PS:
- đã trải qua Use of var keyword in C#, Use of "var" type in variable declarationhttps://stackoverflow.com/questions/633474/c-do-you-use-var Tuy nhiên, nghĩ rằng câu hỏi này mặc dù có liên quan là hơi khác nhau vì nó là duy nhất xung quanh tuyên bố/khởi tạo và không xung quanh chuyển nhượng.
- Tôi hiểu sự khác biệt giữa đoạn 2 và đoạn trích 3. Tuy nhiên, câu hỏi xung quanh đoạn mã 1.
- Nếu bạn cảm thấy mạnh mẽ rằng câu hỏi này thuộc về lập trình viên stackexchange cảm thấy tự do di chuyển.

+1

Tôi đồng ý, bất kỳ điều gì khiến bạn nghĩ "tôi tự hỏi giá trị mặc định của errorInfo là gì" chỉ làm giảm khả năng đọc. Đặc biệt là nếu bạn phải đi và đào sâu vào nguồn để tìm hiểu. –

+0

@Ben: Tôi không hiểu nhận xét của bạn. Tại sao bạn cần đào? Giá trị mặc định cho các kiểu tham chiếu luôn là 'null'. –

+0

@Daniel có nhưng errorInfo trong ví dụ này là một cấu trúc mà bất kỳ loại ngẫu nhiên bạn chưa bao giờ nghe nói có thể được ở cái nhìn đầu tiên. –

Trả lời

8

Tôi sẽ không nói bất cứ điều gì về "var" đã có ý kiến ​​và thảo luận về vấn đề này trong thời gian qua (đủ để ;-)

Về "mặc định()" Tôi sẽ không sử dụng để khởi tạo a được biết đến loại, nhưng thay vì chỉ trong generics. Ở đó, nó giúp xử lý minh bạch các loại giá trị hoặc loại tham chiếu bằng cách cho phép bạn cung cấp giá trị mặc định (trả về) hoặc có thể được sử dụng để so sánh.

2

Tôi nghĩ rằng đây là thực hành không tốt sẽ ngăn trình biên dịch (và các công cụ của bên thứ 3) bắt lỗi liên quan đến thất bại khi khởi tạo biến. Nói chung, tôi cố gắng giữ tuyên bố và phân công càng gần nhau càng tốt. Việc gán các giá trị không được dự định để sử dụng cho các biến có khả năng có thể đưa ra các lỗi tinh vi khó nắm bắt. Thông thường tôi muốn một trong hai:

SomeType variable1; //want to store something that will be out of scope later 
using(blah) 
{ 
    //... 
    variable1=blah; 
} 
//use variable1 here 

hoặc gán giá trị yêu cầu ngay lập tức:

SomeType variable2 = new SomeType(); 
//use variable2 immediately 

hoặc (đối với tôi, thường xuyên hơn nowdays)

var variable2 = new SomeType(); 

gán giá trị null/giữ chỗ là chủ yếu vô nghĩa .

4

Vâng, từ khóa default không phải là từ khóa được sử dụng nhất mà tôi nghĩ, và theo ý kiến ​​của tôi nó phục vụ mục đích của nó tốt nhất về Generics, như vậy:

public class Foo<T>{ 

    private T _instance; 
    public Foo<T>(){ 
     _instance = default(T); 
    } 
} 

để có được một mặc định mới Ví dụ của T. Có thực sự không có lý do để sử dụng nó như kịch bản 1 trong bài viết của bạn.

Sử dụng var tuy nhiên là một câu hỏi khác và nhiều người coi đây là vấn đề dễ đọc. Tôi mặc định var khi tôi viết mã đơn giản chỉ vì tôi tìm thấy nó dễ dàng hơn để đọc:

var me = new Person(); 

Nó có vẻ hơi dư thừa về khả năng đọc để làm

Person me = new Person(); 

Một trường hợp tôi khuyên bạn nên var là nếu có điều gì thay đổi. Hãy xem xét ví dụ sau:

public decimal Calculate(decimal one, decimal two){ 
    return one + two; 
} 

Và ở một nơi khác trong mã của bạn:

decimal d = Calculate(1M, 2M); 

Nếu bạn vì một lý do thay đổi kiểu trả về của Calculate đến, nói, double bạn cần phải thay đổi tất cả những nơi bạn đã xác định mạnh biến.

Nếu bạn thay vì làm

var d = Calculate(1M, 2M) 

bạn không phải lo lắng về việc này. Ví dụ Double/Decimal là một chút đơn giản, nhưng về mặt cấu trúc lại và xen kẽ các lớp, tôi đã thấy điều này rất hữu ích.

0

Tôi sử dụng var để gán. Tuy nhiên tôi luôn khai báo các cá thể sử dụng lớp. Tôi thường cũng khởi tạo chúng vào thời điểm đó để tránh các lỗi không mong muốn NullReferenceExceptions

0

Mã này là ok.

Chỉ cần đảm bảo rằng bạn không sao chép kỹ thuật này để khởi tạo enums trong đó 0 không phải là giá trị mặc định hoặc flagged liệt kê.

[Flags] 
public enum MyFlags 
{ 
    Test = 1, 
    Test2 = 2 
} 

MyFlags flags = default(MyFlags); 
Console.WriteLine(flags); // oops 
Các vấn đề liên quan