【问题标题】:Making a property in C# with Lambda expressions including a condition [duplicate]使用包含条件的 Lambda 表达式在 C# 中创建属性 [重复]
【发布时间】:2021-07-18 15:21:51
【问题描述】:

我开始学习 C#,我想知道如何使用 Lambda 表达式改进属性。

我知道如何将它用于“获取”而不是“设置”。

我现在是怎么做的:

public string Name
            {
                get => name;
                set
                {
                    if(value.Trim().Length >= 1) { name = value; }
                    else
                    {
                        characterCount--;
                        throw new Exception("Error : Character name is invalid");                        
                    }
                }
            }

以下答案将帮助我更多地了解它们!

【问题讨论】:

  • 您可以将您的验证包装到一个方法中并像这样使用它set => name = YourMethod()
  • 提示:x.Trim().Length 可能涉及分配;如果您只想知道其中是否有一些非空白字符,请考虑string.IsNullOrWhitespace(x)

标签: c# lambda properties try-catch throw


【解决方案1】:

Lambda 表达式的本意就是:表达式;您的代码包含多个语句:不是单个表达式,因此:不要尝试将其压缩到 lambda 中。 {...} 方法没有任何问题 - 它清晰、可读、可维护等。别管它!

注意,您可以使用“when”来折磨“switch 表达式”来强制执行条件以获得成功案例,如果 switch 表达式为抛出异常,并将switch表达式的结果赋给字段;从技术上讲,它会为集合使用 lambda 并保持您的意图,但 IMO 会降低可读性。所以:不要那样做!

您的目标不应该是编写聪明的代码 - 应该是编写清晰明了的代码。你已经拥有了。

注意:我没有在 characterCount--; 上制作任何 cmets - 这听起来像是一个非常奇怪的副作用,并且可能是一件坏事。

但是(完全未经测试,纯粹是为了说明):

public string Name
{
    get => name;
    set => name = value switch {
        string s when !string.IsNullOrWhitespace(s) => s,
        _ => throw new Exception("Error : Character name is invalid"),
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2013-04-05
    • 1970-01-01
    • 2016-04-18
    相关资源
    最近更新 更多