02010803 类和继承03-静态类、扩展方法、命名约定

02010803 类和继承03-静态类、扩展方法、命名约定

1. 静态类

  • 静态类中所有成员都是静态的。静态类用于存放不受实例数据影响的数据和函数。
  • 静态类的一个常见用途是创建一个包含一组数学方法和值的科学库。
  • 关于静态类的重要事项如下。
    • 类本身标记为static。
    • 类的所有成员必须是静态的。
    • 类可以有一个静态构造函数,但不能有实例构造函数,因为不能创建静态类的实例。
// 静态类示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo01
{
    public static class MyMath
    {
        public static float PI = 3.14f;
        public static bool IsOdd(int x)
        {
            return x % 2 == 1; // 表示奇数
        }
        public static int Time2(int x)
        {
            return 2 * x;
        }
    }
    class Program
    {
        static void Main()
        {
            int val = 3;
            Console.WriteLine($"{val} is odd is {MyMath.IsOdd(val)}");
            Console.WriteLine($"{val} * 2 = {MyMath.Time2(val)}");

            Console.ReadLine();
        }
    }
}

控制台输出:
3 is odd is True
3 * 2 = 6

2. 扩展方法

  • 在迄今为止的内容中,看到的每一个方法都和声明它的类关联。拓展方法特性扩展了这个边界,允许编写的方法和声明它的类之外的类关联。
  • 在实际开发中,扩展方法是一个特别有用的工具,几乎整个LINQ库都是通过扩展方法来实现的。(LINQ在后续章节中学习)
2.1 修改类为类增加方法实现求平均值
// 为类MyData增加Average方法来实现求平均值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo01
{
    class MyData
    {
        private double D1;
        private double D2;
        private double D3;

        public MyData(double d1, double d2, double d3)
        {
            D1 = d1;
            D2 = d2;
            D3 = d3;
        }

        public double Sum()
        {
            return D1 + D2 + D3;
        }

        // @1 如果要增加三个数平均值的功能,增加一个Average()方法
        public double Average()
        {
            return Sum() / 3;
        }
    }

    class Program
    {
        static void Main()
        {
            MyData md = new MyData(5, 6, 10);
            Console.WriteLine($"Sum: {md.Sum()}");
            Console.WriteLine($"Average: {md.Average()}");

            Console.ReadLine();
        }
    }
}

控制台输出:
Average: 20

说明:上述写法是在有源代码,并且可以修改MyDate类的情况下,在@1处为MyDate类增加新的方法Average。
2.2 为非密封类派生一个类来实现求平均值
// 不修改类MyData自身,通过派生类来实现求平均值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo01
{
    class MyData
    {
        public double D1;
        public double D2;
        public double D3;

        public MyData(double d1, double d2, double d3)
        {
            D1 = d1;
            D2 = d2;
            D3 = d3;
        }

        public double Sum()
        {
            return D1 + D2 + D3;
        }
    }

    // @2 使用派生类
    class MyDerivedData : MyData
    {
        public MyDerivedData(double d1, double d2, double d3) : base(d1, d2, d3)
        {
            D1 = d1;
            D2 = d2;
            D3 = d3;
        }
        
        public double Average()
        {
            return Sum() / 3;
        }
    }

    class Program
    {
        static void Main()
        {
            MyDerivedData md = new MyDerivedData(5, 6, 10);
            Console.WriteLine($"Sum: {md.Sum()}");
            Console.WriteLine($"Average: {md.Average()}");

            Console.ReadLine();
        }
    }
}

控制台输出:
Sum: 21
Average: 7
2.3 使用静态类,将密封类的实例传入静态类来实现求平均值
// 不修改密封类MyData自身,将MyData的实例传入静态类来实现求平均值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo01
{
    sealed class MyData
    {
        public double D1;
        public double D2;
        public double D3;

        public MyData(double d1, double d2, double d3)
        {
            D1 = d1;
            D2 = d2;
            D3 = d3;
        }

        public double Sum()
        {
            return D1 + D2 + D3;
        }
    }

    // @3 使用静态类
    static class ExtendMyData
    {
        public static double Average(MyData md)
        {
            return md.Sum() / 3;
        }  
    }

    class Program
    {
        static void Main()
        {
            MyData md = new MyData(5, 6, 10);
            Console.WriteLine($"Sum: {md.Sum()}");
            Console.WriteLine($"Average: {ExtendMyData.Average(md)}");

            Console.ReadLine();
        }
    }
}

控制台输出:
Sum: 21
Average: 7
2.4 在密封类的实例自身上调用静态类的Average方法来求平均值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo01
{
    sealed class MyData
    {
        public double D1;
        public double D2;
        public double D3;

        public MyData(double d1, double d2, double d3)
        {
            D1 = d1;
            D2 = d2;
            D3 = d3;
        }

        public double Sum()
        {
            return D1 + D2 + D3;
        }
    }

    // @4 使用静态类
    static class ExtendMyData
    {
        public static double Average(this MyData md) // @5 使用this关键字
        {
            return md.Sum() / 3;
        }
    }

    class Program
    {
        static void Main()
        {
            MyData md = new MyData(5, 6, 10);
            Console.WriteLine($"Sum: {md.Sum()}"); // 调用MyData类自带的方法
            Console.WriteLine($"Average: {md.Average()}"); // 调用MyData类的扩展方法。

            Console.ReadLine();
        }
    }
}

说明:
1. 在@5处使用this关键字添加到静态类的静态方法的第一个参数上,把该方法从类ExtendMyData的常规方法改变为类MyData的扩展方法。
2. 此时ExtendMyData必须是公有的和静态的。
2.5 扩展方法使用注意事项
  • 声明扩展方法的类必须声明为static。
  • 扩展方法本身必须声明为static。
  • 扩展方法必须包含关键字this作为它的第一个参数类型,并且后面跟着它扩展的类的名称。

3. 命名约定

风格名称 描述 推荐使用 示例
Pascal大小写 标识符中每个单词的首字母大写 用于类型名称和类中对外可见成员的名称。设计的名称包括:类、方法、命名空间、属性和公有字段。 MyClass
Camel大小写 标识符中每个单词的首字母大写,第一个单词除外 用于局部变量的名称,方法声明的形参的命名 myInt
下划线加Camel大小写 以下划线开头的Camel大小写标识符 用于私有和受保护的字段(*) __myField
  • *注意,微软官方推荐:对于私有和受保护的字段任然采用Camel大小写,而不添加"__"。

结尾

书籍:C#图解教程

著:【美】丹尼尔 · 索利斯;卡尔 · 施罗坦博尔

译:窦衍森;姚琪琳

ISBN:978-7-115-51918-4

版次:第5版

发行:人民邮电出版社

※敬请购买正版书籍,侵删请联系85863947@qq.com※

※本文章为看书或查阅资料而总结的笔记,仅供参考,如有错误请留言指正,谢谢!※

posted @ 2025-08-11 20:21  qinway  阅读(2)  评论(0)    收藏  举报