`
sunqing0316
  • 浏览: 37530 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

C#中的GET和SET访问器

阅读更多
我们在学习C#语法的属性时,都要首先和GET,SET访问器打交道,从英文的字面意思上理解,GET应该就是获得什么什么,而SET应该是设置什么什么,那我们看一下,官方是怎么定义这对访问器的:get是读取属性时进行的操作,set是设置属性时进行的操作。定义一个属性如果只有get,这个属性就是只读的。同样,只有set,属性就是只写的,当然只写的属性我觉的意义不是很大。

接下来我们通过一些代码实例来接触一下GET和SET访问器

class Bank { private int money;//私有字段 public int Money //属性 { //GET访问器,可以理解成另类的方法,返回已经被赋了值的私有变量money get { return money; } //SET访问器,将我们打入的值赋给私有变量money set { money = value; } } }

我们可以打个生动的比方:

Money属性就像银行里的自动存取款机,你看不见里面的money,但你能用set(存钱),用get(取钱)。money是一个私有字段,是分装在类中的,类以外的程序不能直接访问的,类的set和get成员是外部程序访问类内部属性的唯一方法,就像你去银行取钱,你不能直接从银行的保险柜里拿到钱,而是银行营业人员把钱取出来给你的。
那我们设置了Money属性,怎么使用呢??

class Program { static void Main(string[] args) { //实例化一个Bank银行 Bank bank = new Bank(); //对Money属性做赋值操作,这时我们访问的是SET访问器 bank.Money = 15; //对Money属性做取值操作,这时我们访问的是GET访问器 int a = bank.Money; } }

细心的朋友可以发现当我们设置断点在SET访问的中,执行代码 bank.Money = 15;时,就会进入我们属性中的SET访问器了。

以上就是我们的SET和GET访问器的最基本的应用了。

但是我们为什么要用GET和SET访问器呢??
通过GET和SET对公有变量Money进行读写操作,实际就是间接更改money私有变量的值,那既然如此。为何不设money为public,让实例直接对money进行读写操作呢?我们是不是在多此一举呢?

其实,我当初刚接触GET和SET就很理解,并不是说他们的含义难理解,而是为什么要用?为何不直接用个public的字段变量来代替呢?

理解一:用了GET和SET能让赋值和取值增加限制

class Bank { private int money;//私有字段 public int Money //属性 { //GET访问器,可以理解成另类的方法,返回已经被赋了值的私有变量money get { return money; } //SET访问器,将我们打入的值赋给私有变量money,并且加了限制,不能存负的 set { if (value >= 0) { money = value; } else { money = 0; } } } }

这样的话,我们是永远无法给Money属性赋值负的金钱了!

其实这种应用才我们的实际的项目中,属性设置中非常常见!例:

public string ApplyStaff { //延迟加载ApplyStaff对象 get { if (this.IsGhost) { LazyLoaderFactory.GetLoader().LoadApplicationConfirm(this); } return applyStaff; } set { //判断输入的字符的长度 if (value.Length > 40) { throw new Exception("领用人不能超过40个字符。"); } this.applyStaff = value; } }

public string BillName { get { return billName; } set { if (value==string.Empty) { throw new Exception("单据名称不能为空"); } else if (value.Length > 40) { throw new Exception("单据名称长度不能超过40个字符"); } else { this.billName = value; } } }

如果在SET访问器中设置这个属性的一些特性,比如说不能为空,长度大小,必须为数字,各类正则表达式等等,然后抛出异常,表示层再来接受,这样就可以少写很多验证程序了。

理解二:封装性、安全性、完整性

我也没想太明白

分享到:
评论

相关推荐

    深入C#中get与set的详解

    访问器声明可以包含 get 访问器或 set 访问器,或者两者均包含。声明采用下列形式之一:get {}set {}get 访问器get 访问器体与方法体相似。它必须返回属性类型的值。执行 get 访问器相当于读取字段的值。以下是返回...

    网络之美 JavaScript中Get和Set访问器的实现代码

    前两天IE9 Beta版发布了,对于从事Web开发的朋友们来说真是个好消息啊,希望将来有一天各个浏览器都能遵循统一的标准。今天要和大家分享的是JavaScript中的Get和Set访问器,和C#中的访问器非常相似。

    c#访问器演示 长方体周长面积计算

    演示c#访问器使用方法,控制台应用程序的创建。

    c#基础学习问答c#基础学习问答

    如果基类中有 get 和 set 两个呢? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? 15.接口可以包含哪些成员? 16.类和结构的区别? 17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别...

    C#试题库最全版

    6、如果一个属性里既有set访问器又有get访问器,那么该属性为( 读写 )属性。 7、如果一个属性里只有set 访问器,那么该属性为( 只写 )属性。 8、常量通过关键字( const )进行声明。 9、在C#中,进行注释有两...

    C#字符串处理

    2)、包含私有字符串变量赋值的属性,具有get\set访问器, 3)、包含字符串长度的属性,具有get访问器, 4)包含统计大写字符个数的方法 5)、包含统计小写字符个数的方法, 6)、包含将字符全部转换为大写字符的...

    c# http post get

    * *描 述:实现HTTP协议中的GET、POST请求 * *使 用:HttpProc.WebClient client = new HttpProc.WebClient(); client.Encoding = System.Text.Encoding.Default;//默认编码方式,根据需要设置其他类型 client....

    C#类的声明与封装

    声明复数类, 包括私有字段r、i(double类型)和相应的属性real、imaginary(均具有get和set访问器);类的方法包括实现复数加法(add)、减法(sub)、比较(compareTo)是否相等、重写(override)ToString()方法...

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

    对 C++ 来说,前面例子中 Date 类的属性就是 day、month 和 year,而你添加了 Get 和 Set 方法。C# 提供了一种更加便捷、简单而又直接的属性访问方式。 所以上面的类应该写成这样: 复制内容到剪贴板 代码: using ...

    详解C#中的接口属性以及属性访问器的访问限制

    以下是接口索引器访问器的示例: public interface ISampleInterface { // Property declaration: string Name { get; set; } } 接口属性的访问器不具有体。因此,访问器的用途是指示属性是否为读写、只读或...

    C#基础概念.doc

    如果基类中有 get 和 set 两个呢? 14、abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? 15、接口可以包含哪些成员? 16、类和结构的区别? 17、接口的多继承会带来哪些问题? 18、抽象类和...

    你必须知道的C#的25个基础概念(附源码)

    如果基类中有 get 和 set 两个呢? 14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗? 15.接口可以包含哪些成员? 16.类和结构的区别? 17.接口的多继承会带来哪些问题? 18.抽象类和接口的区别...

    C#中的只读结构体(readonly struct)详解

    任一结构体都可以有公共属性、私有属性访问器等等。我们从以下结构体示例来开始讨论: public struct Person { public string Name { get; set; } public string Surname { get; set; } public int Age { get; ...

    c#学习笔记——学习心得

    对于类的实现者,它是一个或两个代码块(用于表示get/set访问器)。写类的时候使用System.Serializable属性以便使类的成员可以序列化 方法:是一种用于实现可以由对象或类执行的计算或操作的成员。类的方法主要是和类...

    举例讲解C#中自动实现的属性

    在 C# 3.0 及更高版本,当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁。它们还允许客户端代码创建对象。当你声明以下示例中所示的属性时,编译器将创建仅可以通过该属性的 get 和 set ...

    c#基础学习之封装

    属性具有可读,可写,通过get和set访问器来实现其读写控制。如果属性为只读,则只实现get访问器即可;如果属性为可写,则实现set访问器即可。另外还有一种含参属性,在c#中称为索引器。索引器一般是用来方便对类 ...

    C#中字段、属性、只读、构造函数赋值、反射赋值的问题

    4、为什么只读字段和只读自动属性(只有get没有set访问器)都可以在构造函数中进行赋值? 5、反射可以给只读字段或者只读属性进行赋值吗? 6、自动属性和普通属性的区别? 这些问题是我在试着写自己的注入实现时遇到...

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

    主要介绍了C#中的属性和属性的使用,包括get访问器和set访问器等内容,需要的朋友可以参考下

    三十分钟快速掌握C# 6.0知识点

    原理解析:就是编译器在生成set访问器时,它的修饰符是private,由上可知所谓的只读只是针对类外部,在类内部还是可以随意修改属性值的。 C# 6中提供了真正的只读自动属性,写法如下: public string FirstName { ...

    谈谈c#中的索引器

    属性可使用 get 和 set 访问器来定义索引器。但是属性返回或设置的是一个特定的数据成员,而索引器返回或设置对象实例的一个特定值。 定义一个一维数组的索引器: element-type this[int index] { //

Global site tag (gtag.js) - Google Analytics