- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个带有以下抽象事件的抽象基类
public abstract class SignalWrapperBase<T> : IReadOnlySignal<T> {
public abstract event Action<IReadOnlySignal<T>, Sample<T>> Updated;
...
}
在我的实现中我只是说
public class ValueChangedSignal : SignalWrapperBase<T> {
public override event Action<IReadOnlySignal<T>, Sample<T>> Updated;
...
}
当我在实现 ValueChangedSignal
时尝试执行以下操作
if (Updated != null) { Updated(this, sample); }
我收到 ReSharper 警告:调用多态字段类事件。
我检查了 reasoning在它后面,但它在示例中使用 virtual
而不是 abstract
:
public class Base
{
public virtual event EventHandler MyEvent;
}
public class Derived : Base
{
public override event EventHandler MyEvent;
public void SomeMethod()
{
var args = ...;
MyEvent(this, args);
}
}
The above block of code uses an overriding event declaration to override the implementation of the add and remove methods on an event. The field itself will then exist in two separate instances - one in Base and one in Derived. As a consequence, when working with Derived, you're likely to never instantiate the Base's MyEvent unless you explicitly set it to some value. And, as a result of that, the behavior in the case when the event is raised in the base class would differ from that in the derived class.
我知道如果它是虚拟的
,我会得到两个实例。我会用实际实现隐藏基本实现,但是,当我使用 abstract
时,我从来没有进行过基本实现,对吗?我认为当我在某些领域使用抽象时,我只是将实现转发给继承类,即,我要求我的基类的用户实现抽象代码。
ReSharper 是否给我错误的警告?还是我误解了什么?
最佳答案
这不是错误警告,Resharper 让您注意的事实是您的派生类也可以被继承和事件覆盖。
让我们看一个例子:
static void Main(string[] args)
{
Base b = new Derived();
b.E += (sender, eventArgs) => { Console.WriteLine("Event Handled"); };
b.Raise();
}
abstract class Base
{
public abstract event EventHandler E;
public abstract void Raise();
}
class Derived : Base
{
public override event EventHandler E;
public override void Raise()
{
if (E != null)
E(this, null); // Resharper: Invocation of polymorphic field-like events
}
}
Main() 的结果:事件已处理
一切都按预期进行:我们订阅了事件 E,引发了事件 E,并且可以在屏幕上看到来自事件订阅的消息。
现在,如果我们从 DerivedClass 继承另一个类并像这样覆盖事件:
static void Main(string[] args)
{
Base b = new MostDerived();
b.E += (sender, eventArgs) => { Console.WriteLine("Event Handled"); };
b.Raise();
}
class MostDerived : Derived
{
public override event EventHandler E;
}
事情变了,现在 Main() 什么都没有。
发生这种情况是因为对象b中有两个事件E的私有(private)字段:一个来自Derived类,另一个来自MostDerived。这正是 Resharper 警告的内容。
如果您确定 Derived 类永远不会被继承并且事件 E 被覆盖,请将 Derived 标记为密封,Resharper 警告将消失。
关于c# - 实现抽象事件会从 ReSharper 发出 "Invocation of polymorphic field-like event"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17653608/
示例:我想要一个插入方法的模板。如果类被声明 sealed ,那么我想要声明的方法private .如果类不是 sealed ,那么我想要声明的方法protected virtual . 另一个例子。
我不记得我购买的是 C# 版本还是 C#+VB 版本,我想知道,因为您在购买升级到 R# 6 时需要了解这一点。 我在任何地方都找不到关于对话框。任何人都可以帮忙吗? 最佳答案 菜单中的“ReShar
任何人都知道我可以在哪里更改设置以阻止 resharper 在调试时将这些消息输出到输出窗口? 'JetBrains.ReSharper.TaskRunner.exe' (Managed): Load
我想将其完全关闭,而不得到任何解决方案范围的提示。我只看到我可以在哪里暂停但找不到关闭它的答案。 最佳答案 在Resharper 5.1中,通过取消选中ReSharper->选项->代码检查->设置下
如何在不卸载的情况下卸载 Resharper?我在一个项目中需要它,但它会干扰另一个项目。 最佳答案 工具 > 选项 > ReSharper > 暂停 关于resharper - 如何在不卸载的情况下
我想告诉 ReSharper 忽略我的项目中的一些文件。其中一些太大了(它们包含固定的测试数据)。他们中的一些人只是混淆了它(混杂了 Silverlight 和 .NET 代码)。 有没有办法通过在文
我希望能够为多个项目禁用 R#。有相当多的内容需要排除,这意味着在 VS 中为每个项目执行此操作并不理想(菜单:R# -> 选项 -> 代码检查 -> 设置 -> 编辑要跳过的项目)。 有人知道有什么
我有一些代码,其中有一系列“绿色”灯泡建议,Resharper 告诉我可以使用对象初始值设定项。 我一直在遗留代码中看到这种事情,其中有一些代码模式一遍又一遍地重复,Resharper 知道如何自
我知道如何导航到文件或类,但是我可以导航到类的方法吗? 哦,假设我正在查看不同类(class)的文件 最佳答案 关于我正确配置的键绑定(bind),之前的所有答案对我来说似乎都已过时/无效。 我说:
Resharper 的安装路径在我们尝试过的多台不同计算机上似乎有所不同。其中一个,默认位置是 C:\Program Files (x86)\JetBrains\Installations 在其他电脑
我刚刚为我的应用程序实现了一个自定义 MessageBox。我现在想用我的自定义实现替换对 MessageBox.Show() 的任何调用,即 MsgBox.Show()**。我意识到我可以通过简单的
我对 Resharper 有疑问 - 它的所有菜单选项都是灰色的,没有快捷方式可用... 我已经尝试使用修复选项运行安装程序 - 没有成功 还尝试卸载/重新安装 - 相同.. :( ReSharper
下周我将在我的同事面前谈论 Resharper 作为提高开发人员性能的工具。由于本次演讲的时间有限,问题是 - 哪些重新锐化功能比其他功能更值得讨论? 目前我能想到的是: 代码分析/突出显示 单元测试
此 question是相似的,但我的问题似乎是在未答复的评论中提出的。 我创建了一个 C# 类。我使用 alt-insert 添加构造函数。我向构造函数添加一个参数,然后使用 alt-enter 从该
我正在使用 this NetResource class将文件发送到网络驱动器,它看起来像这样: [StructLayout(LayoutKind.Sequential)] public class
Resharper 确实提示诸如由 WCF 服务引用之类的东西生成的 reference.cs 之类的文件。如何让 Resharper 完全跳过此类文件? 最佳答案 菜单 ReSharper -> O
我正在使用 Resharper(带有 StyleCop 插件,尽管我认为这与问题/答案无关)在我们的代码库中强制执行命名约定。除了一个异常(exception),这几乎在任何地方都非常有效。 对于测试
我是 ReSharper 的新手。 对于那些使用 Resharper 的人,有没有一种方法可以添加自定义代码分析规则? 例如,我可能有一条规则说所有私有(private)变量都应该以字母“m”开头。我
这段代码: IEnumerable> numbas = new[] {new[] {0, 1}, new[] {2}, new[] {3, 4, 5}}; var flattened = numbas
是否可以更改 Resharper 格式化属性的方式? 我不喜欢: public string Foo { get { return bar; } set
我是一名优秀的程序员,十分优秀!