【问题标题】:C# Expressional if statements, possible expansion? [closed]C# 表达式 if 语句,可能的扩展? [关闭]
【发布时间】:2020-01-14 07:28:15
【问题描述】:

大家好,我有一个问题:如何在 C# 中使用单个表达式返回语句直接执行函数或委托以及从方法返回值

*供参考,我使用的是C#7

在这种情况下,我需要向用户返回一个像这样生成的对象:

object obj = cmd.ExecuteScalar();

我还有一个我想调用的日志记录功能:

DoLog(cmd.CommandText)

PS:我 100% 知道我可以无条件地使用几个 if 语句以更简单的方式实现这一点 - 我只是问是否任何人都可以为我提供最优雅的“单线”方法。

这是条件返回表达式通常如何工作的标准示例

return (someBool)
   ? value1
   : value2;

如果 someBool 为 TRUE,这将返回 'value1';

基本上我的问题是我可以做这样的事情

return (chkStatus)
    ? (obj & DoLog(cmd.CommandText))
    : null;

对于一些建议我可以使用单个管道运算符来拆分返回的人的回应,虽然您的建议是真诚的,但我假设您从未尝试过编译它们

如果你有,你会发现它不能作为类型工作:Object 和 Void 不能直接比较,从而导致编译时错误。

我仍然要求更精致/优雅的方法。

【问题讨论】:

  • 呃.....catch { throw; } ???没用?
  • @jasttim - 是的,但是如果你所做的只是再次抛出,为什么还要抓住呢? -- 你可以尝试..finally 而不用 catch。
  • 如果你不捕捉异常,它就不会被“吃掉”……只捕捉你能解决的异常。
  • 你可以完全省略你的catch { throw; }。它将与只有try finally 而没有任何catch 完全相同。无论如何,我仍然没有得到您的实际问题。
  • 就您的原始问题而言,我想我会选择if (obj != null) { DoLog(cmd.CommandText); } return obj; 简单、清晰、简洁。

标签: c# winforms syntax conditional-statements


【解决方案1】:

您可以使用 lambda 解决一些问题,但它不会是一个干净的语法:

        return (chkStatus 
            ? (Func<object>)(() => { 
                  DoLog(cmd.CommandText); 
                  return obj; 
              })
            : () => null)();

【讨论】:

  • 这可以用本地方法写得更好:return chkStatus ? GetResult() : null;object GetResult() { DoLog(cmd.CommandText); return obj; }
【解决方案2】:

我假设你想返回obj,但也要执行DoLog,我假设它没有返回值。 如果你一心想要提取这个逻辑,你可以给自己写一个扩展方法:

public static T AndExecute<T>(this T returnValue, Action action)
{
    action();
    return returnValue;
}
return (chkStatus) ? obj.AndExecute(() => DoLog(cmd.CommandText)) : null;

虽然为了可读性,我会保持原样 - 它清楚地传达了它的目的。

【讨论】:

  • 这是我的第一个想法,包含这个类的网络父类必须是实例成员,所以我需要执行的很多操作都是为特定的网络实例量身定制的
  • "由包含此类的网络父类必须是实例成员" Eeeehm,什么?你能说明这两个类是如何关联的吗?我不明白你的结构。
  • 我通过在 Network.cs 文件中创建第二个静态类 ClassName 解决了这个问题。这允许使用 this 修饰符来导入参数,因为您不能使用例如“this string str, int i”作为实例类中方法的参数,编译器不会让 u
  • @HimBromBeere 基本上我有一个实例类“Network”,您的方法不会应用于该类,因为您不能在实例类中使用动态/静态覆盖方法 - 所以在同一个命名空间中是一个扩展器使用您的代码进行课程,然后我可以从我的主网络库中调用它:) 希望可以清除它
猜你喜欢
  • 1970-01-01
  • 2013-12-08
  • 2012-04-10
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2021-09-05
相关资源
最近更新 更多