一种常见的编程最佳实践是“将变量定义为尽可能接近它们的使用位置”。
我经常使用结构来创建代码,这些代码在某些地方几乎是自文档化的。但是,C#强制我在方法外部定义结构。这打破了前面提到的最佳实践-它基本上为整个类创建了一个不需要的全局变量类型。
是否可以像定义局部变量一样在方法中定义局部结构,如果不能,您能给我一个窗口,让我了解C#设计者决定阻止这种情况的原因吗?
用例
我正在将电子表格的一部分转换为C#代码。我想在方法中使用局部结构,以有组织的方式存储临时信息,而不必求助于数百个独立的变量,这些变量在作用域中是全局的。
更新2016-8月: C# 7.0可能具有此功能!
很明显,从2016年8月开始,这将是C# 7.0中的一个功能。
所以C#编译器团队同意了--哇!
更新2020-7月:现在由C#和C++支持
C++一直完全支持这一点。真是太棒了。
C# 7.0现在具有用于具有命名字段的轻量级数据结构的值元组。请参见来自Ghost4Man的answer。
发布于 2010-11-17 23:25:46
我认为在一个方法中定义命名类型是不允许的。至于原因,我不得不猜测。如果一个类型不打算在外部使用,那么它的存在可能是不合理的。
但是,您可以在方法中定义匿名类型变量。它在某种程度上类似于结构。一个折衷方案。
public void SomeMethod ()
{
var anonymousTypeVar = new { x = 5, y = 10 };
}发布于 2011-09-07 05:24:43
虽然有点晚,但这是我对列表的解决方案--使用匿名变量作为方法内部的结构:
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)是只读的。
发布于 2010-11-17 23:29:27
你可以使用anonymous types来做这样的事情。MSDN示例如下:
var v = new { Amount = 108, Message = "Hello" };或
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);
}https://stackoverflow.com/questions/4205907
复制相似问题