相关疑难解决方法(0)

方法签名中的新关键字

在执行重构时,我最终创建了一个类似下面示例的方法.为简单起见,数据类型已更改.

我之前有一个这样的赋值语句:

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什么不同?

c# methods keyword

112
推荐指数
5
解决办法
8万
查看次数

为什么C#默认将方法实现为非虚方法?

与Java不同,为什么C#默认将方法视为非虚函数?它更可能是性能问题而不是其他可能的结果吗?

我想起了Anders Hejlsberg的段落,内容是现有架构带来的几个优点.但是,副作用呢?默认情况下使用非虚方法真的是一个很好的权衡吗?

.net c# java virtual-functions

105
推荐指数
6
解决办法
1万
查看次数

为什么在隐藏方法时使用"new"?

为什么在隐藏方法时需要使用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)

.net c#

9
推荐指数
2
解决办法
474
查看次数

C#中的"new"关键字只是为了使警告消失,不是吗?

我偶然在方法签名中遇到了这个新的关键字,我发现这篇文章中给出的一些例子不准确(例如第二篇)

如果你不说"覆盖",我认为"新"已经存在.唯一的区别是,如果你不写"覆盖"(对于虚方法)或"新",你会得到一条绿线(warrning?).你仍然可以选择不写"新",它仍然可以工作.我说得对,或者我错过了重要的事情吗?

c#

9
推荐指数
1
解决办法
337
查看次数

继承基类时,有没有理由为什么C#默认为new而不是覆盖?

我知道覆盖和新的区别(或者相信这样做无论如何),并且有几个问题描述了两者之间的差异,但我的问题是,是否有一个特殊的原因,为什么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更重要.但也许回到语言发明时,情况并非如此?

c# inheritance

3
推荐指数
1
解决办法
316
查看次数

父类和子类中的方法名称相同?

可能重复:
为什么我们需要new关键字,为什么默认行为要隐藏而不是覆盖?

我有一个父母和一个孩子班.两者都有一个具有相同名称的方法,编译器允许它.我无法理解.如果父类具有相同名称的方法,为什么编译器未在子类中显示错误.我没有使用新的虚拟或覆盖方法.请帮助我理解为什么编译器没有在子类中显示错误?

 class BaseClass
{

     public string SayHi()
    {

        return ("Hi");

    }

}

class DerivedClass : BaseClass
{

    public  string SayHi()
    {

        return (base.SayHi() + " from derived");

    }

}
Run Code Online (Sandbox Code Playgroud)

.net c#

2
推荐指数
1
解决办法
2万
查看次数

如何在基类上使用派生属性?

我有一个基类,它有一个属性和一个使用该属性的方法.我有一个继承该基类的类,并且有自己的基类属性实现,使用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)

c# inheritance

0
推荐指数
1
解决办法
178
查看次数

标签 统计

c# ×7

.net ×3

inheritance ×2

java ×1

keyword ×1

methods ×1

virtual-functions ×1