zoukankan      html  css  js  c++  java
  • 第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():用于复制对象,并返回对副本的一个引用(对于值类型,就是一个装箱的引用)。
  • 相关阅读:
    做好技术的量的累积,实现业绩的质的飞跃|专访宜信财富技术负责人刘宝剑
    深入理解MySQL索引
    程序的一生:从源程序到进程的辛苦历程
    Serializable详解(1):代码验证Java序列化与反序列化
    关于Java序列化的问题你真的会吗?
    Dubbo源码解析之SPI(一):扩展类的加载过程
    [C#] 命令总线模式
    C#构造函数在继承时必须要求与父类型构造函数入参相同怎么办?
    如何通过JavaScript构建Asp.net服务端控件
    Javascript iframe交互并兼容各种浏览器的解决方案
  • 原文地址:https://www.cnblogs.com/zhangjbravo/p/9358723.html
Copyright © 2011-2022 走看看