C# GET 和 SET作用

本文深入解析C#中的属性概念,详细解释GET和SET的区别与应用场景,包括如何通过属性进行数据安全控制及访问权限管理。通过实际代码示例,展示属性在类设计中的优势。

C#中get和SET,看来看去还是看不懂,通俗一点解释一下,用了有什么好处,不用会怎么样
如果你这样写是没有什么不一样的. 
private int __Old; 
public int Old{ 
get{return __Old;} 
set{__Old = value;}
 

}

但是如果你这样写就不一样了. 
private int __Old; 
public int Old{ 
get{return __Old;} 
set{// 这里加入了验证代码 
if(value<0) 
throw new ArgumentOutException("value", "输入值不能小于0"); 
__Old = value; 
}

上面的例子说明属性中可以添加些代码进行处理. 也可以设置的访问的权限等.


在类中定义一个属性 
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 作用

原文地址:http://www.cnblogs.com/yinxiangpei/articles/2357091.html

<think>嗯,用户这次问的是C#getset作用,这是个基础但重要的概念。从用户引用的资料看,他可能正在学习C#的事件处理或图形编程,但当前问题聚焦在属性访问器上。用户引用的材料里提到事件处理需要匹配委托签名,这属性的get/set其实有相似之处——都是对数据访问的封装。用户似乎喜欢结合代码示例理解概念,上次回答快速排序时也提供了Python代码,这次也应该用C#代码演示。注意到用户提供的引用[1]提到事件处理器的参数传递,这让我想到可以类比说明:就像事件需要特定签名的方法来处理,属性也需要特定格式的get/set来封装字段。不过回答时不能偏离用户核心问题。用户可能是初学者,因为get/set是OOP的基础概念。需要避免用“访问器”这样的术语直接砸过去,得先讲场景:为什么需要get/set?比如直接暴露字段会有啥风险(如无效赋值),再用封装思想自然引出访问器。上次回答结构采用“解释原理→代码示例→常见用法”的递进结构效果不错,这次也可以沿用:1.先抛个现实问题(不封装字段的坏处)2.用对比代码展示直接访问字段vs使用属性3.重点讲set的value隐参get的返回值特性4.补充自动属性语法糖,毕竟现在没人写完整字段+属性了特别注意要区分方法属性!用户问的是get/setfunction,但严格来说它们是属性访问器而非方法。这个术语混淆点必须澄清,否则可能误导后续学习。另外用户引用了SDL/SFML等图形库的资料,虽然当前问题无关,但暗示他可能在开发图形应用。稍后生成的问题可以往这个方向延伸,比如“在游戏开发中如何用属性封装角色血量”。</think> C# 中的 `get` `set` 是**属性(Property)** 的核心组成部分,用于安全、可控地访问类的私有字段。它们通过封装字段实现了数据访问的控制逻辑,是面向对象编程中封装性的重要体现。以下是详细解释: --- ### **核心作用** 1. **封装字段** 避免直接暴露类的内部数据字段(通常声明为 `private`),转而通过属性控制读写权限。 ```csharp private string _name; // 私有字段 public string Name // 公开属性 { get { return _name; } // 读取字段 set { _name = value; } // 设置字段 } ``` 2. **控制读写逻辑** - `get`:定义读取字段时的逻辑(如格式转换、权限验证)。 - `set`:定义写入字段时的逻辑(如数据验证、事件触发)。`value` 是隐式参数,代表传入的值。 ```csharp private int _age; public int Age { get => _age; set { if (value < 0) // 验证数据有效性 throw new ArgumentException("Age cannot be negative."); _age = value; } } ``` 3. **自动属性(Auto-Implemented Properties)** 若无需额外逻辑,可用简写语法(编译器自动生成私有字段): ```csharp public string Email { get; set; } // 可读写 public Guid Id { get; } // 只读(只能在构造函数赋值) ``` --- ### **应用场景** 1. **数据验证**(通过 `set` 实现) 确保数据合法性(如范围检查、格式校验)。 2. **只读/只写控制** - `public int X { get; private set; }`:外部只读,类内可写。 - `public string Key { private get; set; }`:外部只写(较少用)。 3. **惰性加载(Lazy Initialization)** 首次访问时初始化资源: ```csharp private List<string> _data; public List<string> Data { get { _data ??= LoadData(); // 若为空则初始化 return _data; } } ``` 4. **触发事件** 属性变化时通知其他组件(如实现 `INotifyPropertyChanged`): ```csharp public string Name { get => _name; set { _name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name))); } } ``` --- ### **与方法的区别** | 特性 | 属性(Property) | 方法(Method) | |--------------------|----------------------------------|--------------------------------| | **语法** | 类似字段(无括号) | 需括号参数列表 | | **用途** | 访问对象状态 | 执行操作或计算 | | **逻辑复杂度** | 通常用于简单读写 | 可包含复杂逻辑 | | **性能** | 编译器优化为内联 | 可能涉及调用开销 | > ✅ 优先用属性:当行为是简单数据访问时(如 `obj.Name`)。 > ❌ 使用方法:当行为是耗时操作(如数据库查询)或需要参数时。 --- ### **代码示例** ```csharp public class Person { private int _age; public int Age { get => _age; set => _age = value >= 0 ? value : throw new ArgumentException("Invalid age"); } // 自动属性 public string Name { get; set; } = "Unknown"; } // 使用示例 var person = new Person(); person.Age = 25; // 通过 set 写入 Console.WriteLine(person.Age); // 通过 get 读取 ``` --- ### **与事件委托的关系** 如引用 [^1] 所述,事件处理需匹配委托签名。类似地,属性的 `get`/`set` 也通过特定语法规范数据访问。但两者用途不同: - **事件处理**:关注对象间通信(如按钮点击)。 - **属性**:关注对象内部状态的封装。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值