C#类学习笔记之C#类的属性

发布时间:2020-07-12编辑:脚本学堂
本文介绍下,C#类的属性的相关内容,有需要的朋友,可以参考下。很多新手朋友,对C#类的属性掌握的不是很好,在使用时难免有一些问题存在,本文为大家详细介绍C#类属性的相关知识,理论加实例,希望对大家有所帮助。

C#类的属性定义

属性:get { //读属性代码 } set { //写属性代码 }
 

public class Person
{
private string name;
public string Name
{
   get{return  name;}
   set{ name=value;}
}
}
 

属性可以忽略get或set访问器,但是不能两个都忽略。
set访问器包含一个隐藏的参数value,该参数包含从客户代码传送过来的值。
公共属性及其底层类型最好使用相同的名称,因为它们之间的联系将很清晰。

字段使用camelCase(xxXxx),如dateOfBirth,而属性使用PacalCase(XxXxx),如DateOfBirth.一些开发人员喜欢在字段的开头使用下划线,如_Name,属性也应使用名词来命名.

c#通过属性特性读取和写入字段,而不直接读取和写入,以此来提供对类中字段的保护.

属性按可以访问的类型分为三种不同的类型:

一,读/写属性
读/写属性是一个具有get()和set()访问器的属性.
语法:  [访问修饰符] 数据类型 属性
 

{
get{ };
set{ };
}

二,只读属性
仅具有get()访问器属性称为只读属性.
语法: [访问修饰符] 数据类型 属性名
 

{
get{ };
}

三,只写属性
仅具有set()访问器属性称为只写属性,不推荐使用只写属性.
语法: [访问修饰符] 数据类型 属性名
 

{
 set{ };
}

示例:
 

复制代码 代码示例:

using System;

namespace Example1
{
 class Student
 {
  #region/***属性***/
  /// <summary>
  /// 姓名
  /// </summary>
  private string name;
  public string Name
  {
   get
   {
    return name;
   }

   set
   {
    if(value.length<40)
    {
     Console.WriteLine("学生姓名长度不能小于4个!");
     return;
    }
    name=value;
   }
  }
  #region

  static void Main(string[ ] args)
  {
   Student student=new Student();
   student.Name=Console.ReadLine();
  }
 }
}

属性(property)
-充分体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问,即借助于get和set对属性的值进行读写;另一方面还可以对数据的访问属性进行控制(当然也可以通过对普通域加readonly关键字来实现。
-设计原则:属性封装了对域的操作。把要访问的域设为private,通过属性中的get和set操作对域进行设置或访问。
-不能把属性作为引用类型或输出参数来进行传递。
-get方法没有参数;set方法有一个隐含的参数value。除了使用了abstract修饰符的抽象属性,每个访问器的执行体中只有分号“;”外,其他的所有属性的get访问器都通过return来读取属性的值,set访问器都通过value来设置属性的值。
-采用间接方式来访问对象的属性(间接调用get、set方法):对象.属性 = 值(调用set),变量 = 对象.属性(调用get)。
-在属性的访问声明中:
只有set访问器,表明该属性是只写的。
只有get访问器,表明该属性是只读的。
既有set访问器,又有get访问器,表明该属性是可读可写的。
 

复制代码 代码示例:
private string s_filename;
public string Filename
{
    get
   {
     return s_filename;
  }//get
  set
 {
      if(s_filename!=value)
      {
         s_filename = value;
     }//if
    }//set
   }//Filename
  }

属性和字段的比较:
1)、属性不能使用ref/out 型参数
2)、 属性使用前必须赋值

属性使用前必须赋值,例如:
Time lunch;
lunch.Hour = 12;//错误,lunch没有初始化

属性vs.函数
相似点
 都包含执行代码
 都可以有访问修饰符
 都可以有virtual, abstract, override 修饰符
 都可以用在接口中

不同点
 属性只能拥有get/set 语句
 属性不可以是void 型
 属性不能使用参数
 属性不能使用[ ] 参数
 属性不能使用括号
 

复制代码 代码示例:
public int Hour

...
set
{
if (value < 0 || value > 24)
   throw new ArgumentException("value");
   hour = value;
}
 

类的属性称为智能字段,类的索引器称为智能数组。由于类本身作数组使用,所以用
this作索引器的名称,索引器有索引参数值。
例如:
 

复制代码 代码示例:
using System;
using System.Collections;
class MyListBox
{
  protected ArrayList data = new ArrayList();
  public object this[int idx]  //this作索引器名称,idx是索引参数
  {
    get
    {
      if (idx > -1 && idx < data.Count)
      {
        return data[idx];
      }
      else
      {
        return null;
      }
    }
    set
    {
      if (idx > -1 && idx < data.Count)
      {
        data[idx] = value;
      }
      else if (idx = data.Count)
      {
        data.Add(value);
      }
      else
      {
        //抛出一个异常
      }
    }
  }
}
}

尽可能编写出运行效率更高,更健壮,更容易维护的C#代码。