【问题标题】:Is there an equivalent C# syntax for C's inline anonymous struct definition?C 的内联匿名结构定义是否有等效的 C# 语法?
【发布时间】:2011-04-07 09:45:34
【问题描述】:

问候溢出者,

我知道在 C 语言中我们可以定义一个与变量声明内联的结构,以便结构类型特定于该变量。这不是单独定义类型,然后将变量声明为该结构类型。这在 C# 中可行吗?

谢谢!

【问题讨论】:

  • 我期待看到一些 C 代码。唉,期望没有得到应有的满足,我因此感到非常失望。
  • 举个例子就好了。另外,为什么需要这样做,也许C#中有另一种解决问题的方法?
  • 是的,在C#中是可以的,但是是这样写的。
  • C# 应该类似于 C 是一个常见的假设。事实并非如此,您必须超越 {braces}。甚至 C++ 也没有采用笨拙的 C 结构语法。想出一个结构的类型名称是一个小的努力。还有很多其他地方 C# 强制你做正确的事。
  • 当声明一个结构类型仅在一个数组中使用时,这是可取的,该数组在编译时填充为一种查找表。示例 C:const struct { const char *name; int (*action)(human_t *, int argc, char *argv[]); } actions[] = { {.name = "eat", .action = action_eat}, {.name = "sit", .action = action_sit}, {.name = NULL}, };

标签: c# c struct equivalent


【解决方案1】:

这在 C# 中是不可能的,但是您可以像这样定义匿名类型的实例:

var x = new { SomeField = 1, SomeOtherField = "Two" }; 

这实际上是相同的,为您提供特定于该变量且不能在变量范围之外使用的类型的实例。

【讨论】:

  • 注意: 匿名类型不能从其他方法返回或传递给其他方法,即它们只存在于它们已定义的方法的范围内。它不是可以在类级别上有一个匿名类型的变量。
  • @Daniel:是的,虽然我很确定相同或等效的限制适用于 C 中的匿名结构,实际上适用于任何静态类型的语言。 “如果它没有名字,你就不能提及它”。有道理。
  • @Daniel - 实际上,您可以将它传递给泛型方法,但它非常难看。它也将与具有相同字段的 其他 匿名类型共享,但同样非常丑陋。但显然,不是在类级别 - 如果 C++ 允许,我认为 C# 没有类似的东西。
  • @Kobi:你是对的。实际上,我以前知道,但忘记了,因为这样做真的没有任何意义:-)
  • 另一个小缺点是类型不可变 - 如果您正在构建它并且需要稍后初始化一些成员变量,这很烦人。至于将其移出范围......好吧,dynamic 的邪恶已经在一定程度上改变了格局,但从设计的角度来看,我认为我们都同意这通常是一个可怕的妥协
【解决方案2】:

简单的回答:不,不可能。

【讨论】:

    猜你喜欢
    • 2018-01-05
    • 1970-01-01
    • 2018-08-23
    • 2013-06-11
    • 2017-03-03
    • 2013-04-18
    • 2020-10-28
    • 2022-01-05
    • 2012-07-13
    相关资源
    最近更新 更多