2013-02-07 25 views
22

này có vẻ là rất ngu ngốc và câu hỏi thô sơ, nhưng tôi đã cố gắng để google nó, nhưng không thể một tìm một câu trả lời thỏa đáng,cách tốt nhất để tạo ra đối tượng

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public Person(){} 
    public Person(string name, int age) 
    { 
     Name = name; 
     Age = age; 
    } 
    //Other properties, methods, events... 
} 

Câu hỏi của tôi là nếu tôi có lớp như điều này, cách tốt nhất để tạo ra một đối tượng là gì?

Person p=new Person("abc",15) 

HOẶC

Person p=new Person(); 
p.Name="abc"; 
p.Age=15; 

sự khác biệt giữa hai phương pháp này và những gì là cách tốt nhất để tạo các đối tượng là gì?

+6

Chỉ cần thêm một lựa chọn thứ ba để trộn : 'Person p = new Person {Name =" abc ", Age = 15};' - hoặc thứ tư: 'Person p = new Person (tên:" abc ", tuổi: 15);'. Như X.L.Ant nói: không ai được tự động "tốt hơn" –

Trả lời

31

Quyết định xem bạn cần một đối tượng bất biến hay không.

Nếu bạn đặt public thuộc tính trong lớp của mình, trạng thái của mỗi trường hợp có thể được thay đổi tại mọi thời điểm trong mã của bạn. Vì vậy, lớp học của bạn có thể giống như thế này:

public class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public Person(){} 
    public Person(string name, int age) 
    { 
     Name = name; 
     Age = age; 
    } 
    //Other properties, methods, events... 
} 

Trong trường hợp đó, việc xây dựng Person(string name, int age) không hữu ích.

Tùy chọn thứ hai là triển khai loại bất biến. Ví dụ:

public class Person 
{ 
    public string Name { get; private set; } 
    public int Age { get; private set; } 

    public Person(string name, int age) 
    { 
     Name = name; 
     Age = age; 
    } 
    //Other properties, methods, events... 
} 

Bây giờ bạn có một constructor mà bộ nhà nước đối với các trường hợp, lần, vào thời điểm sáng tạo. Lưu ý rằng bây giờ setters cho các thuộc tính là private, vì vậy bạn không thể thay đổi trạng thái sau khi đối tượng của bạn được khởi tạo.

Cách tốt nhất là định nghĩa các lớp là không thay đổi mỗi lần nếu có thể. Để hiểu được ưu điểm của các lớp không thay đổi, tôi đề nghị bạn đọc số này article.

+1

Lớp không thể thay đổi của bạn có lẽ nên có các công cụ giải quyết công khai và cá nhân. – Servy

+0

@Servy right! Tôi đã cập nhật câu trả lời của mình – davioooh

+0

Kể từ C# 6, bạn cũng có thể thả hoàn toàn bộ cài đặt để tạo thuộc tính chỉ đọc. Điều này thực sự sẽ đảm bảo rằng bạn không vô tình sửa đổi các thuộc tính bên ngoài một hàm tạo. – Kyle

6

Không thực sự là cách tốt nhất. Cả hai đều giống nhau, trừ khi bạn muốn thực hiện một số xử lý bổ sung bằng cách sử dụng các tham số được truyền cho hàm dựng trong khi khởi tạo hoặc nếu bạn muốn đảm bảo trạng thái mạch lạc ngay sau khi gọi hàm tạo. Nếu đúng như vậy, hãy chọn cái đầu tiên.

Nhưng vì lý do dễ đọc/bảo trì, tránh tạo các hàm tạo với quá nhiều tham số.

Trong trường hợp này, cả hai sẽ thực hiện.

+1

Dễ dàng hơn để kiểm tra các lớp học nếu họ không yêu cầu tham số trong các nhà xây dựng của họ. – timmy

9

Thực sự phụ thuộc vào yêu cầu của bạn, mặc dù gần đây tôi đã thấy một xu hướng cho các lớp học với ít nhất một hàm tạo trần được xác định.

Ưu điểm của việc đăng các tham số của bạn vào thông qua hàm tạo là bạn biết các giá trị đó có thể dựa vào sau khi khởi tạo. Nhược điểm là bạn sẽ cần phải đặt nhiều công việc hơn với bất kỳ thư viện nào có thể tạo ra các đối tượng với một hàm tạo trần.

Sở thích cá nhân của tôi là đi với một nhà xây dựng trần và đặt bất kỳ thuộc tính nào là một phần của tuyên bố.

Person p=new Person() 
{ 
    Name = "Han Solo", 
    Age = 39 
}; 

Điều này giải quyết vấn đề "lớp thiếu kiến ​​trúc", cộng với việc giảm bảo trì (tôi có thể đặt nhiều thứ hơn mà không thay đổi hàm tạo).

+0

Có thể sử dụng một hàm tạo như cái ở trên, nhưng vẫn làm điều gì đó với các giá trị sau khi chúng được khai báo? Hiện tại tôi đang sử dụng kiểu constructor đó ở mọi nơi trong chương trình của mình, nhưng bây giờ tôi cần thêm logic constructor bổ sung (sử dụng một trong các tham số) - giám sát chính. – Sinjai

4

Nếu bạn nghĩ rằng mã ít hơn có nghĩa là hiệu quả hơn, do đó, việc sử dụng hàm xây dựng sẽ tốt hơn. Bạn cũng có thể sử dụng mã như:

Person p=new Person(){ 
Name='abc', 
Age=15 
} 
6

Trong thiển ý của tôi, đây là chỉ là vấn đề quyết định nếu các đối số là không bắt buộc hay không. Nếu một đối tượng Person không nên (logic) tồn tại mà không có Name và Age, chúng phải là bắt buộc trong hàm tạo. Nếu chúng là tùy chọn, (tức là sự vắng mặt của chúng không phải là mối đe dọa đối với hoạt động tốt của đối tượng), hãy sử dụng các bộ định vị.

Dưới đây là một trích dẫn từ tài liệu Symfony về constructor tiêm:

Có rất nhiều lợi thế để sử dụng constructor tiêm:

  • Nếu phụ thuộc là một yêu cầu và lớp không thể làm việc mà không cần thì nó tiêm nó thông qua constructor đảm bảo nó có mặt khi lớp được sử dụng như là lớp không thể được xây dựng mà không có nó.
  • Hàm khởi tạo chỉ được gọi một lần khi đối tượng được tạo, vì vậy bạn có thể chắc chắn rằng sự phụ thuộc sẽ không thay đổi trong suốt thời gian tồn tại của đối tượng.

Những lợi thế này có nghĩa là việc xây dựng tiêm không thích hợp để làm việc với các phụ thuộc tùy chọn. Nó cũng khó sử dụng hơn khi kết hợp với các hệ thống phân cấp lớp: nếu một lớp sử dụng phép xây dựng thì mở rộng nó và ghi đè hàm khởi tạo sẽ trở thành vấn đề.

(Symfony là một trong những khuôn khổ php phổ biến nhất và tôn trọng)

0

Hoặc bạn có thể sử dụng tệp dữ liệu để đặt nhiều đối tượng người vào danh sách hoặc mảng. Bạn cần phải sử dụng System.IO cho việc này. Và bạn cần một tệp dữ liệu chứa tất cả thông tin về các đối tượng.

Một phương pháp cho nó sẽ giống như thế này:

static void ReadFile() 
{ 
    using(StreamWriter writer = new StreamWriter(@"Data.csv")) 
    { 
     string line = null; 
     line = reader.ReadLine(); 
     while(null!= (line = reader.ReadLine()) 
       { 
        string[] values = line.Split(','); 
        string name = values[0]; 
        int age = int.Parse(values[1]); 
       } 
     Person person = new Person(name, age); 
    } 
} 
0

Phụ thuộc vào requirment của bạn, nhưng cách hiệu quả nhất để tạo là:

Product obj = new Product 
      { 
       ID = 21, 
       Price = 200, 
       Category = "XY", 
       Name = "SKR", 
      }; 
Các vấn đề liên quan