我正在使用C#3.0.遵循标准事件模式我有:
public event EventHandler<EventArgs> SomeEventHappens;
protected virtual void OnSomeEventHappens(EventArgs e)
{
if (SomeEventHappens != null)
{
SomeEventHappens(this, e);
}
}
private object _someProperty;
public object SomeProperty
{
get
{
return _someProperty;
}
private set
{
if (_someProperty == value)
{
return;
}
OnSomeEventHappens(EventArgs.Empty);
_someProperty = value;
}
}
Run Code Online (Sandbox Code Playgroud)
在同一个班级里,我想在SomeProperty
改变时采取一些行动.我看到它的方式我有3种选择:
1)在我的SomeProperty
二传手中做东西.因为我试图订阅所有事情的理念应该做一件事并做得好,因此有些事情让我误解了这一点.塞进东西的东西似乎与此相反,或者至少有这种倾向.
2)做的东西OnSomeEventHappens
.再次,似乎有点反对保持这个简单的部分.此外,如果此方法被覆盖,如果实现者不调用基本方法,则可能会丢失功能.
3)让班级订阅SomeEventHappens
.对我而言,就封装而言,这似乎是正确的选择,而且看起来很干净.再次,如果OnSomeEventHappens
被覆盖可能会产生影响.
也许有更优雅的东西?我不能在选项2和3之间做出决定,我很好奇最佳实践是什么.也许最安全的地方就是物业安置者.
思考?
更新: 感谢下面的精彩评论和答案.我已经知道让一个类订阅自己的事件是"没问题的",尽管在我的情况下我倾向于不做因为开销.我已经考虑了我的虚拟方法的潜在重写器的行为以及我想要发生什么.
在我的真实案例中,我真的不希望在没有设置属性的情况下引发事件.由于下面的答案指导了我的思考过程,我认为我可以选择1,因为开销较低,继承人不正当行为的风险降低,而且通常对我来说更有意义.再次感谢!
我正在使用C#3.5和Linq.我在VS 2010上有ReSharper 6.1.
例如,如果我在代码编辑器中输入以下语句:
var result = dataContext.Items.Select(i => new {Name = i.ItemName});
Run Code Online (Sandbox Code Playgroud)
一旦我键入new {
它自动完成到new string{}
.实际上,不确定它是否总是string
或取决于lambda.但我发现我总是需要将其删除并备份.每当我在lambda中声明匿名类型时,就会发生这种情况.
为了能够使用上述语法输入匿名类型而不发生这种情况,我需要更改ReSharper或VS中的哪些设置?我希望在所有其他情况下保留自动完成,而不是这个特定的情况,因为它对我的意图做出了不正确的假设.
我正在尝试编写一些能够方便地处理视频帧的代码.我收到框架作为System.Windows.Media.Imaging.WriteableBitmap
.出于测试目的,我只是应用一个简单的阈值滤波器来处理BGRA格式图像,并根据BGR像素的平均值将每个像素分配为黑色或白色.
这是我的"安全"版本:
public static void ApplyFilter(WriteableBitmap Bitmap, byte Threshold)
{
// Let's just make this work for this format
if (Bitmap.Format != PixelFormats.Bgr24
&& Bitmap.Format != PixelFormats.Bgr32)
{
return;
}
// Calculate the number of bytes per pixel (should be 4 for this format).
var bytesPerPixel = (Bitmap.Format.BitsPerPixel + 7) / 8;
// Stride is bytes per pixel times the number of pixels.
// Stride is the byte width of a single rectangle row.
var stride = Bitmap.PixelWidth …
Run Code Online (Sandbox Code Playgroud) 我一直在使用ReSharper多年,并设法调整大多数设置,我喜欢.我变老了,我的眼睛不像以前那么好,所以我一直在增加我的字体大小.我已经能够在工具 - >选项 - >字体和颜色中调整大部分(包括ReSharper特定的).
但是,我无法在Unit Test Runner输出窗口中找到控制字体的设置.对我来说,它非常小.想想看,大多数ReSharper自己的Windows字体很小,但那是目前困扰我的那个.
有谁知道如何调整这些字体?在系统范围内扩展我的字体大小不是一种选择.
目前使用VS 2013和ReSharper 8.2
谢谢
虽然我已经使用Ninject很长一段时间,但我使用Simple Injector是全新的,所以我对DI很满意.吸引我想要使用Simple Injector的一件事是装饰器的易用性.
我已经能够在所有正常情况下成功使用带有Simple Injector的装饰器,在请求服务时解析依赖关系.但是,我很难弄清楚是否有办法在必须使用运行时值构造服务的情况下应用我的装饰器.
在Ninject中,我可以传递一个请求,ConstructorArgument
该kernel.Get<IService>
请求可以从N个装饰器的链中继承到"真正的"实现类.我无法想出使用Simple Injector复制它的方法.
我在下面放了一些非常基本的代码来说明.我想在现实世界中想要做的是将一个IMyClassFactory
实例传递给我的应用程序中的其他类.那些其他类可以使用它来创建IMyClass
使用IRuntimeValue
它们提供的实例.在IMyClass
他们从GOT实例IMyClassFactory
会自动注册的装修装饰.
我知道我可以手动将我的装饰器应用到我IMyClassFactory
或Func<IMyClass>
我想出的任何装饰中,但我希望它能"正常工作".
我一直四处寻找并试图抽象出MyClass
构造,但我无法弄清楚如何使用IRuntimeValue
构造函数参数来解决它并进行修饰.
我忽略了一个明显的解决方案吗
using System;
using SimpleInjector;
using SimpleInjector.Extensions;
public class MyApp
{
[STAThread]
public static void Main()
{
var container = new Container();
container.Register<IMyClassFactory, MyClassFactory>();
container.RegisterDecorator(typeof (IMyClass), typeof (MyClassDecorator));
container.Register<Func<IRuntimeValue, IMyClass>>(
() => r => container.GetInstance<IMyClassFactory>().Create(r));
container.Register<IMyClass>(() => ?????)); // Don't know what to do
container.GetInstance<IMyClass>(); // Expect to …
Run Code Online (Sandbox Code Playgroud) 这是我试图演示的(过度)简化版本:
var reactiveCommandA = ReactiveCommand.CreateAsyncTask(_ => CanPossiblyThrowAsync());
reactiveCommandA.ThrownExceptions
.Subscribe(ex => UserError.Throw("Oh no A", ex));
var reactiveCommandB = ReactiveCommand.CreateAsyncTask(_ => CanAlsoPossiblyThrowAsync());
reactiveCommandB.ThrownExceptions
.Subscribe(ex => UserError.Throw("Oh no B", ex));
var reactiveCommandC = ReactiveCommand.CreateAsyncTask
(
async _ =>
{
await reactiveCommandA.ExecuteAsync(); // <= Could throw here
await reactiveCommandB.ExecuteAsync();
DoSomethingElse();
}
);
reactiveCommandC.ThrownExceptions
.Subscribe(ex => UserError.Throw("Oh no C", ex));
Run Code Online (Sandbox Code Playgroud)
因此,假设我的后台实现reactiveCommandA
可能会引发异常。没关系,因为我已经订阅.ThrownExceptions
并且理论上会通知用户并重试/失败/中止(为简洁起见,此处未显示)。所以它不会冒泡给调度员。
所以当reactiveCommandA
它自己执行时就很棒了。但是,我有reactiveCommandC
which 执行reactiveCommandA
和reactiveCommandB
。我也订阅了它的.ThrownExceptions
。我遇到的问题是,如果我执行reactiveCommandC
并reactiveCommandA
在其中抛出实现,它也会导致reactiveCommandC
爆炸。然后我会两次通知用户相同的根错误,因为先做reactiveCommandA
它的 …
c# ×4
resharper ×2
autocomplete ×1
decorator ×1
events ×1
fonts ×1
lambda ×1
reactiveui ×1
unsafe ×1
wpf ×1