关于C#中get和set

2023-11-11

转自:http://blog.sina.com.cn/s/blog_82526aa60100txtx.html
在程序中经常碰到get、set,不甚明白,在网上查询时也说的迷迷糊糊,所以整理下,以学的明白透彻点。

有两个类person:

    public class person
    {

      public string name;

    }
   public class person

    {

      public string Name{set;get;}

    }
   

第一个类型的name属性未封装,其name属性直接通过public关键字暴露给系统中的其他类了,而第二个类型的name属性通过get set关键字进行了封装,get和set分别对应的是可读和可写,相当于如下代码:

   private string name;

    public string Name
    {

      get { return name; }

     set { name = value; }

   }

简单说下区别吧:当实例化第一个“person”这个类时,系统在分配内存空间时对name属性直接分配内存,之后对name属性的操作也是直接操作内存中name属性所在的这个块;而当实例化第二个“人”类型时,系统会先分配一个叫name的private私有的内存空间,之后的读与写的操作都是通过Name这个public的类似于指针的东西来关联name进行,以此达到封装的目的,并且通过get和set关键字也可以控制可读还是可写。建议用后者,封装的好处可以参考相关文档,不再累述了~
至于get和set的作用,除了控制读写之外还有其他的作用,举个简单的例子,比如说当我给Name赋值的时候想要先进行一些逻辑判断,就可以这样:

 private string name;
 public string Name
        {
            get { return name; }
            set
            {
             	name = String.IsNullOrEmpty(value) ? "空" : value;
            }
        }

再举例说明下:
假设类是一银行,既能存钱也能取钱

Private Money;
    Private class bank()
    {
      get {return Money;}
      set{ Money=value;}
    }

Money 就像银行里的自动取款机,你看不见里面的Money,但你能用set(存钱),用get(取钱)。Money是一个私有字段,是分装在类中的,类以外的程序不能直接访问的。C#中get、set用法中,类的set和get成员是外部程序访问类内部属性的唯一方法,就像你去银行取钱,你不能直接从银行的保险柜里拿钱,而是银行营业人员把钱取出来给你的。
属性在调用者看来就像一个普通的变量,但作为类的设计者,你可以利用属性来隐藏你类中的一些字段,使外界只能通过属性来访问你的字段,你可以通过属性来限制外界对你的字段的存取,就利用get、set。如果想让用户随意存取你的字段,那么就实现get、set;如果只想让用户读取字段,就只实现get;若只想让用户写字段就只实现set。同时还可以在set和get中对用户传递的值进行一些验证工作,以确保你的字段将含有正确的值。

Private int a;
Public int index
    {
      get{ return a;}
      set{
      If (value>0)a=value;
      else a=0;
    }
}

可看出,get、set用法中一则是隐藏组件或类内部的真是成员;二是用来建立约束的,比如,实现“有我没你”这种约束; 三是用来响应属性变化事件,当属性变化是做某事,只要写在set方法里就行。当你想读出或写入属性的值时,存取标志限定了被实现的语句。用于读出属性的值的存取标志记为关键字get,而要修改属性的值的读写符标志记为set。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于C#中get和set 的相关文章

  • Postsharp 不登录跟踪级别

    我喜欢在跟踪级别记录一些 Postsharp 消息 不幸的是 日志到这个级别没有打印任何输出 所有其他级别都在工作 与控制台或 NLog 后端或从其他类登录时的行为相同 如何启用跟踪级别 应用程序 xaml cs Log Attribute
  • 如何在 Caliburn.Micro 中使用 Conductor 的依赖注入

    我有时用Caliburn Micro http caliburnmicro com创建应用程序 使用最简单的 BootStrapper 我可以像这样使用 IoC 容器 SimpleContainer private SimpleContai
  • 将 ARGB 拆分为字节值

    我有一个 ARGB 值存储为 int 类型 它是通过调用 ToArgb 来存储的 我现在想要来自 int 值的各个颜色通道的字节值 例如 int mycolor 16744448 byte r g b a GetBytesFromColor
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • 表达式访问者仅为某些 lambda 表达式调用 VisitParameter

    我希望能够使用嵌套扩展方法将 EF 中的实体投影到相应的视图模型 参见我之前的问题使用扩展方法在 EF 中投影单个实体 https stackoverflow com questions 39585427 projection of sin
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • C++ 并行任务的开销

    我有以下简单的功能 include
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 如何在Unity Inspector中创建多维数组?

    如何在 Unity Inspector 中创建枚举多维数组并使其可序列化 以便我可以从不同的脚本调用它 public enum colors red blue green yellow cyan white purple public in
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 将旧的 Unity 代码升级到 Unity 5

    在触发按钮上播放动画的代码似乎不起作用 我在 Youtube 上看到了一个视频 内容很简单animation Play 它可以在该视频上运行 但我无法让它在我的计算机上运行 我做错了什么还是团结改变了它 请帮助我在网上找不到解决方案 所有
  • 为什么最小的 int -2147483648 的类型为“long”? [复制]

    这个问题在这里已经有答案了 对于一个学校项目 我必须编写 C 函数 printf 的代码 一切进展顺利 但有一个问题我找不到好的答案 所以我来了 printf PRINTF d t d n 2147483648 告诉我 gcc Werror
  • “DeploymentItem”属性是什么意思?

    假设我们有一个简短的程序 namespace ConsoleTryIt static class Program static void Main string args var sum Add 1 2 private static int
  • 当分配返回 0 时,具有空异常规范的运算符 new 调用构造函数

    我有以下声明 void operator new size t s PersistentMemory m throw return m gt allocatePersistentMemory s 我正在测试启动时的内存耗尽 这会导致m gt
  • WCF 服务中的缓冲区大小

    我们有一个 WCF 服务 它执行某些存储过程并将结果返回给 silverlight 客户端 某些存储过程最多返回 80K 行 下面给出的是 web config 中服务的设置
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • Membership.ValidateUser() 的目的是什么

    我一直在学习有关MembershipProvider类 我认为Membership ValidateUser 方法应该用于登录用户 然而我刚刚了解到有一个FormsAuthentication Authenticate 目的是什么Valid
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • 如何从 C# 中的 Web Api 方法正确获取字节数组?

    我有以下控制器方法 HttpPost Route SomeRoute public byte MyMethod FromBody string ID byte mybytearray db getmybytearray ID working

随机推荐

  • 揭秘百度文心一言大模型:设计、应用与实战

    导言 在当今的深度学习领域 大型预训练模型如GPT BERT等已经取得了显著的进展 而百度公司的文心一言大模型 作为一款基于Transformer结构的巨型模型 也在自然语言处理领域产生了重大影响 本文将详细介绍文心一言大模型的设计原理 特
  • 轴承公差以及常见的轴孔公差配合

    1 轴承公差配合原则 动圈过盈 静圈间隙 2 轴承内圈要拆卸 过渡配合 安装轴承外圈孔的公差H7 G7 K7 3 配套轴承内圈的 轴0 0 005 4 齿轮轴孔配合 齿轮孔H7 齿轮轴不拆的话 0 005 0 008 齿轮轴轻松拆除的话f6
  • tq210-uboot eth dm9000移植

    这个芯片与ok210一样 因此将代码搬过来就ok了 但是使用tftp 启动 TQ210自带的kernel依旧是 Start kerneling 就啥都没有了 启动设置如下 set machid 998 set serverip 192 16
  • MIPI CSI协议

    PCLK 像素时钟 每个时钟对应了一个像素数据 HSYNC 行同步信号 VSYNC 帧同步信号 像素字节转换层 sensor输出的4种数据类型 YUV422 RGB RAW JPEG RGB Data type description 0x
  • 《面试准备》c/c++最少装箱问题(动态规划)

    问题描述 出口质量不等的钻石n颗 至少需要多少个箱子 输入 一个整数m 箱子最大承载重量 一个整数n 钻石的个数 第i颗钻石的质量大小a i 输出 最少需要多少箱子 举例 输入 10 5 4 5 7 3 6 输出 3 c 代码实现 动态规划
  • java8 HashMap

    java8 HashMap 8以前HashMap是用位桶 链表的形式 8以后HashMap是用位桶 链表 红黑树的形式 冲突节点数大于8时 转换成红黑树
  • Spark 架构,计算

    1 架构设计图 2 用户交互方式 1 spark shell spark命令行方式来操作spark作业 多用于简单的学习 测试 简易作业操作 2 spark submit 通过程序脚本 提交相关的代码 依赖等来操作spark作业 最多见的提
  • requests 登陆的几种方法

    一 通过账户名和密码登陆访问 formData username password 需要带 cookies 则带上 cookies res req post url data formData cookies cookies headers
  • sqlite,mysql,access对比

    SQLite是一个小型的桌面型数据库 轻量级的 绿色 开源 轻便 SQLite其实只是一个文件 以及内部格式方案而已 下面做几个简单的对比 SQLite VS 文本文件或二进制文件 他们的本质是相同的 都是一个文件 但是SQLite定义了更
  • Matlab:大小写和空格敏感性

    Matlab 大小写和空格敏感性 Matlab是一种强大的计算机语言 是许多科学家 工程师和其他专业人士使用的首选语言之一 当你开始学习Matlab时 可能会发现它与其他编程语言有些不同 其中一个最显著的区别就是Matlab对大小写和空格的
  • VScode无法启动问题解决思路

    VScode无法启动问题解决 过程 后记 过程 在不知道为什么的情况下 VScode启动没有反应 然后尝试解决问题 进行以下尝试 重启 重装 卸载注册表重装 删除配置重装 均不行 然后本来想打算重装系统了 最后还是接着搞一搞 然后就打算用P
  • MySQL字符集设置

    ERROR 1366 HY000 Incorrect string value错误解决办法 通过命令查看Mysql默认字符集的相关设置 mysql gt SHOW VARIABLES LIKE character Variable name
  • 9.Java面向对象基础(上)

    个人简介 作者简介 大家好 我是W chuanqi 一个编程爱好者 个人主页 W chaunqi 支持我 点赞 收藏 留言 愿你我共勉 没有什么比勇气更温文尔雅 没有什么比怯懦更冷酷无情 文章目录 面向对象 上 1 面向对象的思想 1 1
  • 前端开发工程师

    岗位职责 1 负责网站前端页面的开发工作 2 根据产品需求 分析并给出最优的页面前端结构解决方案 3 与设计师合作完成网站页面前端的特效和最新的应用 4 与产品经理合作完成前端网站交互效果的实现 职位要求 1 掌握各种修图软件 如PS Fi
  • 数据库系统工程师真题及详解(2015~2021)

    2015 2021年软考中级数据库系统工程师真题及答案详解 链接 https pan baidu com s 1VMXyrl1cBX Gwoz0EU Dow pwd nt0a 提取码 nt0a 据了解 考试试题大部分与历年真题相近 祝大家软
  • 计组

    目录 一 知识点 1 寻址方式什么 2 根据操作数所在的位置 都有哪些寻址方式 3 直接寻址 4 立即寻址 5 隐含寻址 6 相对寻址 7 寄存器 8 寄存器 寄存器型 RR 寄存器 存储器型 RS 和存储器 存储器型 SS 9 基址寻址方
  • 类成员函数的重载、覆盖和隐藏区别

    转自 http blog csdn net yanjun 1982 archive 2005 09 02 470405 aspx 这三个概念都是与OO中的多态有关系的 如果单是区别重载与覆盖这两个概念是比较容易的 但是隐藏这一概念却使问题变
  • 理清概念:同步与异步

    广义的同步与异步 在广义上 同步和异步是描述两个或多个事件 操作或进程之间的关系 同步意味着事件 操作或进程是有序的 一个操作必须在另一个操作完成后开始执行 异步则意味着事件 操作或进程是独立的 可以在不等待其他操作完成的情况下开始执行 同
  • CentOS7 RPM包管理功能总结及示例

    RPM是红帽软件包管理器 主要用来对RPM包进行安装 升级 卸载 查询 校验和数据库维护的管理操作 安装 语法 rpm i install install options PACKAGE FILE i 安装一个新包 PACKAGE FILE
  • 关于C#中get和set

    转自 http blog sina com cn s blog 82526aa60100txtx html 在程序中经常碰到get set 不甚明白 在网上查询时也说的迷迷糊糊 所以整理下 以学的明白透彻点 有两个类person publi