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

浙公网安备 33010602011771号