0
点赞
收藏
分享

微信扫一扫

【2.程序构建基块】

窗外路过了谁 2022-04-27 阅读 41

文章目录


一、成员

  • 常量:与类相关联的常量值
  • 字段:与类关联的变量
  • 方法:类可执行的操作
  • 属性:与读取和写入类的已命名属性相关联的操作
  • 索引器:与将类实例编入索引(像处理数组一样)相关联的操作
  • 事件:类可以生成的通知
  • 运算符:类支持的转换和表达式运算符
  • 构造函数:初始化类实例或类本身所需的操作
  • 终结器:永久放弃类实例之前执行的操作
  • 类型:类声明的嵌套类型

二、辅助功能

每个类成员都有关联的可访问性,用于控制能够访问成员的程序文本区域。 可访问性有六种可能的形式。 以下
内容对访问修饰符进行了汇总。

  • public :访问不受限制。
  • private :访问仅限于此类。
  • protected :访问仅限于此类或派生自此类的类。
  • internal :仅可访问当前程序集( .exe 或 .dll )。
  • protected internal :仅可访问此类、从此类中派生的类,或者同一程序集中的类。
  • private protected :仅可访问此类或同一程序集中从此类中派生的类。

三、字段

字段 是与类或类实例相关联的变量。
使用静态修饰符声明的字段定义的是静态字段。 静态字段只指明一个存储位置。 无论创建多少个类实例,永远
只有一个静态字段副本。
不使用静态修饰符声明的字段定义的是实例字段。 每个类实例均包含相应类的所有实例字段的单独副本。

public class Color
{
public static readonly Color Black = new Color(0, 0, 0);
public static readonly Color White = new Color(255, 255, 255);
public static readonly Color Red = new Color(255, 0, 0);
public static readonly Color Green = new Color(0, 255, 0);
public static readonly Color Blue = new Color(0, 0, 255);
public byte R;
public byte G;
public byte B;
public Color(byte r, byte g, byte b)
{
R = r;
G = g;
B = b;
}
}

四、方法

  • 方法 是实现对象或类可执行的计算或操作的成员。 静态方法 是通过类进行访问。 实例方法 是通过类实例进行访问。
  • 方法可能包含一个参数列表,这些参数表示传递给方法的值或变量引用。 方法具有返回类型,它用于指定方法计算和返回的值的类型。 如果方法未返回值,则它的返回类型为 void 。
  • 方法可能也包含一组类型参数,必须在调用方法时指定类型自变量,这一点与类型一样。 与类型不同的是,通常可以根据方法调用的自变量推断出类型自变量,无需显式指定。
  • 在声明方法的类中,方法的 签名 必须是唯一的。 方法签名包含方法名称、类型参数数量及其参数的数量、修饰符和类型。 方法签名不包含返回类型。
  • 当方法主体是单个表达式时,可使用紧凑表达式格式定义方法,如下例中所示:

五、参数

  • 参数用于将值或变量引用传递给方法。 方法参数从调用方法时指定的 自变量 中获取其实际值。 有四类参数:值参数、引用参数、输出参数和参数数组
  • 值参数用于传递输入自变量。 值参数对应于局部变量,从为其传递的自变量中获取初始值。 修改值形参不会影响为其传递的实参。
  • 可以指定默认值,从而省略相应的自变量,这样值参数就是可选的。
  • 引用参数用于按引用传递自变量。 为引用参数传递的自变量必须是一个带有明确值的变量。 在方法执行期间,引用参数指出的存储位置与自变量相同
public class Program
    {
        static void Main(string[] args)
        {
            int i = 1, j = 2;
            // 调用的时候参数也要加上ref关键字
            Swap(ref i, ref j);
            Console.WriteLine($"{i}{j}");
            Console.ReadKey();
        }

        // 引用变量,要引用那一个呢你传给我我才知道
        static void Swap(ref int x, ref int y)
        {
            int temp = x;
            x = y;
            y = temp;
        }

    }
public class Program
    {
        static void Main(string[] args)
        {
            // 输出参数不用额外定义了,直接拿来用就是了
            Divide(10, 3, out int res, out int rem);
            Console.WriteLine($"{res},{rem}");
            Console.ReadKey();
        }

        // 函数中的局部变量函数一执行完毕就被释放
        // 所以用输出参数将数据传递出去
        static void Divide(int x, int y, out int result, out int remainder)
        {
            result = x / y;
            remainder = x % y;
        }

    }

六、静态和实例方法

七、虚方法、重写方法和抽象方法

  • 如果实例方法声明中有 virtual 修饰符,可以将实例方法称为“虚方法”。 如果没有 virtual 修饰符,可以将实例方法称为“非虚方法”
  • 可以在派生类中 重写 虚方法。 如果实例方法声明中有 override 修饰符,那么实例方法可以重写签名相同的继承虚方法。 虚方法声明引入了新方法。 重写方法声明通过提供现有继承的虚方法的新实现,专门针对该方法。
  • 抽象方法 是没有实现代码的虚方法。 抽象方法使用 abstract 修饰符进行声明,仅可在抽象类中使用。 必须在所有非抽象派生类中重写抽象方法。
  • demo
public class Program
    {
        static void Main(string[] args)
        {
            Expression e = new Operation(
                new VariableReference("x"),
                '*',
                new Operation(
                    new VariableReference("y"),
                    '+',
                    new Constant(2)
                )
            );
            Dictionary<string, object> vars = new Dictionary<string, object>();
            vars["x"] = 3;
            vars["y"] = 5;
            Console.WriteLine(e.Evaluate(vars));
        }
    }

    public abstract class Expression
    {
        public abstract double Evaluate(Dictionary<string, object> vars);
    }

    public class Constant : Expression
    {
        double _value;
        public Constant(double value)
        {
            _value = value;
        }

        public override double Evaluate(Dictionary<string, object> vars)
        {
            return _value;
        }
    }

    public class VariableReference : Expression
    {
        string _name;
        public VariableReference(string name)
        {
            _name = name;
        }

        public override double Evaluate(Dictionary<string, object> vars)
        {
            // vars[_name]不为空返回,为空抛出异常
            object value = vars[_name] ?? throw new Exception($"Unknown variable: {_name}");
            return Convert.ToDouble(value);
        }
    }

    public class Operation : Expression
    {
        Expression _left;
        char _op;
        Expression _right;
        public Operation(Expression left, char op, Expression right)
        {
            _left = left;
            _op = op;
            _right = right;
        }

        public override double Evaluate(Dictionary<string, object> vars)
        {
            // 递归如果Expression是Operation就会执行归递
            double x = _left.Evaluate(vars);
            double y = _right.Evaluate(vars);
            switch (_op)
            {
                case '+': return x + y;
                case '-': return x - y;
                case '*': return x * y;
                case '/': return x / y;
                default: throw new Exception("Unknown operator");
            }
        }
    }

八、方法重载

  • 借助方法 重载,同一类中可以有多个同名的方法,只要这些方法具有唯一签名即可。 编译如何调用重载的方法时,编译器使用 重载决策 来确定要调用的特定方法。 重载决策会查找与自变量匹配度最高的一种方法。 如果找不到任何最佳匹配项,则会报告错误。
举报

相关推荐

0 条评论