lua&C#学习整理

1.Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。

2.pairs 和 ipairs区别

   pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil

   ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出

3.结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据

4.C# 中的结构有以下特点:

  • 结构可带有方法、字段、索引、属性、运算符方法和事件。
  • 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义默认的构造函数。默认的构造函数是自动定义的,且不能被改变。
  • 与类不同,结构不能继承其他的结构或类。
  • 结构不能作为其他结构或类的基础结构。
  • 结构可实现一个或多个接口。
  • 结构成员不能指定为 abstract、virtual 或 protected。
  • 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
  • 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。

5.类和结构有以下几个基本的不同点:

  • 类是引用类型,结构是类型。
  • 结构不支持继承。
  • 结构不能声明默认的构造函数 

6.枚举是值数据类型

7.类的成员变量是对象的属性(从设计角度),且它们保持私有来实现封装。这些变量只能使用公共成员函数来访问

例如:

class Box
    {
       private double length;   // 长度
       public void setLength( double len )
       {
            length = len;
       }

8.类的构造函数:当创建类的新对象时执行。构造函数的名称与类的名称完全相同,它没有任何返回类型。

9.带参数的构造函数,可以在创建对象的同时给对象赋初始值

例如:

class Line
   {
      private double length;   // 线条的长度
      public Line(double len)  // 参数化构造函数
      {
         length = len;
      }

10.声明一个类成员为静态时,意味着无论有多少个类的对象被创建,只会有一个该静态成员的副本。

例如:

class StaticVar
    {
       public static int num;
        public void count()
        {
            num++;
        }
        public int getNum()
        {
            return num;
        }
    }
    class StaticTester
    {
        static void Main(string[] args)
        {
            StaticVar s1 = new StaticVar();
            StaticVar s2 = new StaticVar();
            s1.count();
            s1.count();
            s1.count();
            s2.count();
            s2.count();
            s2.count();         
            Console.WriteLine("s1 的变量 num: {0}", s1.getNum());
            Console.WriteLine("s2 的变量 num: {0}", s2.getNum());
        }
    }
View Code

11. static函数只能访问静态变量

12.C# 类不支持多重继承。接口可以实现多重继承

13.多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。

      C# 提供了两种技术来实现静态多态性。分别为:

  • 函数重载
  • 运算符重载

14.抽象类包含抽象方法,抽象方法可被派生类实现

例如:

abstract class Shape
   {
      public abstract int area();
   }

 class Rectangle:  Shape
   {
      private int length;
      private int width;
      public Rectangle( int a=0, int b=0)
      {
         length = a;
         width = b;
      }
      public override int area ()
      {                   
         return (width * length); 
      }
   }

15.抽象类的一些规则:

  • 您不能创建一个抽象类的实例。
  • 您不能在一个抽象类外部声明一个抽象方法。
  • 通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。

16.动态多态性是通过抽象类和虚方法实现的。当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法

例如:
class Shape 
   {
      protected int width, height;
      public Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      public virtual int area()
      {
         Console.WriteLine("父类的面积:");
         return 0;
      }
   }
   class Rectangle: Shape
   {
      public Rectangle( int a=0, int b=0): base(a, b)
      {

      }
      public override int area ()
      {
         Console.WriteLine("Rectangle 类的面积:");
         return (width * height); 
      }
   }
View Code

17.virtual 和 abstract

virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。

  •  1.virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不能实现。
  •  2.virtual可以被子类重写,而abstract必须被子类重写。
  •  3.如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。
  •  4.无法创建abstract类的实例,只能被继承无法实例化。

18.接口定义了属性、方法和事件,接口只包含了成员的声明,成员的定义是派生类的责任。

19.继承接口后,我们需要实现接口的方法, 方法名必须与接口定义的方法名一致。如果一个接口继承其他接口,那么实现类或结构就需要实现所有接口(该接口和继承的接口)的成员。

20.C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

例如:

using System;
delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }
      static void Main(string[] args)
      {
         // 创建委托实例
         NumberChanger nc1 = new NumberChanger(AddNum);
         // 使用委托对象调用方法
         nc1(25);//10+25
      }
   }
}
View Code

 21.事件

using System;
namespace SimpleEvent
{
  using System;
  /***********发布器类***********/
  public class EventTest
  {
    private int value;

    public delegate void NumManipulationHandler();


    public event NumManipulationHandler ChangeNum;

    protected virtual void OnNumChanged()
    {
      if ( ChangeNum != null )
      {
        ChangeNum(); /* 事件被触发 */
      }else {
        Console.WriteLine( "event not fire" );
        Console.ReadKey(); /* 回车继续 */
      }
    }
}
View Code
原文地址:https://www.cnblogs.com/shirln/p/8458945.html