• 二、对象和类型(第二部分)


    类和结构体

    类和结构体实际上都是创建对象的模版,每个对象都包含数据,并提供了处理和访问数据的方法。类定义了类的每个对象(称为实例)可以包含什么数据和功能。例如,如果一个类表示一个顾客,就可以定义字段CustomerID、FirstName、LastName和Address,以包含该顾客的信息。还可以定义处理在这些字段中存储的数据的功能。接着,就可以实例化表示某个顾客的类的对象,为这个实例设置相关字段的值,并使用其功能。

     

    结构体与类的区别:

    它们在内存中的存储方式、访问方式(类是存储在堆(heap)上的引用类型,而结构是存储在栈(stack)上的值类型)不同。结构体不支持继承。较小的数据类型使用结构可提高性能。

     

    1.数据成员

      数据成员是包含类的数据---字段、常量、事件的成员。数据成员可以是静态数据。类成员总是实例成员,除非用static进行显示的声明。

      字段时与类相关的变量。

      常量与类的关联方式和变量与类的关联方式相同。

      事件是类的成员,在发生某些行为(如改变类的字段或属性,或者进行了某种形式的用户交互操作)时,它可以让对象通知调用方。客户可以包含所谓“时间处理程序”的代码来响应该时间。

    2.函数成员

      方法

      属性

      构造函数

      终结器(析构)

      运算符

      索引器

      1.给方法传递参数

    参数可以通过引用或值传递给方法。在变量通过引用传递给方法时,被调用的方法得到的就是这个比纳凉,更准确地说,是指向内存中变量的指针。所以在方法内部对变量进行的任何改变在方法退出后仍旧有效。而如果变量通过值传递给方法,被调用的方法得到的是变量的一个相同副本,也就是说,在方法退出后,对变量进行的修改会丢失。对于复杂的数据类型,按引用传递的效率更高,因为在按值传递时,必须复制大量的数据。

    在C#中,除非特别指定,所以的引用类型都通过引用传递,所有的值类型都通过值来传递。但是,在理解引用类型的含义时需注意。因为引用类型的变量只包含对象的引用,作为参数传递的正式这个引用,而不是对象本身,所以对底层对象的修改会保留下来。相反。值类型的变量包含的是实际数据,所以传递给方法的是数据本身的副本。

     2.ref参数

    可以迫使值参数通过引用传送给方法。为此,要使用ref关键字。如果把一个参数传递给方法,且这个方法的输入参数前带有ref关键字,则该方法对变量所做的任何改变都会影响原始对象的值。

     注:C#要求对传递给方法的参数进行初始化。

     3.out参数

    编译器使用out关键字来初始化。在方法的输入参数前面加上out关键字前缀,传递给该方法的变量可以不初始化。该变量通过引用传递,所以在从被调用的方法中返回时,对应方法对该变量进行的任何改变都会保留下来。在调用该方法时,还需要用到out关键字,与在定义该方法时一样。

     4.命名参数

    命名参数允许按任意顺序传递参数。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string firstName = "Dean-";
                string lastName = "McGRADY";
                string myName = MyName(firstName, lastName);
                Console.WriteLine(myName);
    
                string oneWord = "你好,";
                string twoWord = "朋友!";
    
                string words = MyName(_lastName : twoWord, _firstName : oneWord);
                Console.WriteLine(words);
    
                Console.ReadKey();
            }
    
            private static string MyName(string _firstName, string _lastName)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(_firstName);
                sb.Append(_lastName);
    
                return sb.ToString();
            }
        }
    }

    5.可选参数

    参数也是可选的。必须为可选参数提供默认值。可选参数还必须是方法定义的最后的参数。

    6.方法的重载(*)

    C#支持方法的重载------方法的几个版本有不同的签名(即:方法名相同,但参数的个数或类型不同)。为了重载方法,只需要声明同名但参数个数或类型不同的方法即可:

    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                int a = 1;
                int b = 9;
                int c = 10;
    
                int sub = SubMethod(a, b);
                Console.WriteLine(sub);
    
                sub = SubMethod(a, b, c);
                Console.WriteLine(sub);
    
                int age1 = 16;
                int age2 = 23;
    
                int age = AgeMethod(age1, age2);
                Console.WriteLine(age);
    
                string ageString1 = "16";
                string ageString2 = "23";
                string ageAll = AgeMethod(ageString1, ageString2);
                Console.WriteLine(ageAll);
    
                Console.ReadKey();
            }
    
            private static int SubMethod(int _oneNumber, int _twoNumber)
            {
                return _oneNumber + _twoNumber;
            }
    
            private static int SubMethod(int _oneNumber, int _twoNumber, int _threeNumber)
            {
                return _oneNumber + _twoNumber + _threeNumber;
            }
    
            private static int AgeMethod(int _oneNumber, int _twoNumber)
            {
                return _oneNumber + _twoNumber;
            }
    
            private static string AgeMethod(string _oneString, string _twoString)
            {
                int age1 = int.Parse(_oneString);
                int age2 = int.Parse(_twoString);
                return (age1 + age2).ToString();
            }
        }
    }

     

     

     

     

     

     

       

    Dean二十七
  • 相关阅读:
    原型模式
    哈希表原理
    Pow共识算法
    C++虚函数的工作原理
    TCP三次握手与四次分手
    TCP重置报文段及RST常见场景分析
    Ping、Traceroute工作原理
    ARP协议
    Rust生命周期bound用于泛型的引用
    Linux下core dump
  • 原文地址:https://www.cnblogs.com/Dean27/p/6030691.html
Copyright © 2020-2023  润新知