【问题标题】:C# static - What does the definition on MSDN mean?C# 静态 - MSDN 上的定义是什么意思?
【发布时间】:2010-06-20 12:34:01
【问题描述】:

使用 static 修饰符声明一个 静态成员,属于 键入本身而不是特定的 对象。

???

我在定义变量public int abc 时遇到了这个静态关键字。当此变量的值在while 的括号内,或在if 的括号内,或在方法的括号内发生变化时,这些变化无效,没有反映,括号外不知道。所以只是一个命中试验。我将变量设为静态,所有问题都解决了。

但是为什么呢??

【问题讨论】:

  • 你有很多段落......不要经常按回车键;)阅读实际问题会很痛苦。
  • 对对象变量的更改在该对象中应该始终有效,无论您在该对象中传递什么类型的块。但是,如果您将该变量传递给另一个对象的另一个方法,则必须通过引用传递它,以便在该方法完成执行时可以访问。您还需要注意不要用同名的局部变量隐藏成员变量。

标签: c# variables static


【解决方案1】:

静态成员和非静态成员(非变量)之间的区别在于,静态成员在程序的整个运行时是唯一的(即只有一个静态成员实例),而非静态成员是关联的带有一个对象实例(即对应对象的每个实例都有一个成员实例)。这就是定义所说的内容。

这一切如何适用于您所写的关于未反映的更改的内容我不太确定 - 也许您应该发布相应的代码。

【讨论】:

    【解决方案2】:

    我没明白你的意思,但是
    静态变量是类级别的变量——它们不属于对象的实例,而是属于类本身。无需实例化任何实例即可使用和访问它们。
    另一方面,实例(非静态)变量属于实例本身。

    【讨论】:

      【解决方案3】:

      如果你有课:

      public class Car {
         public static readonly int Wheels = 4;
         public static int Count {get;set;}
         public string Make {get;set;}
         public string Model {get;set;}
         public int Year {get;set;}
      
         public Car() { Car.Count = Car.Count + 1; }
      
         public string SoundOff(){
             return String.Format("I am only 1 out of {0} car{1}", 
                    Car.Count, (Car.Count > 0 ? "s" : String.Empty));
         }
      }
      

      然后,每次创建汽车时,计数都会增加一。这是因为 Count 属性属于 Car 类,而不是您创建的任何对象。

      这也很有用,因为每辆车都可以知道Car.Count。所以,如果你创建了:

      Car sportster = new Car { 
         Make="Porsche", Model="Boxster", Year=2010  };
      sportster.SoundOff(); // I am only 1 out of 1 car
      

      您可以进行其他处理,所有对象都会知道 Count:

      Car hybrid = new Car { Make="Toyota", Model="Prius", Year=2010 };
      hybrid.SoundOff(); // I am only 1 out of 2 cars
      sportster.SoundOff(); // I am only 1 out of 2 cars
      

      所以,换句话说,当你想要某样东西时,你应该使用静态:

      • 可在类级别访问,以便所有对象都知道它(Car.Count 而不是 hybrid.Count
      • 代表类而不是对象(Car.Wheels 不会改变)

      还有其他使用静态的原因,例如实用程序类、扩展方法等。但这应该可以回答您关于 MSDN 措辞的问题。

      【讨论】:

      • 我为命名不佳的 SoundOff 方法道歉 :) 这是军事节奏,“声音关闭:1、2”......不是关闭汽车声音的方法(可用仅适用于混合动力车)。我通常反对狡猾的方法签名名称。
      【解决方案4】:

      这可能是因为您正在创建该类的多个副本,并且每个类对该成员都有自己的值。

      通过将其更改为静态,所有实例共享成员变量的同一副本。

      您观察到的行为可能表明您的whileif 表达式存在问题。如果您发布一些示例代码,我可能会提供进一步的帮助。

      【讨论】:

        猜你喜欢
        • 2017-03-18
        • 2011-06-25
        • 2011-01-18
        • 2011-06-02
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 2011-01-19
        相关资源
        最近更新 更多