2011-09-06 6 views
8

thể trùng lặp:
What's the difference between encapsulating a private member as a property and defining a property without a private member?C#, Sự khác nhau giữa tài sản với biến và không có biến

Tôi biết các chức năng cơ bản của tài sản. Nhưng khi tôi đi qua tài liệu trong chiều sâu tôi thấy họ được tuyên bố chỉ với nhận được thiết lập và không có một biến.

các diffeence giữa hai

public int EmpCode 
{ 
    get { return _strEmpCode; } 
    set { _strEmpCode = value; } 
} 

public int EmpCode 
{ 
    get; 
    set; 
} 

là những gì là nó chỉ là một cách dễ dàng hơn viết mà đã như khung .net đã được nâng cấp. Hoặc là có bất kỳ sự khác biệt chức năng?

Trả lời

6

này sau đó được gọi là một tài sản tự động và là same.They đã được giới thiệu trong C# 3, bạn có thể đọc thêm về họ ở đây: http://trashvin.blogspot.com/2008/05/automatic-properties-and-object.html

một cách đơn giản, Automatic Properties là đường cú pháp để các nhà phát triển phải gõ ít mã hơn và trình biên dịch sẽ tạo ra trường riêng và bộ công khai và getter cho bạn.

+0

Đây có phải là viết tắt của tất cả các loại dữ liệu được áp dụng không? –

+0

@Nithesh Hebri - Thật vậy. –

+0

Bao gồm trong khung .net 3.5? –

3

Đây được gọi là thuộc tính tự động. Không có sự khác biệt về chức năng. Cú pháp thứ hai chỉ là một cách viết tắt của cái cũ.

Mục 10.7.3 của C# specification cho biết thêm chi tiết:

Khi một tài sản được quy định như một tài sản tự động thực hiện, một lĩnh vực sao lưu ẩn là tự động có sẵn cho bất động sản, và các bộ truy xuất được thực hiện để đọc từ và ghi vào trường sao lưu đó.

Ví dụ sau đây:

public class Point { 
    public int X { get; set; } // automatically implemented 
    public int Y { get; set; } // automatically implemented 
} 

là tương đương với việc kê khai như sau:

public class Point { 
    private int x; 
    private int y; 
    public int X { get { return x; } set { x = value; } } 
    public int Y { get { return y; } set { y = value; } } 
} 
+1

không có sự khác biệt về chức năng, tuy nhiên nếu bạn sắp xếp hàng tự động, bạn sẽ nhận được những cái tên khó hiểu cho trường sao lưu. – vittore

0

Nó được gọi là Auto-tài sản và chỉ là một cách dễ dàng hơn viết họ nếu bạn không cần bất kỳ logic bên trong tài sản. Khi biên dịch, trình biên dịch sẽ tự động tạo một biến sao lưu cho thuộc tính để nó giống hệt nhau. Thật dễ dàng để thay đổi bất động sản thành một tài sản với một lĩnh vực sao lưu và một số logic sau này, và điều đó sẽ không phá vỡ bất kỳ mã nào phụ thuộc vào tài sản này, thay vào đó bạn chỉ sử dụng một lĩnh vực công cộng đầu tiên, và sau đó thay đổi nó vào một thuộc tính bạn sẽ phá vỡ mã dựa vào trường/thuộc tính này.

+0

Cách viết tắt này có áp dụng cho tất cả các loại dữ liệu không? –

+0

@Nithesh Hebri - Thật vậy. –

0

không có sự khác biệt chức năng như vậy .. nhưng nếu bạn muốn chức năng thêm về thiết lập tài sản của bạn/nhận bạn có thể sử dụng phiên bản với các biến riêng ..

public int EmpCode 
    { 
     get { return _strEmpCode > 0 ? 100 + _strEmpCode : 0; } 
     set 
     { 
      if (value > 0) 
       _strEmpCode = value; 
     } 
    } 

Nếu không, bạn chỉ có thể sử dụng phiên bản không có biến riêng.

0

Cách thứ hai thực sự là thuộc tính tự động hoàn toàn triển khai trường sao lưu, có nghĩa là bạn không thể ảnh hưởng đến tên trường đã tạo.

Hầu hết thời gian bạn không quan tâm, tuy nhiên trong các trường hợp khi bạn chuyển đối tượng giữa các lớp bằng cách tuần tự hóa/deserializing, bạn sẽ tạo trường sao lưu rõ ràng để loại bỏ __propBackingField2735t34 như tên trên khách hàng.

Cũng trong thuộc tính mã hóa một cách rõ ràng một số logic để xác nhận có thể được bao gồm trong đó không phải là trường hợp cho autoproperites

0

Đây là một cải tiến từ C# 3.0 mà được gọi là tự động thực hiện tài sản, một lĩnh vực sao lưu tin được tự động tạo ra bởi trình biên dịch trong nền