C#中get和set不带参数

本文介绍C#中GetSet的概念及其用途,通过示例解释如何使用GetSet来扩展域的功能,并展示了在赋值操作时如何利用GetSet进行更复杂的逻辑处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

get set是用来扩展域的,也就是C里的变量,只是用起来更加灵活而己。看以下代码: 
using System; 
public class cls 
{ 
private int book;//定义一个域(也可以叫变量,只是面向对像里都这么叫,使用起来也更加方便) 
public int Book 
{ 
get 
{ 
Console.WriteLine("dsf"); 
return book; 

} 
set 
{ 
Console.WriteLine("aaa"); 
book=value; 

} 
} 
public static void Main() 
{ 
cls obj = new cls(); 
obj.Book = 120; //注意这一句 
Console.WriteLine(obj.Book); 
} 

} 


运行结果为: 
aaa 
dsf 
120 
也就是先把120赋值给value(相当一个存储空间),然后再用get{}返回给Book,实际上也就是一次改变变量值的过程。 
那你也许会问为什么要这么复杂呢?因为这是用了嵌套,所以可以更加方便的写入其它语句,在以后你就应该学到了。 
如果没有: 
obj.Book = 120; 
请想一想会是什么结果呢? 
只是一个取值过程:get{}而没有执行set{} 
结果为: 
dsf 
<think>我们正在处理用户的问题:了解C#中Action的getset用法。注意,用户的问题是关于Action委托的getset用法,这通常与属性无关,因为Action委托本身并直接支持getset。我们需要澄清这一点。首先,Action委托是一个预定义的委托类型,用于封装一个没有返回值的方法(或者有多个参数的方法)。它通常用于事件回调。在C#中,委托类型本身并具有getset方法,但是我们可以讨论如何将Action委托作为属性(property)的类型,从而在属性上实现getset访问器。因此,我们可以这样解释:1.我们可以定义一个属性,其类型为Action委托(例如Action或Action<T>等)。2.然后,我们可以为该属性提供getset访问器,以便获取或设置该委托实例。示例:我们可以定义一个类,其中包含一个类型为Action的属性。这个属性可以像其他属性一样被赋值(设置)读取(获取)。另外,需要注意的是,用户可能混淆了委托(Delegate)属性(Property)的概念。属性是类成员的访问器,而委托是一种引用方法的类型。下面是一个示例代码,展示如何定义一个Action类型的属性,并实现其getset:```csharppublicclassMyClass{//定义一个私有的Action委托字段privateAction_myAction;//定义一个公有的Action属性,包含getsetpublicActionMyActionProperty{get{return_myAction;}set{_myAction=value;}}//使用这个属性:设置一个方法,然后调用publicvoidUseAction(){if(MyActionProperty!=null)MyActionProperty();}}//使用示例:classProgram{staticvoidMain(){MyClassobj=newMyClass();//设置属性(set)obj.MyActionProperty=()=>Console.WriteLine("Hello,Action!");//获取属性(get)并调用Actionaction=obj.MyActionProperty;action();//输出:Hello,Action!//或者通过UseAction方法调用obj.UseAction();}}```在上面的例子中,我们定义了一个名为MyActionProperty的属性,其类型为Action(无参数且无返回值)。该属性具有getset访问器,分别用于返回设置私有字段_myAction。用户可能还想知道如何为带有参数的Action定义属性。例如,使用Action<T>:```csharppublicclassMyClass<T>{privateAction<T>_actionWithParam;publicAction<T>ActionWithParamProperty{get{return_actionWithParam;}set{_actionWithParam=value;}}publicvoidUseAction(Tparam){if(ActionWithParamProperty!=null)ActionWithParamProperty(param);}}```因此,我们实际上是在讨论如何将委托类型作为属性的类型,并通过getset访问器来管理委托实例。另外,需要注意的是,委托类型是引用类型,所以属性实际上是对委托实例的引用。我们可以通过属性来获取或设置这个引用。最后,我们根据要求生成相关问题。注意:在回答中,我们引用了用户提供的引用[1],但该引用是关于自定义委托(SingletonDelegateWithNoParameter)的,与Action委托有相似之处,但Action是预定义的。我们可以适当提及用户提供的引用,以展示自定义委托也可以有类似的属性用法。但是,用户的问题明确是关于Action的,所以我们以Action为主。因此,我们在回答中可以这样提及引用[1]:类似地,如引用[1]所示,自定义委托也可以作为属性的类型,并通过getset访问器进行管理[^1]。现在,按照要求组织回答。</think>### C#中Action委托的get/set用法详解 在C#中,`Action`委托本身**直接支持get/set操作**,但可通过以下方式间接实现类似功能: #### 1. 将Action作为属性封装(最常见用法) ```csharp public class EventHandler { private Action _onEvent; // 私有委托字段 // 属性封装(get/set) public Action OnEvent { get => _onEvent; set => _onEvent = value; } public void TriggerEvent() { _onEvent?.Invoke(); // 安全调用 } } // 使用示例 var handler = new EventHandler(); handler.OnEvent = () => Console.WriteLine("事件触发!"); // set赋值 handler.TriggerEvent(); // 输出: "事件触发!" ``` #### 2. 自定义委托类型(类似引用[1]做法) ```csharp // 自定义带get/set的委托容器 public class ActionContainer { public Action Value { get; set; } // 直接属性封装 } // 使用 var container = new ActionContainer(); container.Value = ShowMessage; // set Action currentAction = container.Value; // get currentAction(); void ShowMessage() => Console.WriteLine("Hello"); ``` #### 3. 委托组合(多播委托) ```csharp Action baseAction = () => Console.Write("基础操作"); Action customAction = () => Console.Write(" + 自定义操作"); // 通过+=/-=实现类似"set"的效果 baseAction += customAction; // 添加操作 baseAction(); // 输出: "基础操作 + 自定义操作" baseAction -= customAction; // 移除操作 ``` #### 关键说明: 1. **Action本质**:预定义的无返回值委托(`public delegate void Action()`) 2. **get/set原理**:通过属性封装委托实例 3. **线程安全**:多线程环境需加锁: ```csharp private readonly object _lock = new object(); public Action SafeAction { get { lock(_lock) return _action; } set { lock(_lock) _action = value; } } ``` 4. **典型应用场景**: - 事件处理系统(如UI事件订阅) - 插件架构的回调机制 - 异步操作完成通知 > 类似引用[1]中自定义委托的模式,`Action`可通过属性包装实现get/set语义[^1]。引用[2]展示的属性标记方法也可应用于委托属性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值