2011-12-22 56 views
9

Khi bạn tạo một thể hiện của một lớp, tất cả các biến trong cá thể đó là cụ thể cho cá thể đó và bị giết khi cá thể đó nằm ngoài phạm vi. Nhưng nó hoạt động như thế nào trong một phương thức tĩnh? Giả sử hai người gọi System.Math.Abs ​​() tại cùng một thời điểm. Thời gian chạy phân biệt giữa hai người gọi như thế nào? Đây có phải là nơi có luồng không? Các chuỗi riêng biệt có được tạo tự động cho mỗi người gọi không?Điều gì sẽ xảy ra khi bạn gọi một phương thức tĩnh trong C#?

+1

[this] (http://stackoverflow.com/questions/680546/static-function-concurrency-asp-net) có trả lời câu hỏi của bạn không? –

+4

. ToString không phải là phương pháp tĩnh. –

+0

Emmanuel, tôi đã kiểm tra bài viết bạn đã đề cập. Nó giải quyết mối quan tâm của tôi, nhưng không trả lời nó: ( – developer747

Trả lời

10

Không có sự khác biệt thực sự giữa các phương pháp tĩnh và không tĩnh về tuổi thọ của biến phương pháp. Trong cả hai trường hợp, là chi tiết triển khai, người dân địa phương thường (không hoàn toàn luôn: có ngoại lệ) được phân bổ trên ngăn xếp. Ngăn xếp là theo chủ đề, do đó, các biến phương thức cục bộ không giao nhau giữa các luồng.

Sự khác biệt duy nhất ở đây giữa trường hợp và tĩnh là phương pháp thể hiện có tham số zeroth ẩn, còn gọi là "this", được đẩy bởi người gọi (cộng với một số công văn ảo và null-check fun).

Để đơn giản, tôi glossing hơn khối iterator, các biến bị bắt vv

+0

Cảm ơn bạn Marc! – developer747

6

Tất cả các thành viên tĩnh của một lớp tồn tại ngay cả khi không có trường hợp nào của lớp tồn tại. Chúng được khởi tạo đôi khi trước khi sử dụng lần đầu và được dọn dẹp khi chương trình hoàn tất.

Nếu bạn có hai cuộc gọi đồng thời với một phương pháp tĩnh, họ sẽ làm việc với cùng một bản sao của bất kỳ thành viên tĩnh nào của lớp (nếu họ sử dụng chúng). Vì vậy, nếu phương thức tĩnh hoạt động trên một thành viên tĩnh (hoặc tham số), nó sẽ làm như vậy trong một luồng an toàn. Nếu phương thức tĩnh chỉ hoạt động trên người dân địa phương thì chính phương thức đó thường là luồng an toàn.

Đối với cách thời gian chạy phân biệt giữa hai người gọi, đây là bản chất của luồng. Mỗi luồng có ngăn xếp cuộc gọi riêng với bản sao riêng của bất kỳ biến địa phương, tham số, địa chỉ trả về, v.v. Vì vậy, hai cuộc gọi không bị lẫn lộn và mỗi lần quay lại người gọi của họ một cách chính xác. Mối quan tâm duy nhất, một lần nữa, là nếu phương thức tĩnh hoạt động trên một thành viên tĩnh không phải là luồng an toàn (hoặc một tham số không phải là luồng an toàn).

+0

Giải thích tốt James. Cảm ơn bạn. Làm thế nào để mọi người biết những gì bạn vừa nói với tôi? Bạn có thể giới thiệu một số cuốn sách tốt, mà địa chỉ các nguyên tắc cơ bản như thế này? – developer747

+0

Hầu hết điều này tôi đã học được từ BS của tôi trong CompSci học về lý thuyết ngôn ngữ lập trình và từ tự học ngôn ngữ lập trình.Nếu bạn thực sự muốn nhận được vào các chi tiết, đọc C# Ngôn ngữ đặc điểm kỹ thuật, nó sẽ cho bạn biết khá nhiều tất cả mọi thứ có biết về thực hiện: http: //msdn.microsoft.com/en-us/library/ms228593.aspx –

+0

Nếu bạn phải giới thiệu một trong những cuốn sách từ đại học của bạn (đề cập đến các nguyên tắc cơ bản như thế này) thì đó sẽ là gì? – developer747

12

Khi bạn tạo một thể hiện của một lớp học, tất cả các biến cụ thể để dụ được thiệt mạng khi các trường hợp nằm ngoài phạm vi.

Các biến - thường được gọi là "lĩnh vực" được deallocated sau các đời của instance. Phạm vi là vùng văn bản chương trình trong đó trình biên dịch nhận ra một cái gì đó theo tên của nó; liftime là phần thời gian trong thời gian đó vị trí lưu trữ hợp lệ. Phạm vi và tuổi thọ thường bị nhầm lẫn.

Nhưng cách hoạt động trong phương pháp tĩnh?

Trường tĩnh có thời gian tồn tại không bị chặn; vị trí lưu trữ được tạo ra tại một thời điểm trước khi trường được truy cập và không bị hủy cho đến khi tên miền ứng dụng bị rách.

Giả sử hai người gọi System.Math.Abs ​​() tại cùng một thời điểm.

OK. Bạn đề xuất điều đó như thế nào?

Thời gian chạy phân biệt giữa hai người gọi như thế nào? Đây có phải là nơi có luồng không?

Phương pháp tĩnh được đưa vào một loạt các lệnh máy là số trong bộ nhớ. Mỗi chuỗi thực thi có một số được liên kết với nó được gọi là con trỏ chỉ dẫn , nằm ở hướng dẫn hiện tại. Hai luồng khác nhau có thể có cả con trỏ hướng dẫn bên trong cùng một phương thức tĩnh cùng một lúc.

Các chuỗi riêng biệt có được tạo tự động cho mỗi người gọi không?

Câu hỏi không có ý nghĩa gì cả. Làm cách nào bạn nhận được hai người gọi cùng một lúc nếu họ chưa có chủ đề riêng?

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