zoukankan      html  css  js  c++  java
  • 问题: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
      }

    l      属性和字段的比较:

    Ø       属性不能使用ref/out 型参数

    Ø       属性使用前必须赋值

    属性使用前必须赋值,例如:

    Time lunch;

    lunch.Hour = 12;//错误,lunch没有初始化

    属性vs.函数

    l       相似点

    Ø       都包含执行代码

    Ø       都可以有访问修饰符

    Ø       都可以有virtual, abstract, override 修饰符

    Ø       都可以用在接口中

    l       不同点

    Ø       属性只能拥有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#代码。

    尽可能的使用属性(property),而不是数据成员(field)。

    private   int   property1  
      public     int   Property1  
        {    
            get  
            {  
              return   property1   ;  
              }  
            set  
              {  
                if   (value>1)     //这里校验  
                    property1=   value   ;  
                    else    
                    property1=1;  
              }
     }


     //实例属性,可读可写
      public int StrCount
      {
       get
       {
        return m_strCount;
       }
       set
       {
        if (value>m_strCount)
        {
         strArray = new string[value];
         for (int i=0;i<value;i++)
         {
          strArray[i] = String.Format("String No.{0}",i);
         }
         m_strCount = value;
        }
       }
      }

      private static string m_strName = "MyClass";
      //一个静态属性,只读
      public static string ClassName
      {
       get
       {
        return m_strName;
       }
      }


    class B
    {
    private A _a;
    public A item
    {
      get
      {
        if(_a=null)
          _a=new A();
        return _a;
      }
      set{_a=value;}
    }
    }

    属性和字段的区别

        在C#中,我们可以非常自由的、毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值、或是要求字段只能读或只能写,或 是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写入工 作,get块负责属性的读取工作。在两个块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。当缺少其中一块时属性就只能 读或只能写,set和get块中属性必需有一个,因为即不能读又不能写的属性是没有意义的。

    class MyClass

    {

           Private  string  name;

     public string Name

     {

      get {return Name;}

      set {Name=value;}

     }

    }

    (1)属性可以保证安全,当不在本类中使用时可以保证使用属性名可以避免

    用字段的名字。

    (2)属性的set和get函数可以限制字段的一些功能,以达到某种目的。

    如:

    private int a=0;
    public int A
    {
         get{return this.a;}
         set
         {
             if(value >= 0 && value <= 100)
                  this.a=value;
             else
                  throw new Exception("值的范围不合法。");
         }
    }
    (3)属性没有存储数据的功能,数据都存在字段中,所以只有修改字段的数据才能更改数据,修改属性的值没用。
  • 相关阅读:
    jquery 实现 html5 placeholder 兼容password密码框
    php返回json的结果
    使用PHP读取远程文件
    Sharepoint 自定义字段
    Sharepoint 中新增 aspx页面,并在页面中新增web part
    【转】Sharepoint 2010 配置我的站点及BLOG
    JS 实现 Div 向上浮动
    UserProfile同步配置
    【转】Import User Profile Photos from Active Directory into SharePoint 2010
    Sharepoint 2010 SP1升级后 FIMSynchronizationService 服务无法开启
  • 原文地址:https://www.cnblogs.com/longphui/p/4800877.html
Copyright © 2011-2022 走看看