第3章 对象和类型

1. 类和结构

2. 类

类包括成员,成员可以是静态或实例成员。
静态成员属于类;实例成员属于对象。
静态字段的值对每个对象都是相同的;每个对象的实例字段都可以有不同的值。

成员种类包括字段,常量,方法,属性,构造函数,索引器(允许对象用访问数组的方式访问),运算符,事件,析构函数,类型(类可以包含内部类)。

 

3. 结构

 4.按值和按引用传递参数

  • 按值传递:方法中的变量a得到堆栈中变量a1的一个副本。在方法最后修改、销毁副本a,a1的内容从不改变。
  • 按引用传递:方法中的变量a把堆上的同一个对象引用为变量a1。当方法中修改a,则a1内容改变,因为它们是同一个对象。

 (1) ref参数

  • 通过引用传递结构:如果A是结构类型,添加ref参数引用传递变量;在调用端也添加ref参数。
  • 类类型使用ref:传递对引用的引用(在C++术语中,即一个指向指针的指针),允许分配一个新对象。
  • 变量必须在传递给方法之前初始化。

(2) out参数

      

5.可空类型

前提:引用类型的变量可以为空null,而值类型的变量不能。因此C#采用可空类型(类型后加?)定义可以为空的值类型。

类型与可空类型的转换:使用可空类型的HasValue和Value属性。

  • HasValue返回true或false,取决于可空类型是否有值。
  • Value返回底层的值。 
1 int? x1 = 1;          //可空类型
2 int  x2 = x1.HasValue ? x1.Value : -1;
3 int  x3 = x1 ?? -1;   //合并操作符

 6.枚举:是值类型,包含一组命名的常量。

  • enum默认类型是int,可改为其他整型类型(byte、short、int、long和无符号变量);从0开始递增,可以改为其他值。
  • 使用强制类型转换,将数字改为枚举,把枚举改为数字。
  • 使用Enum.TryParse<T>()泛型方式获得枚举值
  • 使用Enum.GetNames(typeof(枚举))遍历所有枚举名
  • 使用Enum.GetValues(typeof(枚举))遍历所有枚举值
  • 可以把多个选项分配给一个变量。
    • 要求常量值为不同的位,可采用十六进制0x指定不同的位。
    • 使用Flags属性,即“指示可以将枚举作为位域(即一组标志)处理”
    // 结合单个位来包括多个值
    [Flags]
    public enum DaysOfWeek
    {
        Monday = 0x1,
        Tuesday = 0x2,
        Wednesday = 0x4,
        Thursday = 0x8,
        Friday = 0x10,
        Saturday = 0x20,
        Sunday = 0x40,
        Weekend = Saturday | Sunday,
        Workday = 0x1f,
        AllWeek = Workday | Weekend
    }

    // 可以使用逻辑或运算符为一个变量指定多个值
    DaysOfWeek mondayAndWednesday = DaysOfWeek.Monday | DaysOfWeek.Wednesday;
    WriteLine(mondayAndWednesday);
    DaysOfWeek weekend = DaysOfWeek.Saturday | DaysOfWeek.Sunday;
    WriteLine(weekend);
    DaysOfWeek workday = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday | DaysOfWeek.Thursday | DaysOfWeek.Friday;
    WriteLine(workday);

 运行结果为:

 

7. 部分类

  • partial关键字允许把类、结构、方法或接口放在多个文件中。
  • partial放在class、struct或interface 关键字的前面
  • 编译时会将所有部分类合并为一个类,属性、XML注释、接口、泛型类型的参数属性和成员均会合并。
  • 部分类中可以包括部分方法
    • 部分方法可以在部分类中进行声明,不需要实现。
    • 部分方法的实现,可以放在部分类的任何其他地方。
    • 部分方法未实现,编译器将删除这个方法的调用。
    • 部分方法必须是void

8. 扩展方法:给对象添加功能的一种方法之一,在不能使用继承时可采用(如类是密封的)

  • 必须是静态方法,它是类的一部分,但是没有放在类的源代码中
  • 使用this关键字和第一个参数来扩展,第一个参数定义了扩展的类型
// 扩展方法:统计字符串单词个数
public static class StringExtensions
{
      public static int GetWordCount(this string s) =>
                s.Split().Length;
            
}

// 使用扩展方法
string fox = "the quick brown fox jumped over the lazy dogs down 9876543210 times";
int wordCount = fox.GetWordCount();
WriteLine($"{wordCount} words");

 9. Object类:提供公有的和受保护的成员方法

  • ToString()
  • GetHashCode():若对象放在名为映射(也称为散列表或字典)的数据结构中,可使用该方法确定把对象放在结构的什么地方。
  • Equals()(两个版本)和ReferenceEquals()
  • Finalize():在引用对象作为垃圾被回收以清理资源时调用。对未托管资源的引用被删除时使用,一般要重写。
  • GetType():提供对象成员所属类的基本类型、方法、属性等,以及.NET的反射技术的入口点。
  • MemberwiseClone():用于复制对象,并返回对副本的一个引用(对于值类型,就是一个装箱的引用)。

猜你喜欢

转载自www.cnblogs.com/zhangjbravo/p/9358723.html
今日推荐