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