3.2 类和组织
类与组织的辨别是它们在内存中的存储体式格局、接见体式格局(类似存储在堆上的援用范例,而组织是存储在栈上的值范例)和它们的一些特性。
语法上,类与组织异常类似,重要辨别是组织运用关键字 struct 替代 class 来声明。
3.3 类成员
3.3.1 数据成员
数据成员是包含类数据—字段、常量和事宜的成员。
3.3.2 函数成员
函数成员供应了操纵类中数据的某些功用,包含要领、属性、组织函数和析构函数(闭幕器)、运算符以及索引器。
要领
ref 和 out 的辨别:
ref 在通报之前必需已被初始化,out 则不请求。
ref 的本质是将值范例举行援用通报,而 out 是为了增添返回值。
定名参数:在通报参数的过程当中能够指定其名字,花样为 MethodName (ParameterName : Value )
Params 关键字 : 必需在要领参数的最后面。
要领的重载:不能仅在返回范例上有辨别,不能仅依据声明 ref 、 out 或 params 之间辨别。
属性
观点:属性是一个或一对要领,在客户端代码看来,它(们)是一个字段。
get接见器不带任何参数,且返回属性声明的范例。
set接见器带一个value参数,其范例与声明的范例雷同。
属性的接见修饰符:在get和set接见器中,必需有一个具有属性的接见级别。
组织函数
声明组织体式格局就是声明一个与包含的类同名的要领,但该要领没有返回值。
假如供应了带参数的组织函数,编译器就不会自动供应默许的组织函数。
(1)静态组织函数
编写静态组织函数的缘由:类中有一些静态字段或属性,需要在第一次运用类之前,从外部源中初始化这些字段和属性。
.NET运行库没有确保什么时刻去实行静态组织函数,所以不应该请求在某个特定时刻实行静态组织函数中的代码。但能够确保的是,它在一切援用前只会挪用一次。
无参组织函数能够与静态组织函数在同一个类中定义。
(2)从组织函数中挪用别的组织函数
base 与 this 关键字
3.3.3 只读字段
readonly 与 const 的辨别:
readonly 能够在组织函数中赋值,而 const 那里都不能赋值,只能初始化。
3.4 匿名范例
var 和 new 关键字一同运用能够建立匿名范例,比方。
static void Main(string[] args) 2 3 4 { 5 6 7 var test = new { Name = "Earl Jones", Age = 17 }; 8 9 10 Console.WriteLine(test.ToString()); 11 12 13 Console.WriteLine(test.Name.GetType().ToString()); 14 15 16 Console.WriteLine(test.Age.GetType().ToString()); 17 18 19 Console.ReadKey(); 20 21 22 } 复制代码
输出效果以下:
我们并不知道这个对象的范例,编译器为其“捏造”了一个称号,然则只需编译器才运用它,我们不能也不应该运用新对象上的任何范例反射,由于这不会获得一致的效果。
3.5 组织
组织是值范例,不是援用范例,其生命周期的限定与简朴的数据范例一样,通报组织时能够运用ref关键字来削减机能消耗。
组织平常用于表达简朴的组合数据。
组织不支持继续,但一切组织都继续于System.ValueType,而System.ValueType又继续于System.Object。
运用组织,能够指定字段怎样在内存中规划。
关于组织,编译器老是供应默许无参组织函数,它不许可被替代,也不能在组织中为字段供应初始值,必需在组织函数中供应。
组织中的公有字段为可接受的编程体式格局。
在定义组织时运用new关键字只不过是用于挪用其组织函数,变量的声明实际上才是为组织分派空间,所以以下代码不被报错。
1 MyStruct myStruct /*= new MyStruct()*/; 2 myStruct.Name = "Earl Jones"; 3 myStruct.Age = 17;
掩盖组织默许的组织函数会报错:
3.6 弱援用
在代码中实例化一个类或组织时,只需有代码援用它,就会构成强援用。
强援用和弱援用的辨别是,强援用只需有援用就不会被GC接纳,而弱援用随时都能够被GC接纳,所以运用它的时刻必需肯定其是不是存活。如:
1 MyClass myClass;
2 WeakReference weakMyClass = new WeakReference(new MyClass());
3 if (weakMyClass.IsAlive)
4 {
5 myClass = weakMyClass.Target as MyClass;
6 Console.WriteLine(myClass.value);
7 }
3.7 部份类
Partial关键字能够许可把类、组织、要领或组织放在多个文件中。
假如声明类似运用了下面的关键字,这些关键字就必需应用于同一个类的一切部份:
接见修饰符
abstract
sealed
new
平常束缚
3.9 Object类
一切类都继续自System.Object类。
要领:
ToString();
GetHashCode();
Equals();这里有三个比较三个用于比较对象相称性的要领。
Finalize();
GetType();
GMemberwiseClone();
3.10 扩大要领
扩大要领用于在某些不能直接修正源代码中的类中增加要领。
1 using System; 2 3 namespace 扩大要领 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 MyClass myClass1 = new MyClass(); 10 myClass1.SayHiToSomeone(); 11 myClass1.SayHi(); 12 Console.ReadKey(); 13 } 14 } 15 16 class MyClass 17 { 18 public void SayHi() 19 { 20 Console.WriteLine("我是最原始的要领"); 21 } 22 } 23 24 static class AddMyClass 25 { 26 static public void SayHiToSomeone(this MyClass myClass)27 { 28 Console.WriteLine("我是一个扩大要领"); 29 } 30 31 static public void SayHi(this MyClass myClass) 32 { 33 Console.WriteLine("我是扩大要领SayHi"); 34 } 35 } 36 }
输出的效果:
由上得出:
扩大要领必需定义在一个静态类中。
扩大要领的第一个参数为放在 this 后的类,这个要领就是这个类的一部份。
等于扩大要领是一个静态要领,也要运用挪用实例要领的语法经行挪用。
假如扩大要领与类中某个要领同名,就从来不会挪用扩大要领。
以上就是C#高等编程(三)-对象和范例详解的细致内容,更多请关注ki4网别的相干文章!