2017-09-06 14 views
6

tôi thấy đoạn mã sau trong lớp DbSet của EntityFramework:lý do để ẩn một phương thức với từ khóa mới là gì khi chỉ trả về base.method?

public new Type GetType() 
{ 
    return base.GetType(); 
} 

Tôi không có ý tưởng tại sao các phương pháp cơ bản được ẩn, tất cả các lớp cơ sở có phương pháp thực hiện kêu gọi cơ sở.

Đây là object.GetType():

[SecuritySafeCritical] 
[__DynamicallyInvokable] 
[MethodImpl(MethodImplOptions.InternalCall)] 
public extern Type GetType(); 

này nằm trong lớp DbQuery:

/// <inheritdoc /> 
[EditorBrowsable(EditorBrowsableState.Never)] 
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] 
public new Type GetType() 
{ 
    return base.GetType(); 
} 

Và đây là trong DbSet (DbSet<TEntity> : DbQuery<TEntity>) lớp:

/// <inheritdoc /> 
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] 
[EditorBrowsable(EditorBrowsableState.Never)] 
public new Type GetType() 
{ 
    return base.GetType(); 
} 

Tại sao hoặc khi bạn có sử dụng sốkhông 10 từ khóa và sau đó gọi triển khai cơ sở?

+4

Mục đích duy nhất tôi thấy là ẩn nó khỏi thuộc tính Intellisense (thuộc tính 'EditorBrowsable'). Tôi không có ý tưởng tại sao nó cần thiết mặc dù. –

+0

@IvanStoev Tôi cũng nghĩ về điều đó, nhưng tại sao nó lại ở cả lớp 'DbQuery' và' DbSet'? – Mafii

+1

Câu hỏi hay :) Dự phòng tất nhiên, có thể bị lãng quên trong quá trình tái cấu trúc vv. Toàn bộ nhu cầu về quá tải/ghi đè này là một bí ẩn - bạn có thể thấy một và cùng một khu vực được gọi là 'Phương pháp đối tượng ẩn 'được sao chép/dán ở nhiều nơi [source] (https://github.com/aspnet/EntityFramework6/blob/master/src/EntityFramework/Infrastructure/DbQuery.cs) không có chú thích bổ sung * tại sao * là mã đó. –

Trả lời

3

Hãy xem xét các lựa chọn thay thế.

  1. Không ghi đè hoặc bất cứ điều gì mới

    Vấn đề: Không có mã trên để áp dụng các thuộc tính.

  2. Chỉ cần ghi đè lên nó

    Vấn đề: GetType không phải là ảo.

Vì vậy, bạn đang sử dụng new với cuộc gọi tới base.

Câu hỏi thực sự là điều gì quan trọng đến mức [EditorBrowsable(EditorBrowsableState.Never)] rằng họ đã gặp phải tất cả sự cố này? Đoán duy nhất của tôi là họ cảm thấy rằng các nhà phát triển sẽ nhầm lẫn GetType với ElementType trong intellisense.

+0

Cảm ơn bạn, bây giờ nó có ý nghĩa. Tôi chỉ tò mò bây giờ về lý do tại sao họ thêm cùng một đoạn mã trong 'DbSet' một lần nữa đã có trong' DbQuery'. – Mafii

1

Tôi nghĩ một lý do bạn sẽ sử dụng từ khóa mới là khi bạn muốn thay đổi công cụ sửa đổi truy cập. Nếu phương thức của bạn được bảo vệ trong lớp cơ sở, bạn có thể đặt nó ở chế độ công khai trong lớp con của bạn bằng cách sử dụng từ khóa mới.

+0

Điều này không trả lời câu hỏi của tôi, tôi sợ. Lớp cơ sở ''GetType' cũng công khai như bạn có thể thấy trong mã tôi đã đăng. – Mafii

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