【问题标题】:Is there a C# equivalent to Delphi's assignable const?是否有与 Delphi 的可分配 const 等效的 C#?
【发布时间】:2017-05-01 01:05:42
【问题描述】:

在 Delphi 中,您可以在方法中声明一个常量并在同一方法中为其赋值。这个想法是,下次您使用此方法时,const 仍将具有您上次分配的相同值。

在 Delphi 中看起来像这样:
(我这里没有 Delphi,所以它未经测试,对此感到抱歉,但这足以证明我的意思)

procedure Form1.test;
const
  AssignableConst: Integer = 0;
begin
  ShowMessage(AssignableConst);
  inc(AssignableConst);
end;

每次调用过程测试时,消息框都会显示最后一个值 + 1

这个例子完全没用,我知道它只是为了展示一个可赋值的 const 在 Delphi 中是如何工作的。

在 c# 中有没有等价物?
我不想要一个涉及类中私有变量的解决方案,它必须留在方法中。

我的问题是关于范围的。没有其他的。我不在乎值是对象状态的一部分。那不重要。重要的是我需要一个只能从方法范围访问的变量,其他任何地方都无法访问。
在 Delphi 中,这可以通过使用可分配的 const 来完成,那么如何在 C# 中做到这一点?

【问题讨论】:

  • “我不想要一个涉及类中私有变量的解决方案,它必须留在方法中。”为什么?隐藏持久状态听起来像是一个可疑的想法。
  • 长话短说 - 这是一个不错的功能,但它不受支持。
  • 实际上,您的 Delphi const 是每个应用程序的全局变量,而不是实例类。您的示例不使用类实例。
  • 本地可写 const 对于每个应用程序都是全局的,即使在类实例中使用时也是如此,并且在实例之间共享。你到底想达到什么目的?
  • @CodesInChaos:Delphi 的“可写常量”相当于 C 和 C++ 中的静态局部变量。没有错。它具有方法的范围,而不是类的范围。这有它的优势,对其他人“隐藏”它并没有错。

标签: c# scope


【解决方案1】:

我不想要在类中涉及私有变量的解决方案,它必须留在方法中。

但是值是对象(或类型,对于静态方法)状态的一部分——所以它是对象中声明的字段是有意义的。

在 C# 中没有与此等效的功能。您能做的最好的事情是拥有一个私有变量并记录它只能通过特定方法使用。 (如果你真的愿意,你可以为此编写基于 Roslyn 的测试。)

【讨论】:

  • 那么也许你应该在它的单独类中提取方法
  • @GuidoG:它回答了“C# 中是否有类似的问题?” - 答案是否定的。它解释了为什么没有,以及为什么“解决方法”是完全合理的。你没有解释为什么你认为声明必须在方法中。
  • @GuidoG:每个实例状态和每个类型状态之间的区别非常很重要。您对 CodesInChaos 问题的回答非常清楚 - 如果您不想要每个实例状态,您不应该说“并且每次在该方法所属的对象的同一实例中调用该方法时,它都不会被重置” . 可能不关心区别,但 Stack Overflow 的重点是创建一个高质量问题和答案的存储库 - 如果你说你的原始代码在实际上它做了其他事情。
  • @GuidoG:您对问题的第五条评论指出您希望每个实例状态。您稍后会说(在此之上有两个 cmets)您 想要每个实例状态。从根本上说,您似乎完全是为了获得您非常具体的要求的答案,而不考虑该问题的未来读者。您已经收到了答案:“您不能在 C# 中执行此操作。”我觉得没什么好说的了,真的。
  • @GuidoG:我完成了。你很粗鲁,忽视了网站的目的,忽视了你已经得到了问题答案的事实。
【解决方案2】:

你能得到的最接近的是:

class MyClass
{
    static Action CreateCounter()
    {
        int counter = 0;
        return () => {
            Show(counter);
            counter++;
        };
    }

    Action showAndIncrementCounter = CreateCounter();

    public ShowAndIncrementCounter()
    {
        showAndIncrementCounter();
    }
}

但我仍然推荐使用计数器的实例字段而不是从方法外部访问它的简单解决方案。

【讨论】:

  • 在我的示例中,我总是将值增加 1 这只是我的应用程序中的一个示例,我必须能够在方法内为其分配任何值。
  • @GuidoG 所以?您可以以与更改示例完全相同的方式更改我的示例。
  • 是的,我现在看到了,但我同意使用实例字段是解决我的问题的更好方法
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 2021-04-30
  • 2017-01-01
  • 2023-03-30
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多