[毕业生的商业软件开发之路]C#类型成员

简介:

近期开始接触到在校学生、高校实习生和毕业生,在此说一下笔者对这些徘徊在职场门口的学生一些建议,希望能给这些初学者进入软件开发行业带来一些帮助,使得毕业生能更顺利的进入软件开发公司开始职场生涯,人生来一个完美的转弯。
--------------------------------------------------------------------------------

C#类型成员

类型、接口和结构体都包含若干个类型成员,类型成员有多种。

例如以下代码定义了一个类。

 
  1. public class PeopleClass  
  2. {  
  3.     /// <summary>  
  4.     /// 静态构造函数  
  5.     /// </summary>  
  6.     static PeopleClass()  
  7.     {  
  8.         System.Console.WriteLine("Start");  
  9.     }  
  10.  
  11.     /// <summary>  
  12.     /// 无参数的构造函数  
  13.     /// </summary>  
  14.     public PeopleClass()  
  15.     {  
  16.     }  
  17.  
  18.     /// <summary>  
  19.     /// 有参数的构造函数  
  20.     /// </summary>  
  21.     /// <param name="code"></param>  
  22.     /// <param name="name"></param>  
  23.     public PeopleClass(string code, string name)  
  24.     {  
  25.         _Code = code;  
  26.         _Name = name;  
  27.     }  
  28.  
  29.     /// <summary>  
  30.     /// 字段  
  31.     /// </summary>  
  32.     private string _Code = null;  
  33.     /// <summary>  
  34.     /// 属性  
  35.     /// </summary>  
  36.     public string Code  
  37.     {  
  38.         get 
  39.         {  
  40.             return _Code;  
  41.         }  
  42.         set 
  43.         {  
  44.             _Code = value;  
  45.         }  
  46.     }  
  47.  
  48.     /// <summary>  
  49.     /// 字段  
  50.     /// </summary>  
  51.     private string _Name = null;  
  52.     /// <summary>  
  53.     /// 属性  
  54.     /// </summary>  
  55.     public string Name  
  56.     {  
  57.         get 
  58.         {  
  59.             return _Name;  
  60.         }  
  61.         set 
  62.         {  
  63.             _Name = value;  
  64.         }  
  65.     }  
  66.     /// <summary>  
  67.     /// 方法  
  68.     /// </summary>  
  69.     /// <returns></returns>  
  70.     public override string ToString()  
  71.     {  
  72.         return _Code + " " + _Name;  
  73.     }  
  74.           
  75.     private void RaiseNameChangedEvent()  
  76.     {  
  77.         if (NameChanged != null)  
  78.         {  
  79.             NameChanged(thisnull);  
  80.         }  
  81.     }  
  82.     /// <summary>  
  83.     /// 事件  
  84.     /// </summary>  
  85.     public event EventHandler NameChanged = null;  

 这个类就包含了以下成员类型。

构造函数

在代码中定义了两个名为“PeopleClass”的方法,这种和类型同名的方法称为类型的构造函数。构造函数没有任何返回值,构造函数可以带参数,可以定义可用范围。

若在代码中没有定义任何构造函数,则系统会默认定义了一个无参数的公开的构造函数。

字段

在代码中使用“private string _Code = null;”定义了一个字段。在这里关键字“private”定义了该字段的引用范围为私有的,代码“string”说明了字段的数据类型,代码“_Code”为字段的名称,“=null”为字段的默认值。

属性

以下代码定义了一个属性。

 
  1. public string Name  
  2. {  
  3.     get 
  4.     {  
  5.         return _Name;  
  6.     }  
  7.     set 
  8.     {  
  9.         _Name = value;  
  10.     }  

在这里“public”定义了该属性的引用范围为公开的,代码“string”说明了属性的数据类型,“Name”说明了属性的名称,“get”代码块定义了如何获得属性值,“set”代码块定义了如何保存属性值,在“set”代码块中,关键字“value”是一个默认的参数,代表从外界传入的需要保存的数值。在C#中,只有属性的“set”代码块中,关键字“value”才有效,其他地方出现的“value”必定是某个标识符,而不是关键字。

方法

以下代码定义了一个方法

 
  1. public override string ToString( )  
  2. {  
  3.    return _Code + " " + _Name;  

在这里“public”定义了该方法的为公开的;代码“override”说明该方法是重载了基类的相同签名的方法;“string”就是方法的返回值类型;“ToString”为方法名称;圆括号“()”列表就是列出方法的参数,这里内容为空表示该函数没有任何参数。

方法开头后面就是方法体了,在里面使用“return”就是退出本函数并返回一个字符串值。

方法有返回值和参数列表,返回值可以为任意数据类型,若函数没有返回值,则使用关键字void来定义方法,比如“public void MyMethod( )”。有种说法,具有返回值的方法称为函数,没有返回值的方法称为方法。在本书中没有这种说法,统一称为对象成员方法。

若定义方法具有返回值时,在方法体内的函数必须使用return语句返回运算结果,否则会编译错误,这点和VB是不同的。在VB中若没有使用return语句返回运算结果,则会自动的返回参数数据类型对应的默认值。

方法具有若干个参数,对于值类型的参数,C#默认是按照值传递的,但可以使用关键字outref来实现按引用传递;对于引用类型的参数,永远是按照引用传递的。例如“public void MyMethod( ref int parameter )

参数修饰符

说明

无修饰

对于值类型的参数按值传递,方法体内修改参数值不会影响方法体外的参数变量的值。

out

说明该参数包含了方法的运算结果,此时参数是按引用传递的,而且在方法体内必须设置好参数值,否则编译错误,方法体内修改参数值会传导到方法体外用作方法产生的变量的值。

ref

参数是按引用传递的。方法体内修改参数值会传导到方法体外用作方法参数的变量的值。但方法体内不强制修改参数值,可以修改也可以不修改。

 

事件

以下代码定义了一个事件

public event EventHandler NameChanged = null;

在这里“public”定义该事件为公开的;代码“event”说明这是定义一个事件;代码“EventHandler”就是事件采用的委托类型;代码“NameChanged”就是事件的名称;代码“=null”设置该事件的初始值为空。

本类型还定义了一个函数来触发这个事件,该函数的代码如下

 
  1. private void RaiseNameChangedEvent()  
  2. {  
  3.     if (NameChanged != null)  
  4.     {  
  5.         NameChanged(thisnull);  
  6.     }  

在这里使用代码“if NameChanged != null )”用于判断事件是否有效,而代码“NameChanged( this , null )”就是调用该事件绑定的方法。

从便于理解的角度上看,事件可以说是一种比较特殊的字段,它是一种列表,能存储若干个委托对象,从而能动态的绑定了若干个方法。

索引器

索引器允许类或者结构体的实例就像数组一样进行索引,索引器类似一个带有参数的属性。以下代码定义了一个索引器

 
  1. /// <summary>  
  2. /// 索引器的范例  
  3. /// </summary>  
  4. public class PeopleList  
  5. {  
  6.     public PeopleList()  
  7.     {  
  8.     }  
  9.  
  10.     private ArrayList _Values = new ArrayList() ;  
  11.     /// <summary>  
  12.     /// 添加对象  
  13.     /// </summary>  
  14.     /// <param name="people"></param>  
  15.     public void AddPeople(PeopleClass people)  
  16.     {  
  17.         _Values.Add(people);  
  18.     }  
  19.  
  20.     /// <summary>  
  21.     /// 参数为序号的索引器  
  22.     /// </summary>  
  23.     /// <param name="index"></param>  
  24.     /// <returns></returns>  
  25.     public PeopleClass this[int index]  
  26.     {  
  27.         get   
  28.         {  
  29.             return ( PeopleClass ) _Values[index];   
  30.         }  
  31.         set 
  32.         {  
  33.             _Values[index] = value;   
  34.         }  
  35.     }  
  36.  
  37.     /// <summary>  
  38.     /// 参数为人员姓名的索引器  
  39.     /// </summary>  
  40.     /// <param name="name"></param>  
  41.     /// <returns></returns>  
  42.     public PeopleClass this[string name]  
  43.     {  
  44.         get 
  45.         {  
  46.             foreach (PeopleClass people in _Values)  
  47.             {  
  48.                 if (people.Name == name)  
  49.                 {  
  50.                     return people;  
  51.                 }  
  52.             }  
  53.             return null ;  
  54.         }  
  55. }  
  56.     /// <summary>  
  57.     /// 根据生日计算年龄  
  58.     /// </summary>  
  59.     /// <param name="birthday"></param>  
  60.     /// <returns></returns>  
  61.     public static int CalculateAge( DateTime birthday )  
  62.     {  
  63.         return DateTime.Now.Subtract(birthday).Days / 365;  
  64.     }  

代码“public PeopleClass this[int index]”中,“public”说明该索引器是公开的,“PeopleClass”定义了改索引器使用的数据类型,“this[ ]”说明这是在定义一个索引器,“int index”就是说明该索引器有个名为“index”类型为“int”的参数。

在代码“public PeopleClass this[string name]”中,“string name”说明该索引器使用的是一个字符串类型的参数,这个索引器可以按照人员姓名来获得人员信息对象。

在索引器的“get”代码块中,程序根据“index”参数值获得返回值;在“set”代码块中,程序根据“index”参数值和默认存在的“value”参数值来设置内部数值。[袁永福版权所有]

若索引器只有“get”代码块而没有“set”代码块,则该索引器是只读的,不能通过它来修改数据;若只有“set”代码块而无“get”代码块,则该索引器只能用于修改数据而不能用于获得数据。

 以下的C#代码就演示了如何使用索引器,

 
  1. //创建对象  
  2. PeopleList list = new PeopleList();  
  3. // 向对象添加内容  
  4. list.AddPeople(new PeopleClass("1""张三"));  
  5. list.AddPeople(new PeopleClass("2""李四"));  
  6. list.AddPeople(new PeopleClass("3""王五"));  
  7. list.AddPeople(new PeopleClass("4""陈六"));  
  8. list.AddPeople(new PeopleClass("5""赵七"));  
  9. list.AddPeople(new PeopleClass("6""钱八"));  
  10.               
  11. // 使用索引器获得数据  
  12. PeopleClass people = list[0];  
  13.               
  14. people = list["赵七"]; 

从这段代码中可以看到,带有索引器的类型的对象实例可以当做数组来使用,可以使用下标来访问它的数据。[袁永福版权所有]

索引器比数组更为灵活,因为数组只能使用整数作为下标值,而索引器可以使用任何数据类型作为下标值。比如在这里使用代码“public PeopleClass this[string name]”定义的索引器就可以使用字符串作为下标值。而且索引器可以有多个参数来支持多个下标值。

此外索引器可以被重载,可以定义抽象索引器或虚拟索引器。[袁永福版权所有]





     本文转自xdesigner 51CTO博客,原文链接:http://blog.51cto.com/xdesigner/630177,如需转载请自行联系原作者




相关文章
|
4月前
|
C#
一文搞懂C#中类成员的可访问性
一文搞懂C#中类成员的可访问性
58 5
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
37 3
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
62 1
|
1月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
18 0
|
2月前
|
C#
C# 可空类型(Nullable)
C# 单问号 ? 与 双问号 ??
60 12
|
4月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
142 7
|
4月前
|
程序员 C#
C# 语言类型全解
C# 语言类型全解
28 0
|
4月前
|
开发框架 .NET 编译器
C# 中的记录(record)类型和类(class)类型对比总结
C# 中的记录(record)类型和类(class)类型对比总结
|
4月前
|
传感器 开发框架 JSON
聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例
聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例
210 0
|
6月前
|
开发框架 .NET 编译器
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
44 2