ASP.NET MVC/C#: 我能在一行C#条件语句中避免重复吗?

16 浏览
0 Comments

ASP.NET MVC/C#: 我能在一行C#条件语句中避免重复吗?

在视图中显示客户邮寄地址表格时,考虑以下我使用的代码:\n<%: Customer.MailingAddress == null ? \"\" : Customer.MailingAddress.City %>\n\n我发现我经常使用这些三元条件语句,我想知道是否有一种方法可以引用回在条件中评估的对象,以便我可以在表达式中使用它。也许类似这样的东西:\n<%: Customer.MailingAddress == null ? \"\" : {0}.City %>\n\n这样的东西存在吗?我知道我可以创建一个变量来保存该值,但是将所有内容保持在视图页面的一个紧凑的语句中会更好。谢谢!

0
0 Comments

ASP.NET MVC/C#: 如何避免在一行C#条件语句中重复自己?

在这个问题中,有人提出了一个解决方法,即在Customer对象上创建一个包含该条件的属性,并直接调用它。例如:

Customer.FormattedMailingAddress

尽管我无法提供代码示例,但你只需要将相同的条件放在`get{}`中即可。

我同意这是一个不错的方法,但我想知道是否有可能实现我提出的要求,即对于不想添加额外属性的情况。

在我的项目(.net4和mvc2)中,我们遵循了我所描述的模式,并且在对象自身上完成所有这些(显示字符串格式化)工作。我喜欢在视图中直接调用属性,而不用担心视图本身的任何不必要的逻辑。当然,这是一个品味的问题,希望我的建议能够帮上忙。

我还应该说的是,这意味着当一个属性在多个视图中使用时,它保留相同的“格式化”(即在一年后开发的页面上,它不会对相同字段使用不同的逻辑,产生不同的字符串,除非是故意的:))。

补充一下讨论内容:我已经创建了一个名为`AddressString()`的扩展方法,可以在任何地址对象上调用,以检查空值并正确格式化它。我只是对C#条件运算符本身感到好奇。再次感谢你的额外建议!

值得一提的是,我和Dave的观点一致:视图不应该担心它们接收到的值是否有效;这就是V和M之间的中间逻辑的作用(无论是C、VM还是其他方式)。但是对于 ?: 本身感到好奇也没有错!

噢,没关系,我很高兴能够给出一个稍微不同的观点,即使它已经被考虑过了 🙂

0
0 Comments

ASP.NET MVC/C#: 如何避免在一行C#条件语句中重复自己?

在ASP.NET MVC/C#开发中,有时候我们需要在条件语句中进行判断,但是希望能够避免重复相同的代码。下面介绍了一种解决方法,以及讨论了其他一些可能的解决方案。

首先,我们可以使用??运算符来进行与null的比较。例如,如果我们想要判断Customer.MailingAddress是否为null,并根据结果返回一个空字符串,我们可以使用以下代码:

Customer.MailingAddress ?? "";

这样可以避免使用条件运算符?:来重复判断Customer.MailingAddress是否为null。

另一种解决方法是创建一个扩展方法。下面是一个示例:

public static TValue GetSafe<T, TValue>(this T obj, Func<T, TValue> propertyExtractor)
where T : class
{
    if (obj != null)
    {
        return propertyExtractor(obj);
    }
    return null;
}

使用这个扩展方法,我们可以按照以下方式来使用:

Customer.GetSafe(c => c.MailingAddress).GetSafe(ma => ma.City) ?? string.Empty

这种方法通过链式调用扩展方法来避免了重复的条件语句,使代码更加简洁。

然而,有些人认为这种方法还是有些复杂,而且需要额外的代码和语法。他们认为,使用两个"get safe"方法和一个null合并运算符并不是很实用。

讨论中还提到了其他一些解决方案,例如使用以下代码:

Customer != null ? (Customer.MailingAddress != null ? Customer.MailingAddress.City : string.Empty) : string.Empty

这种方法可以实现相同的功能,但是代码量更大,可读性较差。

解决这个问题的关键是找到一种方法来避免重复代码,使代码更加简洁和易读。上述介绍的方法可以作为一种解决方案,但是也可以根据具体情况选择其他的方法来实现相同的目的。

0
0 Comments

ASP.NET MVC/C#: 如何避免在一行C#条件语句中重复自己?

在C#中,没有办法在不创建变量或重复自己的情况下做到你所要求的,但是你可以像下面的代码一样做:

(Customer.MailingAddress ?? new MailingAddress()).City ?? string.Empty

这假设一个新的MailingAddress默认情况下其城市属性/字段为null。

如果创建一个新的MailingAddress会将城市字段/属性初始化为空字符串,那么可以去掉最后一个空合并。

但是这并没有变得更短,而且更加hackish(在我看来),而且几乎肯定性能更差。

+1 不是因为我会用它,而是我喜欢它的链式用法 🙂

我不认为这实际上能实现OP想要的功能。如果Customer.MailingAddress不为null,那么语句的结果是Customer.MailingAddress对象本身,而不是对象本身的City属性。

Porad:那不是真的。第一个括号块的结果始终是可解引用的MailingAddress。然后我们获取该MailingAddress的City属性/字段(如果需要,使用空合并)。

接受这个回答是因为它的直接和奇特的例子。

你是对的。我读错了,而且忽略了括号。我记得看到第一个括号时,我以为可能是一个拼写错误或复制/粘贴错误,因为我没有看到匹配的结束括号。

以上是在Stack Overflow上关于ASP.NET MVC/C#中如何避免在一行C#条件语句中重复自己的问题的一些回答和讨论。在问题中,提问者想要在一行代码中避免重复自己。然而,根据回答者们的讨论,他们一致认为在不创建变量或重复自己的情况下是无法做到的。他们提供了一种可能的解决方案,即使用空合并运算符(??)来检查对象的属性或字段是否为null,并在需要时提供默认值。然而,这种解决方案并不是更短或更高效的方法,而且有些回答者认为这种做法更加hackish。他们建议尽量避免在一行代码中过度复杂的条件语句,而是通过创建变量或拆分语句来提高代码的可读性和维护性。

0