类和结构体
类和结构体实际上都是创建对象的模版,每个对象都包含数据,并提供了处理和访问数据的方法。类定义了类的每个对象(称为实例)可以包含什么数据和功能。例如,如果一个类表示一个顾客,就可以定义字段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(); } } }