C#学习之类

来源:互联网 发布:数控车床左牙怎么编程 编辑:程序博客网 时间:2024/06/12 20:38

类的成员包括数据成员和函数成员,成员的可访问性可以是public、protected、internal protected、private和internal

数据成员

数据成员包含类的数据------字段、常量和事件的成员。字段是与类相关的变量;常量与类的关联方式同变量与类的关联方式,使用const关键字来声明常量,如果写为public就可以在类的外部进行访问;事件是类的成员,在发生某些行为时,它可以让对象通知调用方。

函数成员

函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和终结器、运算符以及索引器。

1.方法

方法是与某个类相关的函数,与数据成员一样,函数成员默认为实例成员,使用static修饰符可以把方法定义为静态方法。
(1)方法的声明
在C#中,方法的定义包括任意方法修饰符、返回值的类型,然后依次是方法名和输入参数列表(用圆括号括起来)和方法体。
【modifier】 return_type MethodName(Parameters)
{
//Method Body
//Do something
}
每个参数都包括参数的类型名和在方法体中的引用名称,但如果方法体有返回值,return语句就必须与返回值一起使用,以制定出口点。例如:
public ind add(int a,int b){      return a+b}
( 2 )调用方法
由于方法是在类中的,所以在每次调用类中的方法时,需要对类实例化,除非是一个静态类,然后通过实例化后的对象通过“.”运算符执行所要调用的方法,调用方法时需要注意这个方法的参数和返回值类型。
(3)给方法传递参数
参数可以通过引用或通过值传递给方法。在变量通过引用传递给方法时,被调用的方法得到的就是这个变量,所以在方法内部对变量进行的任何改变在方法退出后仍旧有效。而如果变量通过值传递给方法,被调用的方法得到的是这个变量的一个副本,也就是在方法中重新生成一个具有相同类型的变量,这个变量存储着传进来的值,方法对该变量的修改是对方法内生成的变量进行修改,当方法执行完成以后,方法内生成的变量将被释放,则对其的修改结果也会消失。对于复杂的数据类型,按引用传递的效率会更高,因为在按值传递时,必须复制大量的数据。例如:
using System;namespace Wrox{    class ParameterTest   {         static void SomeFunction(int[] ints,int i){ints[0] = 100;i = 100} public static int Main(){   int i =0; int[] ints={1,2,3,4};  Console.WriteLine("i="+i);  Console.WriteLine("ints[0]=" + ints[0]);   Console.WriteLine("Calling SomeFunction");SomeFunction(ints,i);  Console.WriteLine("i="+i);  Console.WriteLine("ints[0]=" + ints[0]);return 0;}    }}


结果是:
i = 0;
ints[0] = 1
Calling SomeFunction
i=0;
ints[0]=100
(4)ref参数
通过值传送变量是默认的,也可以迫使值参数通过引用传递给方法,为此,要使用ref关键,如果把一个参数传递给方法,且这个方法的输入参数带有ref关键字,则该方法对变量所做的任何改变都会影响到原始对象的值。
static void SomeFunction(int[] ints,ref int i){       ints[0] = 100;       i = 100;}
在调用该方法的时候,还需要添加ref关键字,即   SomeFunction(ints,ref i);
(5)out 参数
C#要求变量在被引用前必须用一个初值进行初始化,尽管在把输入变量传递给函数前,可以用没有意义的值初始化它们,因为函数将使用真实,有意义的值初始化它们,但是这样做是没有必要的,有时甚至会引起混乱。但又一种方法能够简化C#编译器所坚持的输入参数初始化。编译器使用out关键字来初始化,在方法的输入参数前面加上out前缀时,传递给该方法的变量可以不初始化。在调用该方法时,还需要使用out关键字,与定义该方法时一样。
static void SomeFunction(out int i){i = 100;}public static int Main(){int i ;SomeFunction(i);Console.WriteLine(i);return 0;}

(6)命名参数
参数一般需要按定义的顺序传送给方法。命名参数允许按任意顺序传递。例如:
string FullName(string firstName,string lastName){return firstName+" "+lastName;}FullName("John","Doe");FullName(lastName:"Doe",firstName:"John");

如果方法有几个参数,就可以在同一个调用中混合使用位置参数和命名参数。
(7)可选参数
参数也可以是可选的,必须为可选参数提供默认值,可选参数还必须是方法定义的最后一个参数。例如:
void TestMethod (int notOptionalNumber,int optionalNumber = 10){System.Console.Write(optionalNumber+notOptionalNumber);}

(8)方法的重载
C#支持方法的重载,这一点与Java和C++类似,即方法名相同,但参数的个数或类型不同。
C#在重载方法的参数方面有一些小限制:
  • 两个方法不能仅在返回类型上有区别
  • 两个方法不能仅根据参数是声明ref还是out来区分

2.属性

属性的概念是:它是一个方法或一对方法,在客户端代码看来,它们是一个字段。
在C#中定义属性,可以使用如下的语法:
public string SomeProperty{get{return "This is the Property value";}set{//do whatever needs to be done to set the property}}

get访问器不带任何参数,且必须返回属性声明的类型。也不应为set访问器制定任何显式参数,但编译器假定它带一个参数,其类型也与属性相同,并表示为value。例如:
private int agepublicc int Age{get{return age;}set{age = value;}}
(1)只读和只写属性
在属性定义中省略set访问器,就可以创建只读属性。同样,在属性定义中省略get访问器,就可以创建只写属性。但是,这是不好的编程方式,因为这可能会使客户端代码的作者感到迷惑。
(2)属性的访问修饰符
C#允许给属性的get和set访问器设置不同的访问修饰符,所以属性可以有公有的get访问器和私有受保护的set访问器。这有助于控制属性的设置方式和时间。
(3)自动实现属性
如果属性的set和get访问器中没有任何逻辑,就可以使用自动实现属性。这种属性会自动实现后备成员变量,前面的age示例代码如下:
public int Age{get;set;}
不需要声明private int age。编译器会自动创建它。使用自动实现属性,就不能再属性设置中验证属性的有效性。

3.构造函数

声明基本构造函数的语法就是声明一个与包含的类同名的方法,但是该方法没有返回类型:
public class MyClass{     public MyClass()    {    }}
一般情况下,如果没有提供任何构造函数,编译器会在后台创建一个默认的构造函数,这是一个非常基本的构造函数,它只能把所有的成员字段初始化为标准的默认值。构造函数的重载遵循与其他方法相同的规则,换言之,可以为构造函数提供任意多的重载,只要他们的签名有明显的区别即可:
public MyClass(){        //construction code}public MyClass(int number){       //construction code}
但注意,如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数。只有在没有定义任何构造函数时,编译器才会自动提供默认的构造函数。
public class MyNumber{      private int number;      public int MyNumber(int number)     {          this.number = number;     }}

这一段代码还说明,一般使用this关键字区分成员字段和同名的参数,如果试图使用无参数的构造函数实例化MyNumber对象,就会的到编译错误。
(1)静态构造函数
C#的一个新特征就是可以给类编写无参数的静态构造函数,这种函数只执行一次,而前面的构造函数都是实例构造函数,只有在创建类的对象时,才会执行它。
class MyClass(){    static MyClass()    {            //initialization code     }}
编写静态构造函数的一个原因是,类有一些静态字段或属性,需要在第一次使用类之前,从外部源中初始化这些静态字段和属性。
需要注意的是:静态构造函数是没有访问修饰符,其它C#代码从来不调用它,但在加载类时,总是由.net运行库调用它,所以像public或private这样的访问修饰符没有任何意义。出于同样的原因,所以静态构造函数也不带有任何的参数,一个类也只能有一个静态构造函数。
(2)从构造函数中调用其它的构造函数
有时,在一个类中有几个构造函数,以容纳某些可选的参数,这些构造函数包含有一些共同的代码。例如:
class car{    private string description;    private uint nWheels;    public car(string description,uint nWheels)    {           this.description = description;           this.nWheels = nWheels;     }     public car()    {         car("Very Good",5);     }}

C#构造函数初始化器可以包含对同一个类的另一个构造函数的调用,也可以包含对直接基类的构造函数的调用。
0 0
原创粉丝点击