静态/非静态类和方法

时间:2014-08-22 11:30:17

标签: c#

让我们假设我上了这堂课:

public class Utlities
{
   int Age;

   public static void DoSomething()
   {
       Age ++;
   }
}

我的问题:

  1. 有没有人 - 可以同时访问DoSomething()? - 假设是
  2. 如果1.的回答是YES,那么如果执行此方法的几个类的值会发生变化而没有任何问题吗?
  3. 类是非静态的,但方法是静态的,所以方法只能在特定时间访问一次吗?
  4. 如果其他类将访问该类的特定实例,如果其他类将访问类Utilities的特定实例,那么该类的实例是,DoSomething方法将在所有类Utilites或每个Utilities类的实例中共享/相同将访问不同的DoSomething方法?
  5. 让我们再看一个例子:

    public class Utlities
    
        {
           static int Age; // <------------------------------------
    
           public static void DoSomething()
           {
               Age ++;
           }
        }
    

    在这种情况下会如何?

    最后:

    public static class Utlities  //<-------------static now
    {
       static static int Age;
    
       public static void DoSomething()
       {
           Age ++;
       }
    }
    

    由于类是静态的,现在所有内部都必须是静态的 - 它是否意味着只有一个外部类可以同时访问它?

    最后一个问题,因为我想创建一些帮助类,其中我将拥有在我的程序中可能有用的常用方法,我应该使用静态方法的静态类或静态方法的非静态类 - 请在此解释。

3 个答案:

答案 0 :(得分:0)

将变量/ class / method声明为static不会改变可访问性。

例如,static方法属于类本身,同时非静态方法属于该类的每个对象。

如果您有静态变量

static int ageCounter;

持有此变量的类的所有对象都将看到相同的ageCounter

除此之外,您的问题是关于不同类对该静态方法的多次调用。如果在单个线程中发生这种情况,您根本不会遇到任何问题。如果不同的线程尝试处理相同的数据,则麻烦就会开始。

答案 1 :(得分:0)

除了您的第一个示例无法编译(无法从静态方法访问实例字段)之外,static不限制使用该方法。多个线程完全有可能同时访问该方法。

static意味着您可以在没有Utlities类实例的情况下访问该方法(或字段)。

你可以使用

Utlities.DoSomething();

而不是(甚至不编译)

var myutls = new Utlities();
myutls.DoSomething();  // <-- compile error: cannot be accessed with an instance reference

static class示例中,您甚至无法执行new Utlities()。编译器不会接受它(无法创建静态类的实例)。

小心使用类似static int Age的静态值:这意味着您的应用程序只能存储一个年龄值(这并不总是您想要的)

答案 2 :(得分:0)

(假设您的Age字段也是static。)

将变量/ class / method声明为static不会改变可访问性。

例如,static方法属于类本身,同时非静态方法属于该类的每个对象。

除此之外,您的问题是关于不同类对该静态方法的多次调用。如果在单个线程中发生这种情况,您根本不会遇到任何问题。如果不同的线程尝试处理相同的数据,则麻烦就会开始。

最后,您在static上提到了丢失的class修饰符。该修饰符仅用于防止类被实例化,并且当(并且仅当)类的所有成员都是静态时也可以使用。