zoukankan      html  css  js  c++  java
  • static(C# 参考)

    使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。

    常数或者类型声明隐式地是静态成员。

    • 不能通过实例引用静态成员。然而,可以通过类型名称引用它。例如,请考虑以下类:

       
      public class MyBaseC 
      {
          public struct MyStruct 
          {
              public static int x = 100;
          }
      }
      

      若要引用静态成员 x,请使用完全限定名(除非可从相同范围访问):

       
      MyBaseC.MyStruct.x
      
    • 尽管类的实例包含该类所有实例字段的单独副本,但每个静态字段只有一个副本。

    • 不可以使用 this 来引用静态方法或属性访问器。

    • 如果对类应用 static 关键字,则该类的所有成员都必须是静态的。

    • 类(包括静态类)可以有静态构造函数。在程序开始和实例化类之间的某个时刻调用静态构造函数。

      Note注意

      static 关键字在使用上比在 C++ 中有更多的限制。若要与 C++ 关键字比较,请参见 static

    为了说明静态成员,请看一个表示公司雇员的类。假设该类包含一种对雇员计数的方法和一个存储雇员数的字段。该方法和字段都不属于任何实例雇员,而是属于公司类。因此,应该将它们声明为此类的静态成员。

    该示例读取新雇员的名称和 ID,逐个增加雇员计数器并显示新雇员的有关信息以及新的雇员数。为简单起见,该程序从键盘读取当前的雇员数。在实际的应用中,应从文件读取此信息。

     
    // cs_static_keyword.cs
    using System;
    
    public class Employee
    {
        public string id;
        public string name;
    
        public Employee()
        {
        }
    
        public Employee(string name, string id)
        {
            this.name = name;
            this.id = id;
        }
    
        public static int employeeCounter;
    
        public static int AddEmployee()
        {
            return ++employeeCounter;
        }
    }
    
    class MainClass : Employee
    {
        static void Main()
        {
            Console.Write("Enter the employee's name: ");
            string name = Console.ReadLine();
            Console.Write("Enter the employee's ID: ");
            string id = Console.ReadLine();
    
            // Create and configure the employee object:
            Employee e = new Employee(name, id);
            Console.Write("Enter the current number of employees: ");
            string n = Console.ReadLine();
            Employee.employeeCounter = Int32.Parse(n);
            Employee.AddEmployee();
    
            // Display the new information:
            Console.WriteLine("Name: {0}", e.name);
            Console.WriteLine("ID:   {0}", e.id);
            Console.WriteLine("New Number of Employees: {0}",
                          Employee.employeeCounter);
        }
    }
    

    输入

    Tara Strahan
    AF643G
    15

    示例输出

    Enter the employee's name: Tara Strahan
    Enter the employee's ID: AF643G
    Enter the current number of employees: 15
    Name: Tara Strahan
    ID:   AF643G
    New Number of Employees: 16

    此示例显示:虽然可以用另一个尚未声明的静态字段实例化一个静态字段,但只要给静态字段显式赋值后,结果才是确定的。

     
    // cs_static_keyword_2.cs
    using System;
    class Test
    {
       static int x = y;
       static int y = 5;
    
       static void Main()
       {
          Console.WriteLine(Test.x);
          Console.WriteLine(Test.y);
    
          Test.x = 99;
          Console.WriteLine(Test.x);
       }
    }
    

    输出

    0
    5
    99
  • 相关阅读:
    flume sink两种类型 file_rool 自定义sing com.mycomm.MySink even if there is only one event, the event has to be sent in an array
    为什么引入进程20年后,又引入线程?
    As of Flume 1.4.0, Avro is the default RPC protocol.
    Google Protocol Buffer 的使用和原理
    Log4j 2
    统一日志 统一订单
    网站行为跟踪 Website Activity Tracking Log Aggregation 日志聚合 In comparison to log-centric systems like Scribe or Flume
    Percolator
    友盟吴磊:移动大数据平台的架构、实践与数据增值
    Twitter的RPC框架Finagle简介
  • 原文地址:https://www.cnblogs.com/macavalier/p/3101540.html
Copyright © 2011-2022 走看看