`
hyshucom
  • 浏览: 815447 次
文章分类
社区版块
存档分类
最新评论

C#--属性三两事

 
阅读更多
在介绍属性之前,我想问问各位有经验的大牛,属性的作用这么多,被外部访问的字段是不是都需要将它设为属性?


C#中的属性,体现了C#作为面向对象语言的封装性。它避免了外部类字段的直接访问、使得代码的安全性得到了加强。

属性与字段的区别:
属性是逻辑字段;属性是字段的扩展,源于字段;
属性并不占用实际的内存,字段占内存位置及空间。
属性可以被其它类访问,而大部分字段不能直接访问。
属性可以对接收的数据范围作限定,而字段不能。
最直接的说:属性是被“外部使用”,字段是被“内部使用”。

下面来看看,属性这种看起来麻烦的东西,到底能够带来什么样的好处:

1、可以提供get-only或者set-only版本,甚至可以给读、写以不同的访问权限(C# 2.0支持)

2、可以对赋值做校验、或者额外的处理

3、可以做线程同步

4、可以将属性置于interface中

5、可以使用虚属性、或者抽象属性



下面来看最简单的例子:
class Person
{
private string sex;

public string Sex
{
get { return sex; }
set { sex = value; }
}

}

可以通过使用以下代码操作:
Personx=newPerson();
x.Sex="boy";
Console.WriteLine("sex = {0}", x.Sex); //sex = boy

显然,get为写操作,set为读操作,当然可以设置为只读,只写属性。
当然,正常情况下,sex 的值只有boy跟girl,所以输入的其他情况均为异常情况,需避免。属性的作用之一就是可以提供这种约束:
classPerson
{
privatestringsex;

publicstringSex
{
get{returnsex; }
set
{
if(value!="boy"&&value!="girl")
{
Console.WriteLine("sex 输入异常!!");
}
else
{this.sex=value; }
}
}
}

Personx=newPerson();
x.Sex="boyORgirl";
Console.WriteLine("sex = {0}", x.Sex); //sex 输入异常!!

接口属性:
interface IEmployee
{
    string Name
    {
        get;
        set;
    }

    int Counter
    {
        get;
    }
}

public class Employee : IEmployee
{
    public static int numberOfEmployees;

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

    private int counter;
    public int Counter  // read-only instance property
    {
        get
        {
            return counter;
        }
    }

    public Employee()  // constructor
    {
        counter = ++counter + numberOfEmployees;
    }
}

class TestEmployee
{
    static void Main()
    {
        System.Console.Write("Enter number of employees: ");
        Employee.numberOfEmployees = int.Parse(System.Console.ReadLine());

        Employee e1 = new Employee();
        System.Console.Write("Enter the name of the new employee: ");
        e1.Name = System.Console.ReadLine();

        System.Console.WriteLine("The employee information:");
        System.Console.WriteLine("Employee number: {0}", e1.Counter);
        System.Console.WriteLine("Employee name: {0}", e1.Name);
    }
}
示例输出:

Enter number of employees: 210

Enter the name of the new employee: Hazem Abolrous

The employee information:

Employee number: 211

Employee name: Hazem Abolrous




下面讨论一下虚属性和抽象属性(个人认为的属性的最大优点):

虚属性:
public class Base
{
public virtual int Count //虚属性
{
get { return 1; }
}
public int Compute()
{
return Count;
}
}

public class Derived : Base
{
public override int Count //重载虚属性
{
get { return 5; }
}
}

Test:
Derived b = new Derived();
Console.WriteLine("Compute is {0}\n", b.Compute());
Console.ReadLine();
Output:
Compute is 5

抽象属性的实现基本与上面相似,只要将Count 的限定符vitual改为abstract


看完了属性的作用,你是否觉得它很强大?你觉得它应该替代public字段吗?
或者,在你的工作中,你是如何处理考虑这个问题的?



期待你的回答,谢谢!









--------------------------------------------------------------------2012年9月13日21:47:56
分享到:
评论

相关推荐

    C#-数据结构.pptx

    数据结构概念的三要素—定义 数据元素之间的逻辑关系 数据元素在计算机中的存储方式 在这些数据元素上定义的运算的集合 C#-数据结构全文共71页,当前为第3页。 数据结构的基本分类 两大类: (一)线性结构(线性表)...

    c#内容页访问母版页的属性及控件

    C# 内容页访问母版页的属性及控件 C# 内容页访问母版页的属性及控件是 ASP.NET 框架中的一种常见应用场景。在 ASP.NET 中,母版页(Master Page)是一种特殊的页面,用于提供公共的页面布局和共享的用户界面元素,...

    VB和c#语法对照

    VB.NET和C#是两种常用的编程语言,它们都具有各自的语法结构和特点。下面我们将对VB.NET和C#的语法进行对照,了解它们的异同。 一、程序结构 VB.NET程序结构: * 命名空间(Namespace):用于组织类和模块的逻辑...

    c#练习题

    根据属性的读写特性,C# 中的属性可以分为三种:只读属性、只写属性和读写属性。其中,第四选项“不可读不可写的属性”不是一种正确的分类。 try-catch-finally 语句 在 C# 中,try-catch-finally 语句用于异常...

    轻松学C#(图解版)

    第二篇是面向对象基础篇,主要介绍类、对象、字段、方法、流程控制、数组、继承、属性、运算符重载、接口等C#基本内容。第三篇是应用技术篇,主要介绍的是异常处理、文件和流、委托、事件、Lambda表达式、命名空间、...

    c#学习笔记.txt

    c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] ... 1, 结构(struct) 与 类(class) ...有人说,选择C#意味着选择MS(在中国的程序员当中,这并不是件值得自豪的事...

    c#程序设计第三章类的高级成员

    类与对象 修饰符 类中的成员: 字段 属性 索引器 方法 结构 枚举

    CLR via C# 中文版 第三版(高清_全_part1.rar)

    CLR via C# 中文版 第三版 (高清 PDF 全 带书签) 引用清清月儿说的话就是,此书不看,看遍千书也枉然。 地球人都知道此书的权威性。 .NET技术领域有两位世界级专家。    一位是Don Box。他以《Essential COM...

    CLR via C# 中文版 第三版(高清_全_part2.rar)

    CLR via C# 中文版 第三版(高清 全 带书签) 套用清清月儿的一句话就是:此书不看,看遍千书也枉然。 此书权威性地球人都知道。 (文件太大,分两个包上传,这是第二个压缩包。两个都下载完才可以减压,这个就不用...

    在一小时内学会 C#(txt版本)

    C# 提供了一种更加便捷、简单而又直接的属性访问方式。 所以上面的类应该写成这样: 复制内容到剪贴板 代码: using System; class Date { public int Day{ get { return day; } set { day = value; } } ...

    C#窗体编程不显示最小化、最大化、关闭按钮的方法

    对于最大化和最小化按钮,在C#窗体开发时,各一个属性来启用或禁用这两个按钮。对于最大化来说,this.MaximizeBox=false即可禁用最大化按钮。而这里的this是指窗体对象本身。而this.MinimizeBox=false即可禁用最小化...

    C# 改进的label控件(带图片和文字、圆角)

    C#下重写的label控件(带图片和文字、圆角),有移入、按下、挪开这三种视觉样式,在VS2008下调试成功。有兴趣的大哥可以把它生成自定义控件,并且自行添加好属性。倘若有需要,我也可以帮忙。谢谢~

    在C#中使用控件DataGridView实现数据库增删改查

    在本示例中,我们实现了两个按钮单击事件,一个用于插入数据,另一个用于删除数据。 在 C# 中使用控件 DataGridView 实现数据库增删改查需要连接到数据库、创建 DataSet 和 SqlDataAdapter 对象、加载数据到 ...

    C#微软培训资料

    第三部分 面向对象的 C#.101 第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 类 .112 ...

    C#软件开发工程师招聘试题

    本节我们将对C#软件开发工程师招聘试题进行总结,涵盖了单项选择题、填空题和判断题三个部分。 单项选择题 1. 在类作用域中能够通过直接使用该类的成员名进行访问的是私有成员。 2. 小数类型和浮点类型都可以表示...

    C#日期时间格式查看器

     格式字符 关联属性/说明  d ShortDatePattern  D LongDatePattern  f 完整日期和时间(长日期和短时间)  F FullDateTimePattern(长日期和长时间)  g 常规(短日期和短时间)  G 常规(短日期和长时间) ...

    明日科技C#开发入门及项目实战

    实例007 为项目添加第三方控件 实例008 为项目添加已有窗体 第2章 c#语言基础 实例009 利用for循环输出多行语句 实例010 输入并输出姓名 实例011 使用值类型和引用类型输出不同的字段 实例012 判断当前系统日期是...

    C#编译原理 ZIP 压缩文件

    C#编译原理 目 录 译者序 前言 第1章 概论 1 1.1 为什么要用编译器 2 1.2 与编译器相关的程序 3 1.3 翻译步骤 5 1.4 编译器中的主要数据结构 8 1.5 编译器结构中的其他问题 10 1.6 自举与移植 12 1.7 TINY样本语言与...

    C# WinForm控件美化之ImageComboBox

    这篇文章中我们重点需要实现的是(3)、(4)两项功能,下面我们来介绍具体实现的方法。 第一步,实现ImageComboBoxItem类。 要实现显示图标,当然要给每个项添加与图标相关的信息了,ImageComboBoxItem类应该包括...

    C#开发之微信小程序发送模板消息功能

    有两个方法可以获取模版ID 通过模版消息管理接口获取模版ID 在微信公众平台手动配置获取模版ID 步骤二:页面的 <form/> 组件,属性report-submit为true时,可以声明为需发模板消息,此时点击按钮提交表单...

Global site tag (gtag.js) - Google Analytics