c#中get set 的使用

在早期学习c#的过程中,经常遇到这样的语句:

public string StudentName

{

get{return stuName;}

set{stuName=value;}

}

当时也不是很明白为什么要这样?学深了c#后,又没法对其做一个总结。今天看了《Visual c#.net程序设计教程》这本书,总结得不错,做下笔记:在许多面向对象程序设计语言中,属性 { Student stu = new Student(); Console.Write(stu.StudentName); Console.ReadKey(); } } }

上面代码中定义了一个属性StudentName,它包含get访问器和set访问器。属性StudentName封装了类Student中的字段stuName,字段如果没有加访问控制符,被默认为private,外界不能直接访问它,现在外界可以通过StudentNamee属性自由地存取 stuName字段了。

属性的get和set都是可执行的程序语句组合,具有行为的特点;而使用具有get访问器和set访问器的属性时候就像使用字段一样,即可以作为左值接受数据,又可以作为右值输出数据,系统正是按照属性出现在语句中的位置,自动地选择是调用get还是调用set。

属性的读写控制

属性中的get和set可以只用一个,如果只有get而没有set,那么这个属性只可读出,不可写入;如果只有set而没有get,那么这个属性是只写入,不可读出。

在属性中完成更多功能

既然get和set是程序,那当然可以做更多的事情。一个合理的分工是:设计字段是为了便于内部方法使用,而尽量与外界隔绝;设计属性考虑的是方便外界的使用,但是不让外界知道的数据一律不给。

具体说明:

set 访问器与返回 void 的方法类似。它使用称为 value 的隐式参数,此参数的类型是属性的类型。在下例中,set 访问器被添加到Name 属性:

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

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

e1.Name = "Joe";   // The set accessor is invoked here

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

备注

属性按如下方式,根据所使用的访问器进行分类:

  • 只带有 get 访问器的属性称为只读属性。无法对只读属性赋值。
  • 只带有 set 访问器的属性称为只写属性。只写属性除作为赋值的目标外,无法对其进行引用。
  • 同时带有 get 和 set 访问器的属性为读写属性。

在属性声明中,get 和 set 访问器都必须在属性体的内部声明。

使用 get 访问器更改对象的状态是一种错误的编程样式。例如,以下访问器在每次访问 number 字段时都产生更改对象状态的副作用。

public int Number
{
   get
   {
      return number++;   // Don‘t do this
   }
}

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

public string Name
{
   get
   {
      return name != null ? name : "NA";
   }
}

在上述代码段中,如果不对 Name 属性赋值,它将返回值NA

示例 1
此例说明如何访问基类中被派生类中具有同一名称的另一个属性隐藏的属性。
// property_hiding.cs
// Property hiding
using System;
public class BaseClass 
{
   private string name;
   public string Name
   {
      get 
      {
         return name; 
      }
      set 
      {
         name = value; 
      }
   }
}

public class DerivedClass : BaseClass 
{
   private string name;
   public new string Name   // Notice the use of the new modifier
   {
      get 
      {
         return name; 
      }
      set 
      {
         name = value; 
      }
   }
}

public class MainClass 
{
   public static void Main() 
   {
      DerivedClass d1 = new DerivedClass();
      d1.Name = "John"; // Derived class property
      Console.WriteLine("Name in the derived class is: {0}",d1.Name);
      ((BaseClass)d1).Name = "Mary"; // Base class property
      Console.WriteLine("Name in the base class is: {0}",
         ((BaseClass)d1).Name);   
   }
}
输出
Name in the derived class is: John
Name in the base class is: Mary
以下是上例中显示的重点: 
派生类中的属性 Name 隐藏基类中的属性 Name。在这种情况下,派生类的该属性声明使用 new 修饰符: 
   public new string Name 
   {
   ...
转换 (BaseClass) 用于访问基类中的隐藏属性: 
   ((BaseClass)d1).Name = "Mary";

------------------------------------------------------------------------------------------------------------------------------------------------------------

在类中定义一个属性 
public class Student 

private string name 
public string Name 

set{name=value;}//这里是给私有属性name赋值 
get{return name;}//这里取出私有属性name的值 


c#在定义类时,通常要把类中声明的对象封装起来,使得外界不能访问这个属性。上述代码中如果去掉set部分,则外界只能读取name的值,如果去掉get部分,则只能给name赋值。这样就可以控制外界对私有属性name的访问权限了,这种写法是C#的一个特性

当然你也可以通过自己创建函数来对name进行取值和赋值,但这样就显得比较麻烦了。

属性与普通变量不同就在于, 普通变量就是放在屋子里的东西, 是什么样明明白白. 而属性则是在屋子的门口放了个守门人, 你拿东西放东西要经过他.

这个守门人就是属性访问器, 拿东西就是 get, 放东西就是 set. 怎么拿怎么放是它说了算, 虽然你觉得好像就是直接拿直接放差不多. 
GET SET 就是对外的接口 ,一般在实例中访问成员数据需要这个成员数据的访问方式为PUBLIC ,现在C#很高级了,GET 就是获取,SET 就是设置,但是它提供了跟好的收缩性,对GET 和SET 可以单独设置访问权限 比如你对某个成员数据只能读取或者只写,或者只有派生类可以访问等。。。 相对以前来说,没有属性访问器,需要通过函数来调用私有成员数据,属性提供了高效的访问模式和简单的书写。 
就是为了安全啊~~ 
字段是你具体要操作的数据所以他的值不能出错,可是你又不能避免用户犯错~~ 
为了安全就用属性来给字段赋值,因为 在set中你可以对数据的安全进行验证, 
get就更简单了验证完数据了就要把值给了字段所以要get 
set的中文意思是“设置”; 
get的中文意思是“获得”;

补充:

get 和 set 会在相应的时候自动调用 
主要是为了隐藏程序内的数据结构时用 
get是获取该属性的值, 
set设置该属性的值。 
在用set时有一个特殊的变量value 
就是设置属性时的值

value 隐式参数,用于设置访问器以及添加或移除事件处理程序。

对类的属性进行 设置 
比如用类名.属性=“”赋值 set作用 
变量=类名.属性 取值 get 作用

时间: 2024-10-12 08:04:48

c#中get set 的使用的相关文章

win10周年版eNSP中启动AR提示错误代码40问题

win 10操作系统中安装eNSP 1.2.00.380,一直运行正常,但在2016年11月升级win 周年版之后,启动AR时启动失败,提示错误代码40. 卸载eNSP及VirtualBox之后重装问题依旧.按照论坛和网上各种说法更新virtualbox修改虚拟网卡设置,或者重新注册都无法解决,最终多方查找终于找到解决方案. 环境:win10 周年版,eNSP 1.2.00.380,VirtualBox 4.2.8 eNSP注册后virtualbox管理器中会出现AR_Base,WLAN_AC_

css中的px、em、rem 详解

概念介绍: 1.px (pixel,像素):是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Per Inch,每英寸像素数),在扫描打印时一般都有DPI可选.Windows系统默认是96dpi,Apple系统默认是72dpi. 2.em(相对长度单位,相对于当前对象内文本的字体尺寸):是一个相对长度单位,最初是指字母M的宽度,故名em.现指的是字符宽度的倍数,用法类似百分比,如:0.8em, 1.2em,2em等.通常1em=16px

angularJs中关于ng-class的三种使用方式说明

在开发中我们通常会遇到一种需求:一个元素在不同的状态需要展现不同的样子. 而在这所谓的样子当然就是改变其css的属性,而实现能动态的改变其属性值,必然只能是更换其class属性 这里有三种方法: 第一种:通过数据的双向绑定(不推荐) 第二种:通过对象数组 第三种:通过key/value 下面简单说下这三种: 第一种:通过数据的双向绑定 实现方式: function changeClass(){   $scope.className = "change2"; } <div clas

Uploadify/uploadifive上传(中文文档)

Uploadify是一款基于JQuery的优秀的文件/图片上传的插件,有基于Flash和HTML5两种版本. Uploadify/uploadifive主要特点有: 1. 多文件上传 2. 个性化设置 3. 上传进度条显示 4. 拖拽上传(HTML5版本) 官网:http://www.uploadify.com 部署 在部署一个Uploadify实例前,请确保满足最低要求: 1.jQuery 1.4.x 或更高版本 2.Flash Player 9.0.24 或更高版本 3.支持PHP, ASP

XShell 连接虚拟机中的服务器 失败 、连接中断(Connection closed by foreign host.)

在使用XShell连接虚拟机中的服务器时,报以下错误并断开连接,之前连接还是挺稳定的,忽然就这样了 Last login: Thu Aug 10 21:28:38 2017 from 192.168.1.102 [[email protected] ~]# Socket error Event: 32 Error: 10053. Connection closing...Socket close. Connection closed by foreign host. Disconnected f

微信浏览器中调用支付宝支付

众所周知,在微信浏览器中是无法唤起支付宝的,会提示请在浏览器中打开,如果非要在微信浏览器中调起支付宝的话,只能是跳出微信浏览器,关于这一点,在支付宝官网给出了一个例子.但是,话说回去,后来我仔细想想,其实真的没有必要非要在微信浏览器中调起支付宝支付(当时真是一根筋啊啊啊...) 支付宝手机网站支付的官方文档: https://doc.open.alipay.com/docs/doc.htm?treeId=203&articleId=105288&docType=1 快速接入: https:

C#中Dictionary的介绍

关键字:C# Dictionary 字典 作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionary.html 说明    必须包含名空间System.Collection.Generic     Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)     键必须是唯一的,而值不需要唯一的     键和值都可以是任何类型(比如:string, int, 自定义类型,等等

C#中使用ffmpeg合并视频

首先将最新的ffmpeg.exe放到debug路径下,下载地址 http://www.ffmpeg.org/download.html 然后调用此方法 public void CombineMp4WithoutTxt(string StrMP4A, string StrMP4B, string StrOutMp4Path) { Process p = new Process();//建立外部调用线程 p.StartInfo.FileName = System.Windows.Forms.Appl

Javascript中call的使用

call 方法应用于:Function 对象调用一个对象的一个方法,以另一个对象替换当前对象.call([thisObj[,arg1[, arg2[,   [,.argN]]]]])参数:thisObj 可选项.将被用作当前对象的对象. arg1, arg2, , argN 可选项.将被传递方法参数序列. 说明:call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.如果没有提供 thisObj 参数,那么 G

微信公众号中添加外部链接地址的图文教程

2017-9-18,长沙,有点闷,有点热. 本教程教大家如何在微信公众号中,添加外部的链接,网络有很多教程,但由于表述不太清楚,出个教程吧.最终实现在微信后台管理平台"原文链接"处插入外部链接,用户点击发布好的图文文章底部左下角的"阅读原文",就可以跳转到您添加的外部链接页面中去. 第1步. 使用微信公众管理帐号登陆微信管理后台 > 素材管理 > 图文消息 >  新建图文消息或者编辑文章都可以,如下图所示: 第2步. 之后,将页面向下拉,看到底部&