c#-C#封装字段问题:两者的区别

问题描述

C#封装字段问题:两者的区别

(1) private int a;

    public int A
    {
        get { return a; }
        set { a = value; }
    }

    (2)  public int a { get; set; }

这两者分别什么意思?有什么区别?

解决方案

从表面上没啥区别,当你访问这个类时,
public int A
{
get { return a; }
set { a = value; }
}
只能通过类.A

public int a { get; set; }
通过类.a即可
public string a { get; set; }
和公有字段没多大区别了,没啥意义,建议用第一种方法。但是从面向对象的角度来讲,公开的是方法,而不是字段。而且微软也推荐:所有的字段都设置为私有字段,如果要使用它们,则把它们封装成属性。对于这样简单的set或get,编译器会自动进行inline处理,没有函数进出栈的性能损失。

解决方案二:

第一种,是有一个显示声明的变量a
第二种,系统会自己声明一个匿名变量返回

解决方案三:

没什么区别,第二种是第一种的简略形式。
为了符合微软的规范(当然不是强求),应写成

public int A { get; set; }

解决方案四:

如果对a没有特殊要求的话,两种都没问题,但如果需要封装一些判断,或则其他什么操作,最好使用第一种。

解决方案五:

下面的是高版本的.net framework的语法糖,和第一种写法效果是一样的,私有变量编译器创建。

解决方案六:

C#3推出了自动属性这个语法糖,编译器帮我们做了更多的工作,这两种写法的效果是一样的,只是自动属性的写法更加简洁。

时间: 2024-12-06 06:44:11

c#-C#封装字段问题:两者的区别的相关文章

重构——18自封装字段(Self Encapsulate Field)

自封装字段(Self Encapsulate Field) 你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙:为这个字段建立取值/设置函数,并且只以这些函数来访问字段 一.动机 如果你想访问超类中的一个字段,却又想在子类中将对这个字段的访问改为一个计算后的值,这就是该用Self Encapsulate Field的时候 二.做法 1.为待封装的字段建立取值/设值函数 2.找出该字段所有的引用点,将它们全部改为调用取值/设值函数 3.将该字段声明为private 4.复查,确保找出所有的引用

重构——27封装字段(Encapsulate Field)

封装字段(Encapsulate Field) 你的类中存在一个public字段:将它声明为private,并提供相应的访问函数 一.动机 面向对象的重用原则之一就是封装,或者称为"数据隐藏" 二.做法 1.为public字段提供取值/设值函数 2.找到这个类之外使用该字段的所有地点.如果客户只是读取该字段,就把引用替换为对取值函数的调用:如果客户修改了该字段,就将此引用点替换为对设值函数的调用 3.每次修改后,编译并测试 4.将字段的所有用户修改完毕后,将字段声明为private 5

c#和java中封装字段的不同

c#: private String name; public String Name { get { return name; } set { name = value; } } java: private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } 总结: 字段的使用场景:与类或者对象关系密切,建议使用private修饰

C#基础知识回顾-- 属性与字段

今天在公交车上,突然想属性和字段到底有什么区别?很多字段属性都存在 get{}和set{} 和普通的变量没什么区别(可读可写) 我就感觉属性就是给字段一个多的选择方式,有的字段是不允许更改的.. 刚写程序时总觉得一个字段就能满足要求,何必要使用定义起来麻烦的属性 要get.set的去定义,代码量还大,真不知道他们的区别和优点例: public class myclass { public static string A private sting _B=""; public strin

第八章 常数与字段[《.NET框架程序设计》读书笔记]

.net框架|笔记|常数|程序|设计 第八章 常数与字段 一.常数 1.可被定义为常数的类型有: 2 基元类型:Boolean, Char, Byte, SByte, Decimal, Int16, Int32, UInt16, UInt32, Int64, UInt64, Single, Double 2 字符串:String 2 枚举类型 2.常数在编译后直接嵌入IL代码中,因此一个模块中的常数不能在运行时被另一模块获取,前者对常数进行的修改无法被另一个模块在运行时感知,因此要想在运行时获取

Java的字段和方法

定义一个类时(我们在Java里的全部工作就是定义类.制作那些类的对象以及将消息发给那些对象),可在自己的类里设置两种类型的元素:数据成员(有时也叫"字段")以及成员函数(通常叫"方法").其中,数据成员是一种对象(通过它的句柄与其通信),可以为任何类型.它也可以是主类型(并不是句柄)之一.如果是指向对象的一个句柄,则必须初始化那个句柄,用一种名为"构建器"(第4章会对此详述)的特殊函数将其与一个实际对象连接起来(就象早先看到的那样,使用new关键

自动封装 get set

问题描述 就是下面这个格式.privateintkh_id;publicintKh_id{get{returnkh_id;}set{kh_id=value;}}java的eclipse中有个功能就是自动生成getter和setterVS里也可以在定义的变量使用封装字段来自动生成但是我只能一个一个的封装.如果定义一批变量的话要怎么样一下全部自动封装?我以前批量生成过一次.可忘了怎么弄出来了.好像也是自动封装 解决方案 解决方案二:用代码生成器,比如CodeSmith解决方案三:引用1楼youbl的

关于c#中字段赋值和属性的问题

问题描述 关于c#中字段赋值和属性的问题 在一个类的最前端设置一个线程:public Thread newThread=什么什么,此处为何不能为他赋值一个函数?错误提示说静态字段不能使用非静态函数,这里我并没有设置他的属性为static,为什么?默认属性为static? 解决方案 只能用new 或者常量.如果调函数,需要放在构造函数中. 解决方案二: C#中字段和属性的区别 解决方案三: 能不能贴出你的代码看下.不知道说的具体是什么 解决方案四: 默认是静态的吧,那你把方法也列为static

在.net里为字段用 get set 设置属性,这个到底有什么用?请哪位能否详解一下。

问题描述 在.net里为字段用getset设置属性,这个到底有什么用?请哪位能否详解一下. 解决方案 解决方案二:就是java里面的bean的意思解决方案三:除了封装,还能做什么用?解决方案四:我看大型项目都喜欢把字段实例化,不是很懂,总感觉我没有用到解决方案五:http://msdn.microsoft.com/zh-cn/library/aa479317.aspx]去看了就懂了解决方案六:引用2楼wumingbing_8027的回复: 除了封装,还能做什么用? 还可以对值进行一些检查和控制.