Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;新";c中属性声明中的关键字#_C#_.net_Asp.net - Fatal编程技术网

C# &引用;新";c中属性声明中的关键字#

C# &引用;新";c中属性声明中的关键字#,c#,.net,asp.net,C#,.net,Asp.net,我有一个.NET项目要维护。我只是浏览了一下代码,在一个属性声明中注意到: public new string navUrl { get { return ...; } set { ... } } 我想知道new修饰符对属性做了什么?它隐藏了基类的navUrl属性。看见如该MSDN条目中所述,您可以使用完全限定的名称访问“隐藏”属性:BaseClass.navUrl。滥用任何一种都可能导致巨大的混乱和可能的精神错乱(即代码损坏)。new正在隐藏该属性

我有一个.NET项目要维护。我只是浏览了一下代码,在一个属性声明中注意到:

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

我想知道
new
修饰符对属性做了什么?

它隐藏了基类的navUrl属性。看见如该MSDN条目中所述,您可以使用完全限定的名称访问“隐藏”属性:
BaseClass.navUrl
。滥用任何一种都可能导致巨大的混乱和可能的精神错乱(即代码损坏)。

new
正在隐藏该属性

在您的代码中可能是这样的:

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

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

这里在派生类中,
navUrl
属性隐藏基类属性。

有时称为
阴影
;调用的方法取决于调用点处引用的类型。帮助。

这也有文档记录

来自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.


看看这里的第一个例子,它很好地说明了如何使用
new
关键字来屏蔽基类变量

您的代码片段很好地阐明了隐藏概念,但是
new
修饰符不会导致这种行为,它只告诉编译器你是故意这样做的,所以不会显示警告消息。那么是什么导致了这种行为呢?通常.WorkProperty会调用派生类的属性,因为A引用派生对象,而不管引用类型如何。
new
修饰符不会导致此行为,它只会告诉编译器你是故意这么做的,所以不会显示警告消息。如果我使用相同名称但不同类型的关键字
new
,会有问题吗?