在c++中,可以
int fn()
{
static i = 0;
++i;
return i;
}
但是在c#中,要实现这样的功能,就只能在类中定义一个成员变量了,不然无法保存上次fn调用的i值class Fn
{
 int i;
 int fn()
 {
   ++i;
   return i;
 }
}

解决方案 »

  1.   

    不可以...静态成员本来就是非OO的,保留static仅仅是编程需要...而这种需求本身就是不需要的...在C#中,静态成员必须是类级的...
      

  2.   

    明确的告诉你,static不能用于方法中
      

  3.   

    int fn()
    {
    static i = 0;
    ++i;
    return i;
    }C++中这个I应该也在方法外有作为属性存在的定义吧?
    int i;
    int fn()
    {
    static i = 0;
    ++i;
    return i;
    }C#中也可以进行这种定义,不过是
    static int i;
    int fn()
    {
    i = 0;
    ++i;
    return i;
    }
      

  4.   

    滥用不滥用还得看使用者,编程风格差的C#程序,全部代码就一个类,所有变量看着好像都是成员变量,但事实上,所有函数也都是这个类的成员函数,导致一个什么情况?就是所有函数都可以用这些变量,这些成员变量就成为了事实上的全局变量。
    我觉得函数中的static变量挺好啊,本来这个变量就这个函数需要调用,干嘛非得搞成类的成员变量,导致整个类可见呢?
      

  5.   

    C#中类的实例才称为对象,方法(即你所说的函数)只是类的成员,而不是一个对象,它描述对象的一种行为。
    类的其他成员也都是为了描述这个对象而存在的。所以C#是完全面向对象的语言。
    C++不是完全面向对象的语言,它只是可以面向对象而已。所以C++中不面向对象的写法在C#中是肯定不存在的
      

  6.   

    方法也要是静态的,如果Fn类不是public就只能在同一命名空间下调用
    可以,要这样写,要爆错说你static不行
    class Fn
    {
     static int i;
     static int fn()
     {
       ++i;
       return i;
     }
    }调用:
      Fn.fn();
      

  7.   

    从技术层面上看static变量导致大量的线程不安全问题。从调用者的角度说,函数应该是无状态的(无记忆性),传进去什么,返回什么。而函数内部的static打破了调用者的预期。调用者根本无法从函数参数、函数名和返回值上直观看到这一点。除非他去看文档。尤其是当调用函数的情况发生改变,比如另一个开发者不知道,他增加了一次调用,那么原先的程序就有可能潜伏bug。从设计的角度看,那些坚持使用记忆函数设计的人,90%都可以找到避免这么用的解决办法。比如将记忆状态提升成参数,使用另一个类去维护等等。从未来看,函数式编程和异步编程会成为主流,而且这样的风格更具有可伸缩性(比如把程序部署在10个主机上,你每个程序的静态变量有意义么?)所以我觉得在设计的时候应该避免。
      

  8.   

    比如说吧,在Form的Paint事件处理中,我想显示一下Form运行以后,一共刷新了几次,如果在c++中,我只要在Paint处理函数中定义static变量i,然后DrawString (++i).tostring就行了,这个i其实只和这个Paint函数有关系,但是在c#中,我就必须要给Form定义一个成员变量,然后在Paint处理函数中自增并显示,然后其他Form的成员函数还都用不上这个i。
    按照你的说法,这个i和Paint的处理函数联系紧密,该怎么把他们封装起来呢?
      

  9.   

    按规范的设计来说,Paint处理函数里是不应该有这种++i代码的,paint里只有DrawXXX一类的代码,而逻辑都是由另外的方法决定的,确实就是需要有另外一个类变量。在XNA里就更明显了
    Update(GameTime gameTime)负责更新状态,但不负责更新画面
    Draw(GameTime gameTime)跟update 相反。Draw 负责更新画面 
      

  10.   

    不过你这个需求,Paint里,还是需要++i,但应该明确的是,这个i是Form运行以后刷新的次数,也就是说,这是一个Form的只读属性,而不是一个Paint的私有字段。事实上,如果你的程序可以手工刷新界面,而你又需要显示扣除手工刷新只有系统刷新的次数怎么办?i作为类变量,在手工刷新的地方去扣除很容易实现,但你这样就没办法了