• [毕业生的商业软件开发之路]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;
    86 }

     

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

    构造函数

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

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

    字段

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

    属性

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

    public string Name
    {
        
    get
        {
            
    return _Name;
        }
        
    set
        {
            _Name 
    = value;
        }
    }

     

     

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

    方法

    以下代码定义了一个方法

     

    public override string ToString( )
    {
       
    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”设置该事件的初始值为空。

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

    private void RaiseNameChangedEvent()
    {
        
    if (NameChanged != null)
        {
            NameChanged(
    thisnull);
        }
    }

     

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

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

    索引器

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

    /// <summary>
    /// 索引器的范例
    /// </summary>
    public class PeopleList
    {
        
    public PeopleList()
        {
        }

        
    private ArrayList _Values = new ArrayList() ;
        
    /// <summary>
        
    /// 添加对象
        
    /// </summary>
        
    /// <param name="people"></param>
        public void AddPeople(PeopleClass people)
        {
            _Values.Add(people);
        }

        
    /// <summary>
        
    /// 参数为序号的索引器
        
    /// </summary>
        
    /// <param name="index"></param>
        
    /// <returns></returns>
        public PeopleClass this[int index]
        {
            
    get 
            {
                
    return ( PeopleClass ) _Values[index]; 
            }
            
    set
            {
                _Values[index] 
    = value; 
            }
        }

        
    /// <summary>
        
    /// 参数为人员姓名的索引器
        
    /// </summary>
        
    /// <param name="name"></param>
        
    /// <returns></returns>
        public PeopleClass this[string name]
        {
            
    get
            {
                
    foreach (PeopleClass people in _Values)
                {
                    
    if (people.Name == name)
                    {
                        
    return people;
                    }
                }
                
    return null ;
            }
    }
        
    /// <summary>
        
    /// 根据生日计算年龄
        
    /// </summary>
        
    /// <param name="birthday"></param>
        
    /// <returns></returns>
        public static int CalculateAge( DateTime birthday )
        {
            
    return DateTime.Now.Subtract(birthday).Days / 365;
        }
    }

     

    在代码“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#代码就演示了如何使用索引器,

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

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

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

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

  • 相关阅读:
    rails 相关文件
    linux学习---vi进行多行的copy,cut
    设计
    互联网---现在正在变成过去
    testing
    TTl
    如何成为优秀的性能测试工程师
    linuX学习
    Programiz 中文系列教程·翻译完成
    Programiz C 语言教程·翻译完成
  • 原文地址:https://www.cnblogs.com/xdesigner/p/2126341.html
Copyright © 2020-2023  润新知