2009-04-28 32 views
6

Tôi thường có các phương thức được gọi thường xuyên và có một số trạng thái phải được giữ giữa các cuộc gọi, như:C#: Giới hạn phạm vi của trường chung cho phương thức/thuộc tính HOẶC giữ nguyên giá trị của biến cục bộ/thuộc tính giữa các cuộc gọi

float lastTime = 0.0f; 
void Draw(float currentTime) 
{ 
    if(currentTime - lastTime > 0.5f) 
    { 
     // not enough FPS 
    } 
    lastTime = currentTime; 
} 

Và nó khiến tôi cảm thấy rằng trường "trạng thái" toàn cầu (ở đây "lastTime") hiển thị trong toàn bộ lớp trong khi chỉ cần trong phương thức này. Có cách nào để giới hạn phạm vi hiển thị của trường toàn cầu này chỉ với phương pháp hoặc để làm cho nó địa phương, nhưng giữ giá trị của nó giữa các cuộc gọi? Câu hỏi tương tự cũng áp dụng cho các trường được sử dụng bởi Thuộc tính (có một số logic và không thể tự động).

Cảm ơn trước vì bất kỳ đề xuất nào ...

Trả lời

0

Không, xin lỗi. C# không cho phép các statics mức chức năng như C. Tôi khuyên bạn nên cho nó một tên "icky", như Draw_Data_lastTime hoặc một cái gì đó. Điều đó ít nhất truyền tải thông tin về nơi nó nên được sử dụng.

1

Trong C#, no. Đây là những biến số static trong VB.NET (và tôi tin C, mặc dù tôi không phải là chuyên gia). Tôi khá chắc chắn, mặc dù, rằng static biến trong VB.NET chỉ được biên dịch để IL với autogenerated tên như trường dụ.

Chỉ cần gắn vào các trường mẫu được đặt tên thích hợp (như lastDrawTime cho ví dụ của bạn).

0

Không, phạm vi hạn chế nhất là "riêng tư" cho phép truy cập từ cùng một loại.

6

Cách duy nhất để làm cho nó riêng tư chỉ trong một phần của lớp sẽ là để làm cho nó một đối tượng riêng biệt quản lý tài sản này, nội bộ trong lớp.

Tuy nhiên, tôi khuyên bạn nên xem xét lại vấn đề này một chút. Ý tưởng của việc bảo mật nó để giữ một thành viên riêng tư với chính lớp đó - nếu bạn lo lắng về lớp của bạn đang xem dữ liệu riêng của mình, đó là thời gian để cấu trúc lại thành các lớp nhỏ hơn, mỗi lớp có chức năng riêng của chúng.

Điều này có "mùi" của một lớp học quá lớn.

+0

Hoàn toàn đồng ý; vừa trả lời cùng một cách! :-) –

0

Tôi sợ rằng yêu cầu của bạn là không thể.

Tôi nghĩ tùy chọn duy nhất khác của bạn là chuyển trạng thái hiện tại làm tham số trong phương thức nhưng điều đó có nghĩa là đối tượng gọi sẽ chịu trách nhiệm quản lý trạng thái.

Tôi cũng nghĩ rằng bạn có thể refactor mã của bạn vì nếu phần còn lại của lớp bạn không cần biết về biến này, có thể phần này có thể ở một nơi khác.

0

Không, không có cách nào; nhưng câu hỏi của bạn đặt ra một số vấn đề thú vị. Nếu bạn đang lo ngại về biến thành viên của bạn để theo dõi điều này có thể nhìn thấy trong toàn bộ lớp, điều này làm tăng cờ có lẽ phạm vi của lớp đã phát triển quá lớn và lớp cần phải được cấu trúc lại thành nhiều lớp nhỏ hơn.

Nói chung, nếu bạn bắt đầu lo lắng về việc phân biệt các thành viên trong lớp học của bạn, bạn có thể có một tình huống yêu cầu tái cấu trúc thành các lớp nhỏ hơn. Sau đó, một lần nữa, bạn có thể không (tình huống khác nhau), nhưng ít nhất, nó có thể đáng xem xét.

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