2010-07-09 25 views
12

Khi xác định một lớp học mới trong một dự án thực hành chính xác/tốt nhất để làm như vậy là gì? Trong quá khứ tôi đã tạo ra các lớp học như:Làm thế nào để xác định đúng các thuộc tính lớp?

public class MyClass 
    { 
     public string FirstName {get; set;} 
     public string LastName {get; set;} 
    } 

Bình thường, tôi muốn sử dụng một lớp như thế này để tạo ra các bộ sưu tập trong một dự án.

Tuy nhiên như tôi tiếp tục học hỏi và tìm hiểu thêm về C Thăng Tôi xem các ví dụ nơi lớp học được định nghĩa là:

class MyClass //not set to public 
    { 
     private string _firstName; //first defined as fields 
     private string _lastName; 

     public string FirstName // then defined as properties 
     { 
      get { return _firstName; } 
      set { _firstName = value; } 
     } 
     public string LastName 
     { 
      get { return _lastName; } 
      set { _lastName = value; } 
     } 
    } 

là phương pháp đầu tiên không chính xác trong định nghĩa hoặc đây là một phiên bản tốc ký được chấp nhận trong C#? Cách tốt nhất là trước tiên bạn nên xác định lớp với các trường riêng và sau đó xác định chúng là thuộc tính bằng cách sử dụng get/set thành một giá trị?

Tôi hỏi vì tôi tự dạy trong C# và tôi đang cố gắng cải thiện cũng như hiểu rõ hơn cách tiếp cận phù hợp để phát triển và một số mẫu và hướng dẫn (hoặc nên được thực hiện) trên khác.

Cảm ơn trước

+0

Trong ví dụ thứ hai, không được có dấu ngoặc đóng sau trường _lastname. Điều đó phải ở cuối định nghĩa lớp. Các thuộc tính vẫn được định nghĩa trong khối lớp. (trừ khi có điều gì đó tôi không biết về C#) –

Trả lời

16

dụ đầu tiên của bạn:

public class MyClass 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

là đặc biệt Auto-Implemented Properties, được giới thiệu trong C# 3.0. Cả định dạng đều sai. Việc đầu tiên là nhiều hơn một 'viết tắt'.

Với loại phức tạp hơn, nó là đôi khi vẫn hữu ích để sử dụng phong cách cũ, và phơi bày chỉ tính chất nhất định hoặc giá trị từ một biến tư nhân, chẳng hạn như:

public class MyClass 
{ 
    private Dictionary<int, List<string>> _someInternalDictionary; 

    public int MyValuesCount 
    { 
     get 
     { 
      return _someInternalDictionary.Values.Count; 
     } 
    } 

} 

Một ví dụ thô nhưng hy vọng bạn sẽ có được của tôi ý kiến.

+5

+1; đầu tiên là một toàn bộ rất nhiều thuận tiện hơn cho tài sản câm, và có thể dễ dàng được chuyển đổi thành thứ hai nếu bạn thấy mình cần logic. – tzaman

+0

@tzaman: cũng đã nói. Suy nghĩ của tôi chính xác. –

+0

thậm chí tốt hơn: đầu tiên 'câm' một có thể được tự động viết lại để tức là INotifyPropertyChanged tại thời gian biên dịch với nghĩa là PostSharp – quetzalcoatl

13

Cú pháp tốc ký (tự động thực hiện các thuộc tính) trong ví dụ đầu tiên của bạn đã được giới thiệu trong C# 3.0, và không hợp lệ trước đó. Trình biên dịch thực sự chuyển đổi chúng thành dạng đầy đủ với các trường sao lưu.

Trước C# 3.0, cách chính xác duy nhất để xác định thuộc tính là với trường sao lưu.

Ngay cả với C# 3.0, nếu bạn muốn có bất kỳ logic nào trong thuộc tính của mình, bạn cần chuyển đổi chúng để sử dụng các trường sao lưu.

Trong ngắn hạn - cho các thuộc tính câm (những người không làm gì), hãy sử dụng các thuộc tính tự động. Chúng làm cho mã của bạn đơn giản và dễ đọc hơn và có thể được chuyển đổi.

+0

Cảm ơn bạn đã đề cập đến bước tiềm năng để chuyển đổi các thuộc tính tự động. Tôi cũng muốn thêm rằng xuất bản các giá trị này dưới dạng thuộc tính tự động có nghĩa là bạn có thể thay đổi chúng thành thuộc tính được hỗ trợ theo cách thủ công sau mà không vi phạm giao diện ở cấp nhị phân. Ngược lại, các trường công cộng (ick!) Không tương thích nhị phân với các thuộc tính công khai có cùng tên. –

4

Hai lớp bạn có trong thực tế giống hệt nhau về chức năng và tính năng.

Mục đích của cú pháp thuộc tính tự động (lớp đầu tiên) về cơ bản là cung cấp cho bạn một cách nhanh chóng để khai báo những gì cơ bản giống như lớp thứ hai bạn hiển thị.

tôi sẽ gắn bó với phiên bản đầu tiên cho đến khi bạn cần phải thêm mã vào getter hoặc phương pháp setter (như xác nhận một giá trị mới cho bất động sản.)

Mục đích của cú pháp thuộc tính tự động là kép, nó được một phần được thêm vào để tạo điều kiện cho LINQ, và một phần được thêm vào để làm cho nó dễ dàng hơn để chỉ đảm bảo bạn khai báo các thuộc tính, chứ không phải các trường công khai.

Nếu bạn khai báo một lớp bằng cách sử dụng các thuộc tính tự động (một lần nữa, phiên bản đầu tiên), thì tất cả các assembly khác được biên dịch dựa vào mã của bạn sẽ biết rằng lớp của bạn khai báo những thuộc tính này chứ không phải là trường. Nếu sau này bạn quyết định rằng bạn cần phải thêm mã, như xác nhận hợp lệ, các assembly khác không cần phải biên dịch lại, vì chúng vẫn tìm thấy các thuộc tính.

+0

Bạn có thể giải thích về cách tính chất tự động tạo điều kiện LINQ? Tôi không thấy kết nối bản thân mình. – LukeH

+0

Chúng được thêm vào như một phần của gói loại ẩn danh. –

+1

Ok, tôi vẫn không hiểu tại sao chúng lại cần thiết cho Linq. Hm ... –

0

Bạn cũng có thể sử dụng Access Modifier cho get và thiết lập ...

public {ReturnType} MyProperty { {Access Modifier}get; {Access Modifier}set; } 

Và tôi cho rằng bạn đã có kiến ​​thức về Access Modifier.

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