在执行重构时,我最终创建了一个类似下面示例的方法.为简单起见,数据类型已更改.
我之前有一个这样的赋值语句:
MyObject myVar = new MyObject();
Run Code Online (Sandbox Code Playgroud)
它是偶然重构的:
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
Run Code Online (Sandbox Code Playgroud)
这是我的剪切/粘贴错误的结果,但new关键字in private static new有效并编译.
问题:new关键字在方法签名中表示什么?我假设它是在C#3.0中引入的东西?
这有override什么不同?
与Java不同,为什么C#默认将方法视为非虚函数?它更可能是性能问题而不是其他可能的结果吗?
我想起了Anders Hejlsberg的段落,内容是现有架构带来的几个优点.但是,副作用呢?默认情况下使用非虚方法真的是一个很好的权衡吗?
为什么在隐藏方法时需要使用new关键字?
我有两节课:
public class Parent
{
public void Print()
{
Console.WriteLine("Parent");
}
}
public class Child : Parent
{
public void Print()
{
Console.WriteLine("Child");
}
}
Run Code Online (Sandbox Code Playgroud)
以下代码生成给定的输出:
Parent sut = new Child();
sut.Print();
Run Code Online (Sandbox Code Playgroud)
输出:父
Child sut = new Child();
sut.Print();
Run Code Online (Sandbox Code Playgroud)
输出:孩子
我明白这可能是一个问题,如果隐藏不是有意的,但有任何其他理由使用"新"(除了警告的除外)?
编辑:
可能是我不清楚.这是同样的情况:
public void foo(Parent p)
{
p.Print();
}
Run Code Online (Sandbox Code Playgroud)
这就是所谓的:
Child c = new Child;
foo (c);c
Run Code Online (Sandbox Code Playgroud) 我知道覆盖和新的区别(或者相信这样做无论如何),并且有几个问题描述了两者之间的差异,但我的问题是,是否有一个特殊的原因,为什么C#默认为新的行为(带有警告),而不是默认覆盖?
public class Base
{
virtual public string GetString() => "Hello from Base";
}
public class Child : Base
{
public string GetString() => "Hello from Child";
}
...
var childAsBase = (Base)new Child();
Console.WriteLine(childAsBase.GetString());
...
c:\>dotnet run
child.cs(5,23): warning CS0114: 'Child.GetString()' hides inherited member 'Base.GetString()'.
To make the current member override that implementation, add the override keyword.
Otherwise add the new keyword. [C:\IPutAllMyProjectsInMyRootFolder.csproj]
Hello from Base
Run Code Online (Sandbox Code Playgroud)
我可以认为,无论继承的方法是否标记为虚拟,都可以获得相同的行为,但同时,将虚拟声明为"覆盖我",因此默认覆盖对我来说似乎是合理的.
我想到的另一个原因是使用虚函数表的成本,但这似乎是一个可怕的原因,因为我作为编码器希望代码执行的操作应该比保存cpu-cycle更重要.但也许回到语言发明时,情况并非如此?
我有一个父母和一个孩子班.两者都有一个具有相同名称的方法,编译器允许它.我无法理解.如果父类具有相同名称的方法,为什么编译器未在子类中显示错误.我没有使用新的虚拟或覆盖方法.请帮助我理解为什么编译器没有在子类中显示错误?
class BaseClass
{
public string SayHi()
{
return ("Hi");
}
}
class DerivedClass : BaseClass
{
public string SayHi()
{
return (base.SayHi() + " from derived");
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个基类,它有一个属性和一个使用该属性的方法.我有一个继承该基类的类,并且有自己的基类属性实现,使用New修饰符显式隐藏.在基类的方法中,是否有一种使用继承类'属性而不是基类实现的好方法?
class Program
{
public class MyBase
{
public string MyProperty { get { return "Base"; } }
public string MyBaseMethod()
{
return MyProperty;
}
}
public class MyInherited : MyBase
{
public new string MyProperty { get { return "Inherited"; } }
}
static void Main(string[] args)
{
List<MyBase> test = new List<MyBase>();
test.Add(new MyBase());
test.Add(new MyInherited());
foreach (MyBase item in test)
{
Console.WriteLine(item.MyBaseMethod());
}
}
}
Run Code Online (Sandbox Code Playgroud)
在示例中,输出为:Base Base
目前的解决方法:
...
public class MyBase
{
public string MyProperty { …Run Code Online (Sandbox Code Playgroud)