• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 详解C#中的属性和属性的使用

详解C#中的属性和属性的使用

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言32关键字详解,c语言链表详解,c语言指针详解,c语言题库及详解答案,c语言关键字详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

属性
属性是一种成员,它提供灵活的机制来读取、写入或计算私有字段的值。属性可用作公共数据成员,但它们实际上是称为“访问器”的特殊方法。这使得可以轻松访问数据,还有助于提高方法的安全性和灵活性。
在此示例中,TimePeriod 类存储时间段。该类在内部以秒为单位存储时间,但是名为 Hours 的属性允许客户端以小时为单位指定时间。 Hours 属性的访问器执行小时与秒之间的转换。

class TimePeriod
{
  private double seconds;

  public double Hours
  {
    get { return seconds / 3600; }
    set { seconds = value * 3600; }
  }
}


class Program
{
  static void Main()
  {
    TimePeriod t = new TimePeriod();

    // Assigning the Hours property causes the 'set' accessor to be called.
    t.Hours = 24;

    // Evaluating the Hours property causes the 'get' accessor to be called.
    System.Console.WriteLine("Time in hours: " + t.Hours);
  }
}

</div>

输出:

Time in hours: 24
</div>

表达式主体定义
直接只返回表达式结果的属性很常见。下面的语法快捷方式使用 => 来定义这些属性:

public string Name => First + " " + Last; 
</div>

属性必须为只读,并且你不能使用 get 访问器关键字。

使用属性
属性结合了字段和方法的多个方面。对于对象的用户,属性显示为字段,访问该属性需要相同的语法。对于类的实现者,属性是一个或两个代码块,表示一个 get 访问器和/或一个 set 访问器。当读取属性时,执行 get 访问器的代码块;当向属性分配一个新值时,执行 set 访问器的代码块。不具有 set 访问器的属性被视为只读属性。不具有 get 访问器的属性被视为只写属性。同时具有这两个访问器的属性是读写属性。

属性具有多种用法:它们可在允许更改前验证数据;它们可透明地公开某个类上的数据,该类的数据实际上是从其他源(例如数据库)检索到的;当数据被更改时,它们可采取行动,例如引发事件或更改其他字段的值。
属性在类块中是按以下方式来声明的:指定字段的访问级别,接下来指定属性的类型和名称,然后跟上声明 get 访问器和/或 set 访问器的代码块。例如:

public class Date
{
  private int month = 7; // Backing store

  public int Month
  {
    get
    {
      return month;
    }
    set
    {
      if ((value > 0) && (value < 13))
      {
        month = value;
      }
    }
  }
}

</div>

在此示例中,Month 是作为属性声明的,这样 set 访问器可确保 Month 值设置为 1 和 12 之间。 Month 属性使用私有字段来跟踪该实际值。属性的数据的真实位置经常称为属性的“后备存储”。属性使用作为后备存储的私有字段是很常见的。将字段标记为私有可确保该字段只能通过调用属性来更改。

。
get 访问器
get 访问器体与方法体相似。它必须返回属性类型的值。执行 get 访问器相当于读取字段的值。例如,当正在从 get 访问器返回私有变量并且启用了优化时,对 get 访问器方法的调用由编译器进行内联,因此不存在方法调用的系统开销。然而,由于在编译时编译器不知道在运行时实际调用哪个方法,因此无法内联虚拟 get 访问器。以下是返回私有字段 name 的值的 get 访问器:

class Person
{
  private string name; // the name field
  public string Name  // the Name property
  {
    get
    {
      return name;
    }
  }
}
</div>

当引用属性时,除非该属性为赋值目标,否则将调用 get 访问器以读取该属性的值。例如:

Person person = new Person();
//...

System.Console.Write(person.Name); // the get accessor is invoked here

</div>

get 访问器必须以 return 或 throw 语句终止,并且控制权不能离开访问器体。
通过使用 get 访问器更改对象的状态不是一种好的编程风格。例如,以下访问器在每次访问 number 字段时都会产生更改对象状态的副作用。

private int number;
public int Number
{
  get
  {
    return number++;  // Don't do this
  }
}
</div>

get 访问器可用于返回字段值,或用于计算并返回字段值。例如:

class Employee
{
  private string name;
  public string Name
  {
    get
    {
      return name != null ? name : "NA";
    }
  }
}
</div>

在上一个代码段中,如果不对 Name 属性赋值,它将返回值 NA。
set 访问器
set 访问器类似于返回类型为 void 的方法。它使用称为 value 的隐式参数,此参数的类型是属性的类型。在下面的示例中,将 set 访问器添加到 Name 属性:

class Person
{
  private string name; // the name field
  public string Name  // the Name property
  {
    get
    {
      return name;
    }
    set
    {
      name = value;
    }
  }
}
</div>

当对属性赋值时,用提供新值的参数调用 set 访问器。例如:

Person person = new Person();
person.Name = "Joe"; // the set accessor is invoked here        

System.Console.Write(person.Name); // the get accessor is invoked here

</div>

在 set 访问器中,对局部变量声明使用隐式参数名称 value 是错误的。

此例说明了实例、静态和只读属性。它从键盘接受雇员的姓名,按 1 递增 NumberOfEmployees,并显示雇员的姓名和编号。

public class Employee
{
  public static int NumberOfEmployees;
  private static int counter;
  private string name;

  // A read-write instance property:
  public string Name
  {
    get { return name; }
    set { name = value; }
  }

  // A read-only static property:
  public static int Counter
  {
    get { return counter; }
  }

  // A Constructor:
  public Employee()
  {
    // Calculate the employee's number:
    counter = ++counter + NumberOfEmployees;
  }
}

class TestEmployee
{
  static void Main()
  {
    Employee.NumberOfEmployees = 107;
    Employee e1 = new Employee();
    e1.Name = "Claude Vige";

    System.Console.WriteLine("Employee number: {0}", Employee.Counter);
    System.Console.WriteLine("Employee name: {0}", e1.Name);
  }
}

</div>

输出:

  Employee number: 108
  Employee name: Claude Vige
</div>

此示例说明如何访问基类中由派生类中具有同一名称的另一个属性所隐藏的属性。

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

public class Manager : Employee
{
  private string name;

  // Notice the use of the new modifier:
  public new string Name
  {
    get { return name; }
    set { name = value + ", Manager"; }
  }
}

class TestHiding
{
  static void Main()
  {
    Manager m1 = new Manager();

    // Derived class property.
    m1.Name = "John";

    // Base class property.
    ((Employee)m1).Name = "Mary";

    System.Console.WriteLine("Name in the derived class is: {0}", m1.Name);
    System.Console.WriteLine("Name in the base class is: {0}", ((Employee)m1).Name);
  }
}

</div>

输出:

  Name in the derived class is: John, Manager
  Name in the base class is: Mary
</div>

以下是上一个示例中的要点:
派生类中的属性 Name 隐藏基类中的属性 Name。在这种情况下,派生类的属性声明中使用 new 修饰符:

public new string Name
</div>

转换 (Employee) 用于访问基类中的隐藏属性:

((Employee)m1).Name = "Mary";

</div>

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解C#中三个关键字params,Ref,out
  • 详解三种C#实现数组反转方式
  • 详解C# 利用反射根据类名创建类的实例对象
  • 详解C#用new和override来实现抽象类的重写区别
  • 详解C#把DataTable中数据一次插入数据库的方法
  • 详解c# 类的构造方法
  • 详解C#多线程之线程同步
  • 详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿
  • 详解C#中的委托
  • 详解C#中的out和ref

相关文章

  • 2017-05-28C#实现Dev Grid拖拽移动行的方法
  • 2017-05-28c#中实现图片灰度化技术详解
  • 2017-05-28轻松学习C#的ArrayList类
  • 2017-05-28C#执行外部命令的方法
  • 2017-05-28C#技巧之快速删除bin和obj文件夹的方法
  • 2017-05-28C#实现Array添加扩展实例
  • 2017-05-28C#身份证验证小例子
  • 2017-05-28asp.net之生成验证码的方法集锦(一)
  • 2017-05-28深入C#中使用SqlDbType.Xml类型参数的使用详解
  • 2017-05-28c#二进制逆序方法详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#基础语法:结构和类区别详解
    • C#用递归算法解决经典背包问题
    • C#学习笔记整理_深入剖析构造函数、析构函数
    • 解析在内部循环中Continue外部循环的使用详解
    • 深入多线程之:用Wait与Pulse模拟一些同步构造的应用详解
    • 基于C#中IDisposable与IEnumerable、IEnumerator的应用
    • C#使用队列(Queue)解决简单的并发问题
    • C#获取本机IP地址(ipv4)
    • C#基于WebBrowser获取cookie的实现方法
    • C#图像对比度调整的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有