我经常遇到想要订阅事件的情况,但我想使用lambda来执行此操作:
public class Observable
{
public event EventHandler SomethingHappened;
public void DoSomething()
{
// Do Something...
OnSomethingHappened();
}
}
// Somewhere else, I hook the event
observable.SomethingHappened += (sender, args) => Console.WriteLine("Something Happened");
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我不知道如何取消事件.由于lambda在引擎盖下创建了一个匿名委托,所以我没有什么可以调用-=的.
现在,我可以创建一个方法:
private void SomethingHappened(object sender, EventArgs args)
{
Console.WriteLine("Something Happened");
}
Run Code Online (Sandbox Code Playgroud)
然后我可以挂钩/取消所有我想要的东西:
observable.SomethingHappened += SomethingHappened;
observable.SomethingHappened -= SomethingHappened;
Run Code Online (Sandbox Code Playgroud)
但我真的非常非常喜欢使用我的lambda.在一个更复杂的例子中,lambdas在这里非常方便.
我很确定我运气不好......但我想知道是否有人想出办法做到这一点?
我被建议在GCC中使用以下选项,因为它有助于避免许多常见错误.它会打开一堆警告并将-Werror其变成错误.
gcc -pedantic -W -Wall -Wextra -Wshadow -Wstrict-overflow=5 -Wwrite-strings -std=c99 -Werror
Run Code Online (Sandbox Code Playgroud)
鉴于以下测试代码:
#include <stdio.h>
int main(void)
{
int arr[8]={0,10,20,30,40,50,60,70};
int x;
printf("sizeof(arr): %d\n", sizeof(arr));
printf("sizeof(int): %d\n", sizeof(int));
for(x = 0; x < sizeof(arr)/sizeof(int); x++)
{
printf("%d\n",arr[x]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
test.c:11: error: comparison between signed and unsigned
Run Code Online (Sandbox Code Playgroud)
我知道我能解决这个问题的一种方法就是关闭警告,但是他们还没有让我使用这些设置来最终关闭它们.
另一种方法是投射东西,但我被告知铸造已被弃用.
另外,我可以将x变为unsigned int:
unsigned x;
Run Code Online (Sandbox Code Playgroud)
但是,当我必须使用这些编译器选项将带符号值与无符号值进行比较时,它无法解决一般问题.是否有更清洁的方式而不是铸造?
我想在一个应用程序中使用libCurl与Web服务进行通信,不幸的是它不包含在iPhone SDK中.现在我已经想出如何在我的应用程序中包含Curl作为静态库,但是,我想知道这是否会让我的应用程序被Apple拒绝.有没有人在应用程序中包含Curl并且已经Apple批准了?
谢谢.
编辑:猜猜我应该更清楚,我想知道是否有人实际上这样做,因为我不确定Curl SDK是否包含未记录的功能.
我在查看Win32 gui代码时经常会看到这个.我的假设是它是一个标准的按位或者,但我也偶尔在C#中看到它,似乎会有一个更好的(更高级别)方式来做同样的事情.无论如何,这是一个例子:
MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
Run Code Online (Sandbox Code Playgroud)
谢谢,
西莫
使用linq将空值传递给ExecuteCommand()方法时遇到问题.我的代码类似于下面的代码:
public void InsertCostumer(string name, int age, string address)
{
List<object> myList = new List<object>();
myList.Add(name);
myList.Add(age);
myList.Add(address);
StringBuilder queryInsert = new StringBuilder();
queryInsert.Append("insert into Customers(name, address) values ({0}, {1}, {2})");
this.myDataContext.ExecuteCommand(queryInsert.ToString(), myList.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
但是,当参数为null(例如地址)时,我收到以下错误:"查询参数不能是'System.Object'类型."
如果没有参数为null,则不会发生错误.我知道我的例子中的设计有点差,我只是创建了一个简化的例子来关注问题.有什么建议?
有没有人知道类似于Java Robot的Python类?
具体来说,我想在Ubuntu中执行屏幕抓取,并最终跟踪鼠标点击和键盘按下(尽管这是一个稍微不同的问题).
错误消息"找不到类型或命名空间名称'T'."
???
public static Expression<Func<T, bool>> MakeFilter(string prop, object val)
{
ParameterExpression pe = Expression.Parameter(typeof(T), "p");
PropertyInfo pi = typeof(T).GetProperty(prop);
MemberExpression me = Expression.MakeMemberAccess(pe, pi);
ConstantExpression ce = Expression.Constant(val);
BinaryExpression be = Expression.Equal(me, ce);
return Expression.Lambda<Func<T, bool>>(be, pe);
}
Run Code Online (Sandbox Code Playgroud)
相关链接:
我有几个项目具有非常大的重叠代码库.我们刚刚开始使用SVN,所以我想弄清楚我应该如何使用它.
问题是,当我完成一个项目的任务时,我正在另一个项目上开始执行任务,但有一些重叠.通常还会有很多中断驱动的开发.所以,我的代码永远不会处于一个完全稳定的状态,我觉得很舒服.
结果是我们并没有真正使用VC系统,这是一件非常糟糕的事情,我们都知道......所以,建议?
我的rails网站运行Mongrel,我使用的内存量有问题.我的ruby-bin进程占用了大约66 MB的驻留内存.如何减少rails使用的内存量?
如果以这种速度占用内存,在一台机器上运行许多rails服务器是不太经济的.我的php5 fcgi进程位于15-25 MB之间.
我对RoR很不熟悉,会不会使用JRuby的帮助?任何有助于减少内存占用和提高性能的评论都非常受欢迎.
我已经jdk1.6.0_13安装了,但是当我试图找到一个javax.servlet包,或者在我无法得到任何东西之后在Eclipse中按Ctrl+ .我在哪里可以下载此软件包,为什么它不包含在开发人员的标准发行版中?SpaceServlet