2009-07-13 16 views
6

Tôi đang sử dụng VS 2008 và trong các trang thuộc tính của tôi cho dự án tôi thấy rằng tôi đang nhắm mục tiêu .Net 3.5.Thuộc tính tự động trong C# 3 - Phải khai báo một phần thân để nhận được nếu tôi khai báo một bộ để đặt?

Đây là lỗi tôi nhận được khi cố gắng biên dịch:

AMSDataModels.Vehicle.VIN.get' phải khai báo một cơ thể bởi vì nó không được đánh dấu trừu tượng, extern, hoặc một phần

Và đây là đoạn code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace AMSDataModels 
{ 
    public class Vehicle 
    { 
     //NodeID for datastore persistance 
     public Guid NodeID { get; set; } 

     public string VIN { get; 
      set { 
       if (value.Length != 17) throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
      } } 

     public string Make { get; set; } 
     public string Model { get; set; } 
    } 
} 

Nếu tôi dải cơ thể từ bộ để nó chỉ:

public string VIN { get; set; } 

Mọi công việc, nhưng tôi mất khả năng kiểm tra số VIN khi được đặt.

Có ai có đề xuất cách khắc phục sự cố này hay cách tốt hơn để tiếp cận vấn đề trong tầm tay?

Tôi thực sự thích ký pháp viết tắt - nhưng việc xác minh tính hợp pháp của đầu vào cũng quan trọng!

+0

Nhờ tất cả mọi người đã lưu ý rằng tôi đã không thực sự thiết lập giá trị ở bất cứ nơi nào - thành thật mà nói tôi chưa tìm ra biến cục bộ mà trình biên dịch tạo ra được gọi. Có một từ khóa đặc biệt không? – Matt

+1

Không có từ khóa đặc biệt - không có cách nào để truy cập vào công cụ được tạo tự động bởi trình biên dịch. Mà làm cho kể từ gây ra sức mạnh của mã được tạo ra là trong nó đơn giản và khả năng của trình biên dịch để biết chính xác làm thế nào nó được truy cập. Nếu bạn có thể xác định hoặc truy cập vào trường tự động, trình biên dịch không thể đưa ra gần như nhiều giả định về việc sử dụng nó. –

+0

Bạn sẽ gặp phải vấn đề tương tự khi bạn cố gắng sử dụng INotifyPropertyChanged, vẻ đẹp của các thuộc tính tự động sẽ nhanh chóng bị mất: ( – Nate

Trả lời

17

Nếu bạn định thêm logic vào bộ này, bạn cũng cần phải thêm nó vào trong quá trình tải. Thông báo trong bộ của bạn, bạn không thực sự thiết lập một giá trị cho bất cứ điều gì?

Thêm một lĩnh vực sao lưu,

private string _vin; 

và gửi lại rằng trong get.

public string VIN 
{ 
    get { return _vin; } 
    set 
    { 
     if (value.Length != 17) 
     throw new ArgumentOutOfRangeException("VIN", "VIN must be 17 characters"); 
     else 
     _vin = value; 
    } 
} 
+0

Cảm ơn, tôi đoán ưu tiên hàng đầu của tôi là đảm bảo rằng tôi không làm công việc không cần thiết. bằng cách nào đó cố gắng sử dụng các thuộc tính tự động sai. – Matt

+0

Thực ra bạn không cần phải tạo một trường chỉ trả lại VIN :) –

+5

"return VIN"? Đó sẽ là một hàm đệ quy trừ khi tôi thiếu một cái gì đó hiển nhiên ... –

3

Có, bạn cũng sẽ phải khai báo việc triển khai. Oh, và mã số của bạn không làm bất cứ điều gì khác hơn là xác nhận. Bạn cũng sẽ cần phải cung cấp thêm thực hiện cho điều đó, giả sử rằng bạn muốn đặt giá trị nếu nó vượt qua xác thực.

Nếu bạn cần bất cứ điều gì nhiều hơn là chỉ thực hiện get/set cơ bản, bạn sẽ phải triển khai toàn bộ thuộc tính chứ không chỉ là sự khác biệt.

6

Khi thuộc tính tự động được sử dụng, trình biên dịch sẽ tự động tạo trường hậu trường. Khi bạn khai báo của riêng bạn, không có cách nào để nó biết lĩnh vực nào để sử dụng cho phương thức get. Vì vậy, bạn phải khai báo cả hai hoặc không.

Ngẫu nhiên, phương thức thiết lập hiện tại của bạn chỉ kiểm tra giá trị - nó không bao giờ thực sự gán nó cho bất kỳ thứ gì.

+0

Quay lại IDE tôi đoán - cảm ơn. – Matt

2

Bạn sẽ phải sử dụng trường sao lưu tốt của ol. Ký hiệu ngắn tay không thể lẫn lộn. Điều thú vị duy nhất là thay đổi công cụ sửa đổi truy cập khi nhận và đặt, ví dụ: được; bộ tư nhân;

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