2010-03-24 39 views
5

Tôi có hai đối tượng mà tôi sẽ chủ yếu sử dụng bên trong lớp đơn. Tôi sẽ khởi tạo chúng ngay từ đầu và sử dụng chúng trong suốt cuộc đời của chương trình. Bây giờ, câu hỏi của tôi là nếu tôi chỉ tạo chúng dưới dạng biến toàn cầu và truy cập chúng ở bất kỳ đâu trong mã (ở bên cạnh lớp đơn) hoặc tôi nên tạo chúng dưới dạng biến cục bộ và chuyển chúng làm tham số cho các hàm khác. Tôi chỉ muốn xem thực hành lập trình tốt nhất là gì.Truy cập toàn cầu so với biến cục bộ

Tôi đang sử dụng C#.

Cảm ơn.

Trả lời

5

Nói chung, bạn nên tránh các biến toàn cầu. Nếu nó sẽ được thực tế, tôi khuyên bạn nên giữ chúng như người dân địa phương và đi qua chúng như là các tham số cho các chức năng của bạn.

Như Josh chỉ ra, nếu các biến này là chỉ sử dụng bên trong một trường hợp duy nhất của lớp, sau đó bạn chỉ cần làm cho họ thành viên tư nhân (hoặc bảo vệ) của lớp đó và được thực hiện với nó. Tất nhiên, sau đó họ chỉ có thể được thông qua như các tham số cho các phương thức khác với cùng một mức truy cập (IE, riêng tư).

Hoặc, bạn có thể xem xét sử dụng Singleton Design Pattern, hơi sạch hơn (và thích hợp hơn) để sử dụng hình cầu.

+0

Tôi hiểu rằng bạn nên tránh sử dụng hình cầu, và tôi sử dụng Singleton mọi lúc, nhưng làm thế nào để tạo ra một biến toàn cầu trong .NET? – Merritt

+0

Bạn có thể định nghĩa một biến 'Public Static' chuỗi/int/float/etc, có hiệu quả toàn cầu. Nhưng đồng ý, có thực sự không phải là một khái niệm "toàn cầu" trong C# so với các ngôn ngữ khác như C. Có lẽ tôi nên có được rõ ràng hơn về điều đó trong câu trả lời của tôi. –

+0

.Net không hỗ trợ các biến toàn cầu và thậm chí cả các phương thức toàn cầu. Nhưng cú pháp cho C# không (điều này có lẽ là một điều tốt.) –

2

Nếu phạm vi của đối tượng là tuổi thọ của lớp mà chúng được khởi tạo, thì chúng phải là biến thành viên riêng tư.

Nếu họ không duy trì trạng thái của chính mình, thì bạn nên tạo các lớp tĩnh.

Bạn nên vẫn còn chuyển chúng xung quanh dưới dạng biến hoặc ít nhất tạo người truy cập thuộc tính để lấy trường sao lưu. Bằng cách này, bạn có thể thay đổi chi tiết triển khai mà không cần phải thổi mã của mình.

SOLID design principles là một nơi tốt để bắt đầu khi nghĩ về những điều này.

0

Nếu các đối tượng sẽ giống nhau cho tất cả các thể hiện của lớp sau đó

static const double PI = 3.14158; 
0

Thông thường bạn nên sử dụng phương pháp accessor (ví dụ getter và setter) và giữ các biến nội bộ của bạn riêng tư. Bằng cách này phần còn lại của mã của bạn, bên ngoài lớp học của bạn, không phụ thuộc vào các biến thực tế của bạn.

Xem hướng dẫn this.

0

Nếu lớp học của bạn phụ thuộc vào 2 đối tượng này thì có lẽ họ phải là thành viên trên chính lớp đó. Một cái gì đó như thế này (trong đó A là lớp bạn đang nói về và B là một trong những đối tượng mà bạn khởi tạo:

public class A 
{ 
    private B _b; 

    public A(B b) 
    { 
     _b = b; 
    } 

    public void DoSomething() 
    { 
     //do something with _b; 
    } 

    private void DoSomethingElse() 
    { 
     //do something else with _b; 
    } 
} 

Trong ví dụ này A là phụ thuộc vào B (để bạn vượt qua bạn thể hiện của B vào constructor của một hoặc thông qua một số phụ thuộc khuôn khổ Injection). nó sẽ không làm cho rất nhiều ý nghĩa đối với mọi phương pháp trên lớp A cần một tham số có kiểu B được truyền cho nó.

2

tôi có hai đối tượng mà tôi sẽ chủ yếu sử dụng bên trong lớp đơn.Tôi sẽ khởi tạo chúng ngay từ đầu và sử dụng chúng trong suốt cuộc đời chương trình.

Điều này nghe có vẻ như là thời điểm hoàn hảo để sử dụng biến số private static readonly. Chúng có thể được khởi tạo trong khai báo của chúng, hoặc bạn có thể tạo một hàm tạo tĩnh để khởi tạo chúng.

Thực tế là bạn chỉ tham chiếu các đối tượng này trong một lớp duy nhất là điểm quan trọng. Có những cách tốt hơn để làm việc nếu các vật thể này cần thiết ngoài lớp đơn.

0

Tôi nghĩ trong trường hợp này, bạn nên hỏi điều gì có ý nghĩa hơn. Có mối quan hệ nào đó giữa 2 đối tượng và lớp mới không. Ngoài ra, mức độ thường xuyên được sử dụng trong lớp học. Thông thường, nếu chỉ có một vài phương thức sử dụng các đối tượng, chuyển chúng theo cách khác, khởi tạo chúng dưới dạng biến cấp lớp (có thể sử dụng chỉ đọc tĩnh riêng như Jefferey gợi ý) và sử dụng chúng trong lớp. Làm cho mã dễ đọc hơn nên là mục tiêu của bạn ở đây.

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