2009-07-08 44 views
5

Không khởi tạo đối tượng bên ngoài đóng gói ngắt của hàm tạo?Tùy chọn khởi tạo đối tượng C#

Given:

class MyClass 
{ 
    public string _aString; 
} 

nên không phải là thành viên _aString là riêng tư và khởi tạo thông qua một cuộc gọi đến các nhà xây dựng (constructor bỏ qua ở đây):

MyClass test = new MyClass("test"); 

Thay vì các phương pháp thay thế khởi tạo đối tượng :

MyClass test = new MyClass { _aString = "Test" }; 
+0

Wow! 5 câu trả lời trong thời gian không! Cảm ơn mọi người. Mã này xuất phát từ một cuốn sách trên C#. Tôi tò mò muốn xem đó có phải là phương pháp hay nhất hay không. –

Trả lời

6

"Không khởi tạo đối tượng bên ngoài đóng gói phá vỡ hàm tạo?"

Vâng, không. Khi bạn đã chỉ ra đúng, bạn chỉ có thể khởi tạo các thuộc tính đã có sẵn trong phạm vi hiện tại của bạn. (công cộng, nội bộ, vv)

Loại Intialization này thực sự chỉ là một số cú pháp đường xung quanh việc xây dựng một lớp và gán giá trị cho thuộc tính, Nó rất hữu ích cho các lớp ẩn danh và mệnh đề chọn LINQ.

5

Thường được coi là hành vi không tốt để hiển thị công khai các trường ... có thể chấp nhận được trong một số trường hợp, ví dụ nếu trường được đánh dấu là readonly (có nghĩa là nó phải được đặt trong hàm tạo). Thay vào đó, bạn nên đặt trường này ở chế độ riêng tư và hiển thị trường thông qua thuộc tính, có thể hoặc không thể đọc được, tùy thuộc vào mục đích của nó:

class MyClass 
{ 
    private string _aString; 
    public string AString 
    { 
     get { return _aString; } 
     // uncomment to make the property writable 
     //set { _aString = value; } 
    } 
} 
0

Tùy thuộc vào mục đích của biến. Nếu lập trình viên chỉ có thể đặt biến lúc khởi tạo, nhưng sau đó không có quyền truy cập vào nó sau đó, sau đó tôi sẽ đi với biến riêng. Nếu bạn muốn người dùng lớp có thể đặt/đọc biến bất kỳ lúc nào, hãy đặt biến đó thành công khai.

0

Khi bạn có
public string _aString;
nó thực sự không quan trọng khi bạn khởi tạo giá trị này vì đây đã được tiếp xúc. Vì vậy, khi chúng ta muốn nói về khởi tạo, chúng ta nên di chuyển chuỗi này vào thuộc tính. Hơn talkin về encapsutlation có ý nghĩa.
Vì vậy, hãy tưởng tượng chúng tôi có một số chuỗi. Có hai cách tiếp cận của mosly là initializatnion. Một là để làm điều đó bên trong constructor, thứ hai là khởi tạo lười biếng (khởi tạo khi một số yêu cầu dữ liệu này).

0

có, khởi tạo thông qua hàm tạo và thêm thuộc tính để cho phép (hoặc không) truy cập vào dữ liệu.

class MyClass { 
private string _aString; 
string MyProperty { 
        get { return this._aString; } 
        // you can make this private or protected 
        set { this._aString = value; } 

        } 
} 
1

Nếu bạn coi Thuộc tính là getters và setters, tôi không tin rằng nó sẽ phá vỡ đóng gói. Nhưng bạn nên lưu ý rằng bạn không sử dụng thuộc tính, bạn đã sử dụng một biến cá thể. Trong thực tế, tôi không tin rằng nó sẽ làm việc giống như ví dụ của bạn. Kiểm tra điều này:

class MyClass { 
    private string aString; 

    public string AString { 
     get { return aString; } 
     set {aString = value; } 
    } 
} 
MyClass test = new MyClass { 
    AString = "test" 
}; 

Trong trường hợp này, bạn đang truy cập trường riêng thông qua người truy cập của nó. Nó giống như sử dụng một hàm tạo parameterless và thiết lập giá trị sau này.

+1

Đặt trường công khai trực tiếp là a-ok trong bộ khởi tạo đối tượng (từ quan điểm ngữ nghĩa ngôn ngữ, không thiết kế phù hợp). –

+0

Điều đó tôi không biết! Cảm ơn! = D – Fernando

0

Nếu bạn hỏi liệu ký hiệu khởi tạo đối tượng mới có bị đóng gói hay không, thì câu trả lời là không. Bạn chỉ có thể đặt thành viên phạm vi công khai với phương pháp mới.

MyClass test = new MyClass { _aString = "Test" }; 

cũng giống như

MyClass test = new MyClass(); 
test._aString = "Test"; 
0

Để hiển thị một đối tượng nào trong một lớp C# không phá vỡ "đóng gói" từ một điểm nhìn của "lập trình hướng đối tượng".

Từ quan điểm "thực hành tốt", đây không phải là điều tốt, sử dụng Thuộc tính vì nó cho phép mã bên ngoài sử dụng lớp này nếu bạn thay đổi hành vi cập nhật giá trị này (kiểm tra, ...).

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