为什么不C#有像C局部静态变量? 我错过!
Answer 1:
您可以使用委托模拟它...这里是我的示例代码:
public Func<int> Increment()
{
int num = 0;
return new Func<int>(() =>
{
return num++;
});
}
你可以这样调用:
Func<int> inc = Increment();
inc();
Answer 2:
因为他们搞砸了,并留下了一个非常有用的功能,以满足自己。
你应该如何代码,什么是聪明,你应该重新考虑你的生活方式的所有参数,是浮夸的防守借口。
当然,C#是纯粹的,和whatchamacallit为主。 这就是为什么他们自动生成lambda函数持续本地人。 这一切都如此复杂。 我觉得很愚蠢。
环路范围静电在很多情况下有用和重要。
总之,真正的答案,就是你要的本地静态迁入类范围,并与C#类的命名空间污染生活。 把你投诉到市政府。
Answer 3:
状态通常是一种类型的 ,方法的不一部分的物体或零件的一部分。 (异常被捕获变量,当然)。
如果你想有一个本地静态变量的等价物,可以创建一个实例变量或静态变量 - 并考虑方法本身是否真的应该是不同的类型与状态的一部分。
Answer 4:
在MSDN博客条目为什么不支持C#静态方法变量? 涉及在原岗位要求的具体问题:
原因有两个C#不具备此功能。
首先,可以通过具有类级静态,并添加方法静将需要增加的复杂性得到几乎相同的效果。
二,方法级静是造成问题时,代码被称为反复或多个线程有些声名狼藉,而且自定义的方法,这是很难找到的定义。
[作者: 埃里克Gunnerson]
Answer 5:
我几乎没有熟悉C,因为我的C#,但我相信你可以做到一切你可以用局部静态,用类级别静态的,其仅用于一个方法。 显然,这带有一些语法变化,但我相信你可以得到你需要的任何功能。
此外,埃里克利珀回答类似这样的问题,他的博客了很多。 在一般情况回答这种方式 :“我问:‘为什么不C#实现功能X’的所有时间的回答总是一样的:?因为从来没有人设计的,规定,实施,测试,文档和装运该功能。 “ 从本质上讲他的答案一般归结为,它的成本钱添加任何功能,因此,因为他们还没有出来的成本效益分析的积极面很多潜在的功能都没有实现。
Answer 6:
所以,你想在你的方法为使用静态局部变量? 恭喜! 你让朝着成为一个真正的程序员又迈进了一步。
不要听所有的人都告诉你,静态当地人不“干净”,它们阻碍“可读性”,并可能导致微妙和难以找到“漏洞”。 废话! 他们只是说,因为他们是想当程序员! 他们中的很多都甚至可能玩弄周围在他们的空闲时间深奥的函数式编程语言。 你相信吗? 什么是一堆时髦的!
真正的程序员拥抱范式我喜欢叫SDD - 的 IDE效应d里文d ESIGN。 下面是它的一些最重要的法律:
千万不可预测的! 千万不要从方法返回同样的事情两次 - 即使它被称为具有完全相同的参数!
螺丝纯度-让我们脏! 国家,自然,渴望改变,因为它是一个在polyamorous endofunctors类别贪得无厌的独异 ,即它喜欢用尽可能多的合作者地被感动。 千万不要错过机会做到这一点的青睐!
间中的副作用驱动的方式用于编码的工具,当然,静态本地变量。 然而,当你注意到,C#不支持他们。 为什么? 因为过去二十年来在微软已经通过有利于对灵活性和可维护性控制所谓的清洁打码机渗透 。 你甚至可以记住你已经看到了我们心爱的蓝色屏幕是什么时候? 现在猜是谁的错!
但是,不要害怕! 房地产开发商没有从那些可怜的设计决策受到影响。 正如已经提到之前有可能有局部变量,是一种静态的,其中lambda表达式的帮助。
然而,所提供的解决方案是不能令人十分满意。 使用以前的答案我们兼容几乎SDD-代码看起来是这样的:
var inc = Increment();
var zero = inc();
var one = inc();
要么
var zero = Increment()();
但是,这只是愚蠢。 即使是一个崇拜者开发人员可以看到, Increment()
是不正常的方法,将得到可疑。 一个真正的程序员,在另一方面,可以使其更加SDD样。 他或她知道,我们可以给它的类型做一个属性或字段看起来像一个方法Func<T>
我们只需要通过执行拉姆达,反过来初始化计数器并返回另一个拉姆达递增捕获计数器进行初始化!
这是正确的SDD代码:
public Func<int> Increment = new Func<Func<int>>(() =>
{
var num = 0;
return () => num++;
}).Invoke();
(你觉得上面还挺看起来像一个IIFE ?是的,你是对的,你应该为自己感到羞耻。)
现在每次你调用Increment()
将返回不同的东西 :
var zero = Increment();
var one = Increment();
当然,你这样的也可以使计数器生存的实例的生命周期 。
这会让他们想当程序员!
Answer 7:
C#是一个面向组件的语言和不具有的变量的概念的类或局部方法的范围以外。 方法中的变量不能声明静态或者,你可能习惯于在C.做但是,你总是可以使用一个类的静态变量作为替代品。
作为一般的做法,通常有办法解决在C#编程的问题,而不诉诸使用方法级静。 国家通常是你应该设计成类和类型,而不是方法。
Answer 8:
从逻辑上讲,是的。 这将是相同仅在一个方法中使用的类级静态成员。 然而,一个方法级静态成员将多个封装。 如果存储在一个部件中的数据只是为了通过一个方法被使用,它应该只由单一的方法访问。
但是,你可以通过创建一个嵌套类实现几乎完全在C#中相同的效果。
Answer 9:
因为静态局部变量绑法,该方法的所有实例之间共享。
我不得不纠正自己,谁想到它是每个使用该方法的类实例的独特其他程序员。
但是,如果你把它一个静态类或类的静态实例,它的语法清楚是否有每个集装箱类的实例,或者一个实例都没有。
如果不使用这些,它变得更容易重构后为好。
Answer 10:
我认为本地静态的想法是很容易通过创建公共静态字段的类来解决。 很少逻辑变化不这么认为吗?
如果你认为这将是一个大的逻辑变化,我很想听听如何。
class MyClass
{
public static float MaxDepthInches = 3;
private void PickNose()
{
if (CurrentFingerDepth < MyClass.MaxDepthInches)
{
CurrentFingerDepth++;
}
}
}
Answer 11:
您可以使用嵌套类作为一种解决方法。 由于C#是限制静态变量的类范围,你可以使用嵌套类的范围。
例如:
public class Foo {
public int Increment() {
return IncrementInternal.Increment();
}
private static class IncrementInternal {
private static int counter = 0;
public static int Increment() {
return counter++;
}
}
}
这里Foo
支持Increment
的方法,但其支持它由私有嵌套类IncrementInternal
包含静态变量作为成员。 当然还有, counter
不在的情况下(其他方式)可见Foo
。
顺便说一句,如果你想访问Foo
内上下文(其他成员和方法) IncrementInternal.Increment
,你可以通过this
作为参数传递给IncrementInternal.Increment
当你调用它Foo
。
为了保持范围尽可能小,我建议创建每个这样方法的嵌套类。 而且因为它可能不是那么普遍,嵌套类的数量将保持足够小,以维护它。
我觉得它比匿名函数或IIFE清洁。
你可以看到现场演示在这里 。
Answer 12:
我看不出有任何额外的好处本地静态,如果您把类单一用途和小,没有与全局静态污染少的问题,因为反对者喜欢抱怨。 不过这里只是一个其他选择。
using System;
using System.Collections;
public class Program
{
delegate bool DoWork();
public static void Main()
{
DoWork work = Foo().GetEnumerator().MoveNext;
work();
work();
work();
}
public static IEnumerable Foo()
{
int static_x = 10;
/*
do some other static stuff....
*/
main:
//repetative housework
Console.WriteLine(static_x);
static_x++;
yield return true;
goto main;
}
}
Answer 13:
如果你能想象某种利珀特/法恩斯沃思混合实体宣布好消息大家好! ,C#6.0允许using static
声明。 这有效地允许您导入静态类的方法(和,看来,属性和成员以及)到全球范围。
总之,你可以这样做:
using NUnit.Framework;
using static Fizz.Buzz;
class Program
{
[Test]
public void Main()
{
Method();
int z = Z;
object y = Y;
Y = new object();
}
}
namespace Fizz
{
class Buzz
{
public static void Method()
{
}
public static int Z;
public static object Y { get; set; }
}
}
虽然这仅仅是在C#6.0可用的,从我的理解所产生的组件应与以前的.NET平台(纠正我,如果我错了)兼容。