是否可以在C#中的方法中定义本地结构?


Is it possible to define a local struct, within a method, in C#?

一个常见的编程最佳实践是"定义尽可能接近使用位置的变量"。

我经常使用结构来创建代码,这些代码在某些地方几乎是自记录的。但是,C强制我在方法之外定义结构。这打破了前面提到的最佳实践——它基本上为整个类创建了一个不需要的全局变量类型。

是否可以像局部变量一样在方法内部定义局部结构,如果不能,您能给我一个窗口,了解C设计人员决定阻止这种情况发生的原因吗?

用例

我正在将电子表格的一部分转换为C代码。我希望在方法中使用局部结构以有组织的方式存储临时信息,而不必求助于范围内全局的数百个独立变量。

更新-c 7.0可能具有此功能!

显然,到2016年8月,这将是C 7.0中的一个功能。

所以C编译器团队同意-哇!


我认为不允许在方法中定义命名类型。至于原因,我得推测一下。如果一个类型不打算在外部使用,那么它的存在可能是不合理的。

但是,您可以在一个方法中定义匿名类型变量。它有点像结构。妥协。

1
2
3
4
public void SomeMethod ()
{
    var anonymousTypeVar = new { x = 5, y = 10 };
}


这有点晚,但这是我的列表解决方案-使用匿名变量作为方法内部的结构:

1
2
3
4
var list = new[] { new { sn ="a1", sd ="b1" } }.ToList(); // declaring structure
list.Clear();                                               // clearing dummy element
list.Add(new { sn="a", sd="b"});                            // adding real element
foreach (var leaf in list) if (leaf.sn =="a") break;       // using it

匿名元素(sn和sd)以某种方式是只读的。


您可以使用匿名类型执行类似的操作。以下为MSDN示例:

1
var v = new { Amount = 108, Message ="Hello" };

1
2
3
4
5
6
7
8
var productQuery =
    from prod in products
    select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}


不,这是不可能的。如果您使用.NET 4.0,则可以使用Tuple来复制这样的内容。

我不明白为什么你需要这样一个结构-只需使用带有口语名称的变量,这应该不会有任何问题。结合使用类名的显式声明,几乎没有歧义空间。


您可以在C 4.0中创建一个动态类型来完成这项任务,但这并不是您想要的。

然而,我认为定义变量的最大值接近于它们的使用位置,这意味着变量被引入程序流的位置,而不是类型被声明的位置。我相信大多数类型都有一些可以重用的能力在方法类型中创建限制了您创建对公共数据操作的可重用代码块的能力。


它不是一个结构,但是变量可以帮助你吗?

1
var person = new {Name="John", City ="London"};

它是强类型的,所以它将被编译时检查


您可以在方法中定义一个匿名类型并使用它。匿名类型将是只读的,因此它为您提供结构所需的不可变性。它不会显式地是一个结构,但它将被完全定义并包含在方法中。

1
2
3
4
5
var myLocalType = new
    {
        SomeValue ="Foo",
        SomeId = 14
    };

不,这是不可能的。实际应用是什么?仅在单个方法中使用结构的频率有多大?微软可能没有看到任何令人信服的理由来实现这一功能。在可能有用的情况下,我们有匿名类型和匿名方法。