我最近自己探索了 c#。但一直被这个问题困扰。
所以我有一个方法 dbExec
public void dbExec(Action<OleDbCommand> func)
{
using (var conn = new OleDbConnection(connStr))
{
conn.Open();
var cmd = conn.CreateCommand();
func(cmd);
}
}
Run Code Online (Sandbox Code Playgroud)
代表,
public delegate void DelCmd(OleDbCommand cmd);
Run Code Online (Sandbox Code Playgroud)
和另一种方法:
public ICollection<string> CheckUserPermissions()
{
List<string> logins = new List<string>();
DelCmd delCmd = delegate(OleDbCommand cmd)
{
cmd.CommandText = "SELECT PERMISSIONS.LOGIN FROM PERMISSIONS";
using (var rdr = cmd.ExecuteReader()) while (rdr.Read()) logins.Add(rdr["LOGIN"].ToString());
};
dbExec(delcmd);
return logins;
}
Run Code Online (Sandbox Code Playgroud)
声明的问题dbExec(delcmd);。错误是“delcmd 在当前上下文中不存在”。如何将匿名方法作为参数传递给另一个带有 Action 声明参数的方法?
美好的一天.我在TreeView中有递归遍历TreeNode的方法:
public void ShowTree(TreeView tree)
{
foreach (TreeNode node in tree.Nodes)
{
ShowNode(node);
}
}
private void ShowNode(TreeNode node)
{
MessageBox.Show(node.ToString());
foreach (TreeNode child in node.Nodes)
{
ShowNode(child);
}
}
Run Code Online (Sandbox Code Playgroud)
但我必须有多余的方法"ShowNode",这在其他任何地方都没有使用.如何制作这种匿名方法并合并这两种方法?
var seq = Enumerable.Range(1, 10).Reverse();
var sort1 = seq.OrderBy(i => i);
var sort2 = seq.OrderBy(delegate(int i) { return i; });
Run Code Online (Sandbox Code Playgroud)
我认为sort2更明确但排序1更短.除此之外,我真的不知道其中的区别.这样做的推荐方法是什么?
我正在使用Delphi 2009并使用以下代码段获得一些奇怪的错误:
var
Str : AnsiString;
CharPtr : PAnsiChar;
...
CharPtr := PAnsiChar (Str);
ExecuteInBackgroundThread (
procedure
begin
DoSomething (CharPtr);
end);
Run Code Online (Sandbox Code Playgroud)
我猜测字符串在超出范围时会被破坏,并且在某些时间条件下,DoSomething会产生最奇怪的结果.所以第一个问题是:我是对的吗?
第二个问题是:我如何规避被破坏的字符串?这样做的正确方法是什么?
提前致谢.
好,
所以当有人在Silverlight应用程序中点击我们的Icon时,我会有一个触发方法,如下所示:
private void Logo_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
e.Handled = true;
ShowInfo(true);
DispatcherTimer autoCloseTimer = new DispatcherTimer();
autoCloseTimer.Interval = new TimeSpan(0, 0, 10);
autoCloseTimer.Tick +=new EventHandler((timerSender,args) =>
{
autoCloseTimer.Stop();
ShowInfo(false);
});
autoCloseTimer.Start();
}
Run Code Online (Sandbox Code Playgroud)
什么意思发生的是ShowInfo()方法打开一个公司信息输入框,调度计时器在所述时间跨度后自动关闭它.这一切都有效......
但是我不确定的是因为调度计时器是本地var,在Logo_MouseLeftButtonUp方法完成之后,在匿名方法被触发之前,有什么能够保持调度计时器被引用并且不能用于GC集合?
它是匿名方法中ShowInfo()方法的引用吗?
只是觉得我应该更深入地了解一些事情,因为我可以想象使用事件等,这样就可以很容易地创建漏洞.
希望这一切都有意义!
安迪.
我经常得到使用lambda表达式的代码示例.我仍然使用.net 2.0,并且发现很难使用这样的代码,例如
foreach(var item in items)
{
var catCopy = item;
foreach(var word in words)
{
var wordCopy = word;
var waitCallback = new WaitCallback(state =>
{
DoSomething(wordCopy, catCopy);
});
ThreadPool.QueueUserWorkItem(waitCallback);
}
}
Run Code Online (Sandbox Code Playgroud)
我如何将这种表达式转换为任何替代方法(即非lambda代码或匿名方法)?
谢谢
我想分配给这样的数据表.
如果datatable为null,则创建一个新的数据表,否则清除数据表
我写的代码
datatable= (datatable== null) ?
new DataTable() :
delegate(){datatable.Clear(); return datatable;});
Run Code Online (Sandbox Code Playgroud)
如何使用委托或匿名方法实现这一目标?尽可能使用最短的代码.
我刚刚看到以下代码:
class X
{
static Action Ac()
{
return ..some other code
}
}
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我从未见过声明其身体的代表.
为什么我不能break;在while循环中使用语句,而在匿名方法中?
当我收到这个错误时,我正在处理这段代码(下面):" Control cannot leave the body of an anonymous method or lambda expression".
值得庆幸的是,我可以通过使用return;来解决问题,但我仍然想知道为什么我不能使用break;.对我来说,两个语句之间的主要区别在于return;退出方法,并break;退出最进一步的嵌套循环.
我的代码,
while (someCondition)
{
System.Threading.Thread.Sleep(500);
Application.Current.Dispatcher.Invoke(new Action(() =>
{
if (someOtherCondition)
{
// Do stuff...
}
else
{
if (anotherCondition)
{
break;
}
// Do something else...
}
}));
}
Run Code Online (Sandbox Code Playgroud)