【问题标题】:PHP variable variables in .NET.NET 中的 PHP 变量变量
【发布时间】:2010-11-23 18:37:39
【问题描述】:

.NET 本身是否支持类似于 PHP 的 variable variables 的东西?

如果不是,1这样的功能如何最容易实现?


1如果您认为可变变量总是不好,请随意陈述您的情况,但主要问题是:如何实现它们?

【问题讨论】:

  • 我真的不认为有人会说变量变量不好。可能会使用用户输入来访问变量。

标签: .net php variable-variables


【解决方案1】:

为什么不直接使用字典?

Dictionary<string,string> stuffHash = new Dictionary<string,string>();

string varname = "TheNameOfTheVar";
string value = "foo";

stuffHash[varname] = value;

实际上不需要做这种丑陋的事情。

【讨论】:

  • 同意。使用字典将是最简单的。可能想将其声明为 Dictionary 然后将对象转换为您使用的任何类型。
  • 是的 可能更合适,但取决于实际使用情况。
【解决方案2】:

.Net 本身不支持“变量”——可能主要是因为它是一种[强类型语言][1]。

不过,它确实支持在运行时动态创建一个类型的实例,这可用于完成与 PHP 变量变量类似的行为。

【讨论】:

    【解决方案3】:

    这是一个深深嵌入在dynamic languages 中的功能。 C# 起源于静态的、面向对象的语言,直到 C# 3.0 这意味着没有运气以任何适当的方式完成你想要的。然而,C# 4.0/.NET 4.0 引入了dynamic keyword,它允许动态类型化变量,就像在 PHP 中一样。不幸的是,尽管这是 C# 成为静态/动态混合语言的一个飞跃,但它缺少几乎所有动态语言都具有的关键 eval 函数。借助 C# 5.0/.NET 5.0 的传闻中的编译器即服务特性,这将被有效地引入(尽管内部行为不会相同)。在那之前,除了使用Dictionary 来存储变量名的技巧之外,没有像样的解决方案。

    【讨论】:

    • 我不会将使用字典称为 hack。我会打电话给 $a = "foo"; $$a == $foo 一个黑客。
    • 在试图模仿动态语言的情况下,我认为这绝对是一种 hack。
    • 我想说的是,在动态语言中使用可变变量充其量只是一种技巧,对于该用例有更好的解决方案。
    • @Vinok:事实上,即使在动态语言中,它们的使用也常常是一种黑客行为。我的意思是 实现 是一个 hack。
    【解决方案4】:

    不,.NET 语言都不支持这样的东西。这可以由其中一个编译器团队来实现,但我怀疑他们永远不会这样做。

    至于如何,这可以由您(而不是 C# 编译器团队)实现,将所有变量变量存储在 Dictionary&lt;String,Object&gt; 中 - 这将允许您关联一个字符串有一个对象。

    我从来没有真正理解可变变量解决了什么问题(换句话说,我从来没有听说过需要使用它们的好论据)。我很想看看一个需要它们的例子,因为我想找到一个更好的方法来解决没有变量变量的问题不会太难。

    【讨论】:

    • 他们从不需要。他们只是有时通过减少打字来使事情变得更容易。对所有潜在成本来说并不是一个很大的好处。
    • @VinkoVrsalovic:我认为这种评估是见仁见智。在 PHP 中,我发现变量变量对于创建轻量级的朴素 MVC 框架有很大的好处。我没有为我的视图创建另一种模板语法,而是使用 PHP 作为它最初打算使用的模板语言。我确信我的决定有很多合理的批评,但它使我能够立即创建一个轻量级且非常强大的 MVC 框架。这对我很有用。
    • @Dinah 你说的是我的意思。它们不是必需的,它们可以很方便,因为它们一直是为您服务的。您当然可以(并且几乎同样容易)在 PHP 中创建一个 PHP 模板系统,而​​无需使用它们。
    • @VinkoVrsalovic:当你争论什么是“需要的”时,你正处于危险的境地。单独查看时,真正需要的语言功能或库组件很少。关于收益与潜在成本的问题,我认为我们应该同意不同意。
    猜你喜欢
    • 2011-04-08
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多