2010-09-06 55 views
54

Tôi đã được cấp một dự án .net để duy trì. Tôi chỉ duyệt qua mã và tôi nhận thấy điều này trên tuyên bố thuộc tính:Từ khóa "mới" trong khai báo thuộc tính trong C#

public new string navUrl 
{ 
    get 
    { 
    return ...; 
    } 
    set 
    { 
    ... 
    } 
} 

Tôi đã tự hỏi công cụ sửa đổi new làm gì cho tài sản?

Trả lời

47

Nó ẩn thuộc tính navUrl của lớp cơ sở. Xem new Modifier. Như đã đề cập trong mục nhập MSDN đó, bạn có thể truy cập thuộc tính "ẩn" với tên đủ điều kiện: BaseClass.navUrl. Lạm dụng hoặc có thể dẫn đến sự nhầm lẫn lớn và có thể là sự điên rồ (tức là mã bị hỏng).

+8

Lệnh 'modifier new' không gây ra điều này hành vi, nó chỉ nói với trình biên dịch bạn đã làm nó cố ý để nó sẽ không hiển thị một thông báo cảnh báo. – BornToCode

8

new đang ẩn thuộc tính.

Nó có thể là như thế này trong mã của bạn:

class base1 
{ 
    public virtual string navUrl 
    { 
     get; 
     set; 
    } 
} 

class derived : base1 
{ 
    public new string navUrl 
    { 
     get; 
     set; 
    } 
} 

đây trong lớp có nguồn gốc, các navUrl tài sản được cất giấu tài sản lớp cơ sở.

3

Một số lần được gọi là Shadowing hoặc method hiding; Phương thức được gọi phụ thuộc vào loại tham chiếu tại thời điểm thực hiện cuộc gọi. This might trợ giúp.

3

Đây cũng là tài liệu here.

Đoạn mã từ msdn.

public class BaseClass 
{ 
    public void DoWork() { } 
    public int WorkField; 
    public int WorkProperty 
    { 
     get { return 0; } 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public new void DoWork() { } 
    public new int WorkField; 
    public new int WorkProperty 
    { 
     get { return 0; } 
    } 
}  

DerivedClass B = new DerivedClass(); 
B.WorkProperty; // Calls the new property. 

BaseClass A = (BaseClass)B; 
A.WorkProperty; // Calls the old property. 
+2

Đoạn mã của bạn làm rõ khái niệm ẩn, tuy nhiên công cụ sửa đổi 'mới' không gây ra hành vi này, nó chỉ báo cho trình biên dịch bạn đã cố tình làm như vậy, nó sẽ không hiển thị thông báo cảnh báo. – BornToCode

+0

Sau đó, điều gì gây ra hành vi này? Thông thường A.WorkProperty sẽ gọi thuộc tính của lớp dẫn xuất, vì A tham chiếu một đối tượng dẫn xuất, bất kể kiểu tham chiếu. – Squirrelkiller

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