`
小鑫的java
  • 浏览: 142979 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

C#中属性和字段的区别和联系<转载>

    博客分类:
  • C#
阅读更多

C#中属性和字段的区别和联系

问题:C#语法中针对类中数据成员的访问引见的属性和字段概念和C++相比,C++中只要属性(觉得相当于于C#中的字段),但是在运用C#过程中,假入本人要写一个类,包含几个数据成员(即字段)但是为了让外边能够访问还需求写对应的属性出来,岂不是有点费事?使用属性的优点是什么?

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

class Product   //商品类

    {

        //私有字段

        private string _Pname;   //商品名称

        private bool _IsNoEmperty;    //是否有库存

        private float _Price;     //商品单价

        private int _PCount;      //商品数量

        //属性:

        //可读写

        public string Pname

        {

            set { _Pname = value; }

            get { return _Pname; }

        }

        //只读

        public bool IsNoEmperty

        {

            get { return _IsNoEmperty; }

        }

        //可检测赋值是否正确

        public float Price

        {

            set

            {

                if (value >= 0)

                    _Price = value;

                else

                    throw new Exception("Price的赋值范围[1,10]");

            }

            get

            {

                return _Price;

            }

        }

        //赋值时更改其他状态

        public int PCount

        {

            set

            {

                _PCount = value;

                _IsNoEmperty = true;   //改变了_IsNoEmperty字段的值

            }

            get { return _PCount; }

        }

        public void Print()

        {

            Console.WriteLine("产品信息如下:");

            Console.WriteLine("产品名称:{0}",_Pname);

            Console.WriteLine("产品价格:{0}", _Price);

            Console.WriteLine("库存数量:{0}", _PCount);

Console.ReadLine();

        }

        static void Main(string[] args)

        {

            Product P1=new Product();

            P1.Pname="黑人牙膏(克)";

            P1.Price=5;

            P1.PCount=20;

            P1.Print();

        }

小结:引入属性的优点

1.维护私有字段(保证类的封装性)

2.可控制访问(只读/只写,确保赋值的正确性等)

3.不用注重细节(直接使用,不需要考虑复杂的处理代码)

至于引入属性的益处在更多的c#程序中会领会的愈加深入

问题:什么情况下选择使用字段还是属性?

从例子中可看到属性其实就是对私有字段的读取和写入,以便做些公有字段无法完成的任务,他的使用方式和公有字段完全一样,所以可以理解成属性是为了满足对公有字段的特殊需求而产生的附属品。因而当我们选择使用属性还是使用字段时,主要看需求,如果不需设置访问权限、不需在赋值时检测值是否满足要求、不需要在赋值时修改对象其他一些状态等特殊的需求时,使用公有字段即可,否则就使用属性。

分享到:
评论
1 楼 fcmfcm01 2012-08-09  
个人觉得没什么必要,控制访问权限完全可以由方法来实现,就像java中的getter/setter 方法一样,没必要写两套东西,仅仅是为了控制访问

相关推荐

    C# 生成属性 封装字段

    C# 生成属性 封装字段 多个字段一起生成 C# 生成属性 封装字段 多个字段一起生成

    C#编程经验技巧宝典

    88&lt;br&gt;&lt;br&gt;0136 如何进行文本加密与解密 88&lt;br&gt;&lt;br&gt;0137 如何区别0、空字符串、Null、Empty和Nothing 89&lt;br&gt;&lt;br&gt;0138 从字符串中分离文件路径、文件名及扩展名 89&lt;br&gt;&lt;br&gt;0139 如何批量替换某一类字符串 89...

    C#中的字段、属性、方法的区别

    个人在多次编程当中自我提炼出C#中的字段、属性与方法的区别

    C#XML入门经典 C#编程人员必备的XML技能.part2

    清华大学出版社 出版时间:2003年11月 &lt;br&gt;第1章 在C#中使用XML的原因&lt;br&gt;&lt;br&gt;1.1 使用XML的原因&lt;br&gt;1.1.1 开放性&lt;br&gt;1.1.2 简单性&lt;br&gt;1.1.3 自我描述性&lt;br&gt;1.1.4 互操作性&lt;br&gt;1.1.5 结构&lt;br&gt;1.1.6 分开结构和内容...

    c#list添加数据

    为仅实例化的list对象添加数据,list&lt;&gt;.count==0的时候,给其添加数据!

    C-中属性和字段(变量)的区别

    C#中属性和字段(变量)的区别 希望对大家有帮助

    C#中类、属性、字段、方法举例

    C#中类、属性、字段、方法简单小例子 C#简单入门

    ACCP5.0-S2-C#OOP项目-影院售票系统

    飞悦580·制作&lt;br&gt;&lt;br&gt;解压密码:www.fy580.cn&lt;br&gt;&lt;br&gt;北大青鸟ACCP5.0二期 --- &lt;br&gt;&lt;br&gt;深入.NET平台和C#编程 ---&lt;br&gt;&lt;br&gt;项目实战 --- 《影院售票系统》&lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;ShowList.xml --- XML文件&lt;br&gt;&lt;br&gt;影院...

    C#程序员参考手册(pdf)

    数组&lt;br&gt;第7章 类&lt;br&gt;第8章 结构&lt;br&gt;第9章 接口&lt;br&gt;第10章 枚举&lt;br&gt;第11章 字段&lt;br&gt;第12章 方法&lt;br&gt;第13章 属性&lt;br&gt;第14章 索引器&lt;br&gt;第15章 委托&lt;br&gt;第16章 事件&lt;br&gt;第17章 不安全代码&lt;br&gt;第18章 属性标志&lt;br&gt;第19...

    c#完全手册中文版

    第七章 表达式&lt;br&gt; 第八章 流程控制&lt;br&gt;第三部分 面向对象的C#&lt;br&gt; 第九章 面向对象的程序设计&lt;br&gt; 第十章 类&lt;br&gt; 第十一章 方法&lt;br&gt; 第十二章 域和属性&lt;br&gt; 第十三章 事件和索引指示器&lt;br&gt; 第十四章 继承&lt;br&gt;第四...

    AppFramework_V1.0

    1.48&lt;br&gt;&lt;br&gt;1.16&lt;br&gt; &lt;br&gt;查询结果集(平均101行)&lt;br&gt;&lt;br&gt;(1循环200次select)&lt;br&gt; 1055.1&lt;br&gt; 666.8&lt;br&gt;&lt;br&gt;不定字段:710.1&lt;br&gt; 1.58&lt;br&gt;&lt;br&gt;1.50&lt;br&gt; &lt;br&gt;&lt;br&gt; &lt;br&gt;&lt;br&gt;表III –50并发10循环(数据库和测试机同机...

    AppFramework_V1.0_New

    &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;下面三张表格罗列的测试数据,可以明显看出AppFramework数据库访问组件的性能全面超越了IBatisNet: &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;表I –10并发20循环(数据库和测试机分开)&lt;br&gt;&lt;br&gt;对比项目&lt;br&gt;iBatis2.0&lt;br&gt;...

    C#.Net的常见面试试题

    &lt;br/&gt;&lt;br/&gt;8.C#中的接口和类有什么异同。&lt;br/&gt;&lt;br/&gt;9.。net中读写数据库需要用到哪些类?他们的作用&lt;br/&gt;&lt;br/&gt;10.UDP连接和TCP连接的异同。&lt;br/&gt;&lt;br/&gt;11.ASP.net的身份验证方式有哪些?分别是什么原理?&lt;br/&gt;&lt;br/&gt;12...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;下面三张表格罗列的测试数据,可以明显看出AppFramework数据库访问组件的性能全面超越了IBatisNet: &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;表I –10并发20循环(数据库和测试机分开)&lt;br&gt;&lt;br&gt;对比项目&lt;br&gt;iBatis2.0&lt;br&gt;...

    C#.net_经典编程例子400个

    55&lt;br&gt;实例052 为TextBox控件添加列表选择框 57&lt;br&gt;2.2 Button控件应用 58&lt;br&gt;实例053 在Button按钮中显示图标 58&lt;br&gt;2.3 ComboBox控件应用 59&lt;br&gt;实例054 将数据表中的字段添加到ComboBox控件 59&lt;br&gt;实例...

    C# List OrderBy 动态多字段排序

    C# 使用orderby 多字段 动态排序

    c# 属性字段生成工具2011-09-01

    c# 属性字段生成工具 可以有空格; 2011-09-01日上传; vs2008自带的一次只能封装一个字段; 我们可以先把字段写出来;生成后再粘回去;

    强烈推荐:完整的C#实例源代码之 固定资产管理系统

    完整的C#实例源代码系列(内附详细说明文档)之:&lt;br&gt;&lt;br&gt;固定资产管理系统&lt;br&gt;&lt;br&gt;适合C#和SQL2005入门者练习。 &lt;br&gt;&lt;br&gt;内附数据库安装录像(FLASH格式)&lt;br&gt;&lt;br&gt;应网友要求,因为原来发布的资源点数过高,不适合...

    北大青鸟第二学期4.0 S2所有资料 四

    一共有5部分,这是第四部分&lt;br&gt;&lt;br&gt;大家下载时要记得评分,这样你们就不要资源分了&lt;br&gt;&lt;br&gt;java WEB &lt;br&gt;&lt;br&gt;COT&lt;br&gt;&lt;br&gt;sql server &lt;br&gt;&lt;br&gt;Testing&SQA&lt;br&gt;&lt;br&gt;winFormsPPT&lt;br&gt;&lt;br&gt;C#&lt;br&gt;

    北大青鸟第二学期4.0 S2所有资料 二

    一共有5部分,这是第二部分&lt;br&gt;&lt;br&gt;大家下载时要记得评分,这样你们就不要资源分了&lt;br&gt;&lt;br&gt;java WEB &lt;br&gt;&lt;br&gt;COT&lt;br&gt;&lt;br&gt;sql server &lt;br&gt;&lt;br&gt;Testing&SQA&lt;br&gt;&lt;br&gt;winFormsPPT&lt;br&gt;&lt;br&gt;C#

Global site tag (gtag.js) - Google Analytics