【问题标题】:Convert C# `using` and `new` to PowerShell [closed]将 C# `using` 和 `new` 转换为 PowerShell [关闭]
【发布时间】:2023-03-20 12:57:01
【问题描述】:

C# 中有许多代码使用关键字usingnew。它们看起来很简单!

如何在 PowerShell 中优雅地实现这一点!

例如我想把下面的C#代码改成PowerShell

using (var image = new MagickImage(new MagickColor("#ff00ff"), 512, 128))
{
    new Drawables()
      // Draw text on the image
      .FontPointSize(72)
      .Font("Comic Sans")
      .StrokeColor(new MagickColor("yellow"))
      .FillColor(MagickColors.Orange)
      .TextAlignment(TextAlignment.Center)
      .Text(256, 64, "Magick.NET")
      // Add an ellipse
      .StrokeColor(new MagickColor(0, Quantum.Max, 0))
      .FillColor(MagickColors.SaddleBrown)
      .Ellipse(256, 96, 192, 8, 0, 360)
      .Draw(image);
}

new 表达式很难写,因为它包含另一个!有什么优雅的解决方案?

【问题讨论】:

  • @Claies C# 和 PowerShell 有很多相似之处。 PS可以使用C#类库,但是有些地方不容易转换,比如上面的
  • @Claies 都在 .NET 框架上运行。 Powershell 可以完成其他 .NET 语言(如 F#、C#、VB.NET...)的所有操作,反之亦然
  • 使用以下工具,可以在C#和PowerShell之间进行转换,但是复杂代码的效果不是很好,ironmansoftware.com/powershell-pro-tools-powershell-module

标签: c# powershell code-conversion


【解决方案1】:

C# using 只是 try {} finally {} 的语法糖,所以你可以在 PowerShell 中做同样的事情。对象的处置将放在finally 块中。 new 可以替换为 New-Object。当然new 可以作为New-Object 的别名,但是MS chose not to

try {
    $color = New-Object MagickColor -ArgumentList (,"#ff00ff")
    $image = New-Object MagickImage -ArgumentList ($color, 512, 128)
    $drawable = New-Object Drawables
    $drawable.FontPointSize(72). `
              Font("Comic Sans"). `
              StrokeColor(New-Object MagickColor -ArgumentList (,"yellow")). `
              FillColor()...
}
finally {
    if ($image) { $image.Dispose() }
    # or just `$image?.Dispose()` in PowerShell 7.1+
}

【讨论】:

  • 感谢您对关键词【使用】的分析。现在,上面代码中的关键字【new】很难理解,因为一个包含另一个
  • @tianyi 那些嵌套新的并没有什么特别之处。它们只是 R 值表达式,您可以将其存储在变量中(请参阅我的编辑)或直接作为参数传递给其他函数,例如 $image = New-Object MagickImage -ArgumentList ((New-Object MagickColor -ArgumentList (,"#ff00ff")), 512, 128)
  • .Font("Comic Sans") powershell不应该支持这个,不能开始。
  • @tianyi 如果FontPointSize 返回Drawables 那么显然.Font 将被正确调用。函数和方法在 powershell 中被调用,就像在 C# 中一样。只是新行结束了命令,所以你需要用反引号来转义它。查看更新的代码
  • @tianyi 刚刚发现member access operator 必须紧跟在对象之后,所以只需将点移到上面一行
猜你喜欢
  • 2016-02-03
  • 2015-12-29
  • 2015-09-16
  • 2011-05-11
  • 2011-01-15
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 2014-06-02
相关资源
最近更新 更多