C#中get和set
释一:
属性的访问器包含与获取(读取或计算)或设置(写)属性有关的可执行语句。访问器声明可以包含 get 访问器或 set 访问器,或者两者均包含。声明采用下列形式之一:
get {}
set {}
get 访问器
get 访问器体与方法体相似。它必须返回属性类型的值。执行 get 访问器相当于读取字段的值。以下是返回私有字段 name 的值的 get 访问器:
private string name; // the name field
public string Name // the Name property
{
get
{
return name;
}
}
当引用属性时,除非该属性为赋值目标,否则将调用 get 访问器读取该属性的值。例如:
Employee e1 = new Employee();
...
Console.Write(e1.Name); // The get accessor is invoked here
get 访问器必须在 return 或 throw 语句中终止,并且控制不能超出访问器体。
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 Car
{private string color;
public string Color
{
get
{return color;
}
set
{color=value;
}
}
}
我的理解是:通过GET和SET对公有变量Color进行读写操作,实际就是间接更改color私有变量的值,那既然如此。为何不设color为public,让实例进接对color进行读写操作呢?
如果有一天,老板让你把这个类改成
当汽车的颜色改变时,同时计算一下汽车的《价格》属性
那么如果直接对Color操作,你不是死定了?
“属性”是.net的特色之一。
其实就相当于方法,尤其是java中经常会用到get、set方法(.net的有些思想就是java的)。
属性的真实作用不只是为了更改某个成员变量的值
比如form的size属性在set的同时要重画form,如果你不想让用户对color修改,就不要提供set方法
是面向对象具有的
set and get
它的用途: 一般是对类里面的变量进行操作. 而不是直接对类的变量进行操作.
有一个很大的作用就是: 便于维护.
因为:
如果一个类的一个变量int a ,在其它包或命名空间类中使用了1000次,但是过了许久,你想把a改为b,
如果直接对变量a操作的话,就得需求修改整个程序的1000处. 如果用属性了,就不会了,只需改这个方法即可
public int A
{
set
{
a = value;
}
get
{
return a;
}
}
放为:
public int B
{
set
{
b = value;
}
get
{
return b;
}
}
除去这个属性之外的地方根本不需要改变
通过上面的讲解。有一点点明白了。
是不是让满足一定条件让GET和SET来改变类中的私有变量。而不能让实例直接操作。像上面的代码保证了color属性的安全性。
既然如此可不可以写成
set
{color=value*; //value是不是相当于Color的值
}
我当初和你有一样的想法.但是现在改变了。
举个例子说明一下吧.
public class Car
{ public string Color
{
get
{
if(this.viewstate["color"]!= null)
{
return this.viewstate["color"];
}
return "":
}
set
{
this.viewstate["color"];=value;
}
}
}
在asp.net中通常这么使用.如果用变量的话就不好使用了。而且get,set中可以写多个语句.如上的get.
不知道这样解释你满意吗?
C#中get和set的更多相关文章
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- mapreduce中一个map多个输入路径
package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- .NET Core中的认证管理解析
.NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- 关于CryptoJS中md5加密以及aes加密的随笔
最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...
- In-Memory:在内存中创建临时表和表变量
在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
随机推荐
- 6 关于plsql中文显示乱码问题
打开plsql查看数据表时,会看到中文显示乱码问题 解决方案 输入下图所示语句并运行 在输入下图所示语句并运行,查看第一行和第九行是否对应 3)查看下环境变量的设置,查看是否有变量NLS_LANG,没 ...
- juqery 回车事件 回车操作 回车搜索
html <form class="search_wrap" method="post" action=""> <div ...
- python全栈开发 * 进程理论 进程创建 * 180724
一.进程理论 1.进程是资源分配的最小单位. 2.进程调度就是多个进程在操作系统的控制下被CPU执行,去享用计算机的资源. 先来先服务 短作业优先 时间片轮转 多级反馈队列 3.进程调度的过程是不能够 ...
- qt ShaderEffect上的ShaderToy
https://zhuanlan.zhihu.com/p/38942460 发现这个挺好玩,有空学习一下
- 图->有向无环图->拓扑排序
文字描述 关于有向无环图的基础定义: 一个无环的有向图称为有向无环图,简称DAG图(directed acycline graph).DAG图是一类较有向树更一般的特殊有向图. 举个例子说明有向无环图 ...
- Fiddler (进阶)内置命令与断点
Fiddler 内置命令与断点 命令 对应请求项 介绍 示例 ? All 问号后边跟一个字符串,可以匹配出包含这个字符串的请求 ?google > Body 大于号后面跟一个数字,可以匹配出请求 ...
- Python3下载图片的方法
1 第一种 from urllib import request request.urlretrieve(s, './图片1.jpg') # 第一种 # s是图片的网络地址,./图片1.jpg,是图片 ...
- Python cffi学习(二)
上篇文章中讲到Python中调用外部c文件可以有两种方法,一是使用cffi.verify()的形式使用,但是该种方式仍然需要进行函数声明.二是将外部c文件编译成为函数库,然后通过cffi进行使用. 由 ...
- opencv 进行图像的花屏检测(模糊检测)
参考: https://www.pyimagesearch.com/2015/09/07/blur-detection-with-opencv/ https://www.cnblogs.com/ark ...
- Spark共享变量(广播变量、累加器)
转载自:https://blog.csdn.net/Android_xue/article/details/79780463 Spark两种共享变量:广播变量(broadcast variable)与 ...