2009-08-26 32 views
12

Một vài ngày trước tôi cần để chuyển đổi một bool, và tôi đã kết thúc làm như vậy:Sửa đổi ValueType từ phương thức mở rộng?

IsVisible = !IsVisible; 

tôi thấy rằng là cách đơn giản nhất để lưu trữ functionaily đó. Nhưng trước khi làm như ví dụ trên, tôi đã thử một số cách khác nhau.

Chủ yếu là về cách sử dụng một phương pháp mở rộng. Điều nào trong ý kiến ​​của tôi sẽ làm cho nó thậm chí đơn giản hơn, hoặc ít nhất là ít ký tự hơn để viết.

IsVisible.toggle(); 

Nhưng như một boolean là một loại giá trị, bool được gửi đến phương thức mở rộng là bản sao của bool gốc chứ không phải là loại tham chiếu.

public static void Toggle(this boolean value) 
{ 
value = !value; 
} 

Trong đó sẽ làm những gì tôi cần, nhưng như boolean bị toggled là một bản sao của boolean gốc isnt thay đổi áp dụng với bản gốc ..

tôi đã cố gắng đặt trước mặt từ khóa ref của "boolean ", nhưng điều đó không biên dịch. Và tôi vẫn chưa tìm được lý do cho việc không biên dịch, đó không phải là chức năng hoàn hảo cho các phương pháp mở rộng?

public static void Toggle(this ref boolean value) 

Tôi thậm chí đã thử boolean vào một đối tượng, mà trong đầu của tôi sẽ biến nó thành một loại tham chiếu, và sau đó nó sẽ không còn là một bản sao và thay đổi sẽ được trả lại. Điều đó không có tác dụng.

Vì vậy, câu hỏi của tôi là nếu nó có thể làm cho một phần mở rộng vượt qua thay đổi trở lại, hoặc một cách khác để làm cho nó thậm chí còn đơn giản hơn nó đã?

Tôi biết điều đó hoàn toàn có thể sẽ không nhận được bất kỳ đơn giản hơn hoặc logic hơn ví dụ hàng đầu, nhưng bạn không bao giờ biết :)

Cảm ơn trước.

+1

Làm cho đơn giản nhất có thể, nhưng không đơn giản hơn. -Einstein –

+0

btw, phương pháp mở rộng phải tĩnh. Tôi đoán họ đang ở trong bạn mã, bạn chỉ quên để làm cho họ tĩnh ở đây – abatishchev

+0

Vâng sai lầm của tôi :) – Moulde

Trả lời

10

Loại nguyên thủy là không thay đổi. Bạn sẽ phải viết mã gọi điện thoại như sau:

IsVisible = IsVisible.Toggle(); 

Đó là cách tốt nhất bạn có thể làm với các phương pháp mở rộng. Không có cách nào xung quanh nó.

+0

có thể IsVisible = Boolean.Toggle()? – abatishchev

+2

Không - làm thế nào sẽ "Boolean" như một loại biết về trạng thái chứa "IsVisible" dụ? Biểu thức bên phải _must_ bao gồm biến ở đâu đó. –

+1

cấu trúc là các loại giá trị nhưng tiếc là chúng không thay đổi theo mặc định. –

1

như một sang một bên: sẽ không phải là một phương pháp mở rộng là một chi phí đáng kinh ngạc cho một cái gì đó đơn giản như toggling một bool?

+0

Có thể. Nó không đóng gói một sự kết hợp của các bước, nó dẫn bạn tránh sử dụng một toán tử tích hợp. Tôi cố gắng để gắn bó với mã idiomatically hợp lý và làm hết sức mình để tránh viết DSL (cho đến khi nó có ý nghĩa). – 48klocs

+0

Đó là một ví dụ khủng khiếp và mẫu mã thực tế là mã khiến tôi tò mò. Yeah, không có lý do gì cả. – Moulde

1

Trong vb.net, các phương pháp mở rộng có thể được khai báo để chấp nhận hàm "this" ngụ ý như một tham số ByRef (tương đương với ref trong C#). Các phương thức như vậy sẽ hoạt động như mong đợi, nhưng với thực tế không may gọi một phương thức mở rộng như một vị trí lưu trữ có thể thay đổi (ví dụ trên một giá trị thuộc tính, vị trí lưu trữ chỉ đọc, vv) sẽ khiến trình biên dịch âm thầm tham chiếu đến một bản sao của tham số, thay vì phát hành một lỗi biên dịch [hành vi ngớ ngẩn, cho rằng 90% thời gian toàn bộ điểm sử dụng thông số ref sẽ có thể sửa đổi nó tại trang cuộc gọi]. Thật không may, trong khi C# nói chung có khả năng sử dụng các phương thức mở rộng được viết bằng vb, nó sẽ không cho phép các thông số ref chuyển qua mà không có từ khóa ref và nó không cung cấp cách hợp pháp để chỉ định ref trừ khi sử dụng cú pháp gọi hàm tĩnh.

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