首页 > 解决方案 > 是否可以应用 => 运算符来替换 get { return (string)GetValue(ParamProperty); }

问题描述

我不清楚 C# 中的 => 运算符是如何工作的,希望得到一些建议。

我已经看到它在获取和设置后使用。

有人可以告诉我,我可以在这段代码中使用该运算符吗:

public static readonly BindableProperty ParamProperty =
            BindableProperty.Create(
                nameof(Param),
                typeof(string),
                typeof(GridTemplate),
                default(string));

public string Param
{
   get { return (string)GetValue(ParamProperty); }
   set { SetValue(ParamProperty, value); }
}

标签: c#

解决方案


基本上, Expression body 成员只是完成常规任务的捷径。它们“可以”使您的代码看起来更干净,并保存可打印的字符。不过,除了表示它们的语法糖之外,它们并没有什么特别之处。

你可以在这里阅读更多关于它们的信息。另外,我已经总结和浓缩了信息,并添加了一些胡椒和盐来调味

表达式体成员(C# 编程指南)

表达式主体定义让您以非常简洁易读的形式提供成员的实现。只要任何受支持成员(例如方法或属性)的逻辑由单个表达式组成,您就可以使用表达式主体定义。

方法

表达式体方法由一个表达式组成,该表达式返回一个类型与方法的返回类型匹配的值,或者,对于返回 void 的方法,它执行某些操作。

public void DisplayName() => Console.WriteLine(ToString());

// equivalent 

public void DisplayName()
{
    Console.WriteLine(ToString())
}

构造函数

构造函数的表达式主体定义通常由单个赋值表达式或处理构造函数参数或初始化实例状态的方法调用组成。

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   // equivalent 

   public Location(string name)
   {
       Name = name;
   }   

终结者

终结器的表达式主体定义通常包含清理语句,例如释放非托管资源的语句

public class Destroyer
{
   public override string ToString() => GetType().Name;

   ~Destroyer() => Console.WriteLine($"The {ToString()} destructor is executing.");

   // equivalent 

   ~Destroyer()
   {
       Console.WriteLine($"The {ToString()} destructor is executing.");
   }
}

属性获取和设置语句

如果您选择自己实现属性 get 访问器,则可以将表达式主体定义用于简单地设置或返回属性值的单个表达式。

public string Name
{
   get => locationName;
   set => locationName = value;
} 

// equivalent 

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

只读属性

PropertyName => returnValue;

// equivalent 

public string Name
{
   get 
   {
       return someValue;
   }
}

索引器

与属性类似,如果 get 访问器由返回值的单个语句组成,或者 set 访问器执行简单的赋值,则索引器的 get 和 set 访问器由表达式主体定义组成。

public string this[int i]
{
   get => types[i];
   set => types[i] = value;
}

// equivalent 

public string this[int i]
{
   get
   {
       return types[i];
   }
   set
   {
       types[i] = value;
   }
}

也不要与自动实现的初始化属性混淆

C# 自动实现的初始化属性

public string Name { get; set; } = "Joe";

这基本上就像在构造函数中设置属性一样


推荐阅读